SLOPSHOPPER

stfu

Drops the whimsical word from the line that runs while Claude works and from the one that closes a turn, leaving the elapsed time, tokens and duration where…

newspinner
v0.1.0MITupdated 2026-10-06thefuga/claude-x/mods/stfu
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · stfu
› fix the failing auth test and add an audit log call ⏺ Read(src/auth.ts) ⎿ Read 6 lines ⏺ Update(src/auth.ts) ⎿ Added 2 lines, removed 1 line ⏺ Bash(bun test) ⎿ 3 pass, 1 fail ● Done. refresh now rejects expired claims and logs an audit event. ✻ Worked for 42s · done 4:20 PM ✻ … ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts
README

stfu

Takes the whimsical word out of the line Claude Code draws while it works, and leaves the request data where Claude Code puts it:

✢ Sauteing… (12s · ↓ 300 tokens · thinking)      before
✢   (12s · ↓ 300 tokens · thinking)               after

The line that closes a turn gets a plain verb in place of its word:

✻ Baked for 3s · done 9:01 AM                     before
✻ Worked for 3s · done 9:01 AM                    after

Only the word is replaced. The time, tokens, thinking and effort are still Claude Code's own, drawn in the same place. A message that stands in for the word while a task runs (Running tests…) says what the turn is doing, so it is kept.

Install

claude plugin marketplace add thefuga/claude-x
claude plugin install stfu@claude-x

It has no options: disable it (claude plugin disable stfu@claude-x) to get the words back.

Works with

Anything: it reads and keeps no state, and no other mod draws these lines.

Why a blank and a verb

Claude Code puts its own word back when it is handed an empty one, so the running line gets a space instead, which leaves a few blank cells before the numbers. The closing line always reads <word> for <time>, so an empty word would leave for 3s; Worked reads as a sentence. Both were checked on Claude Code 2.1.291.

Source 1 files
hooks/register.ts 19 lines
1import type { Register } from 'claude-code'
2
3// What stands in for the word. The engine draws its own word again for an empty one, so the running
4// line takes a space; the closing line reads `<word> for 3s`, so it takes a plain verb.
5const BLANK = ' '
6const CLOSED = 'Worked'
7
8export const register: Register = on => {
9  // The line that runs while a turn does (`Sauteing… (12s · ↓ 300 tokens)`): the word and its
10  // ellipsis go, and the engine still draws the time, tokens and thinking after them. A message that
11  // stands in for the word (a task's own `Running tests`) says what the turn is doing, so it stays.
12  on('ui.render', { component: 'Spinner' }, ($, e, next) =>
13    e.props.message === null ? next({ ...e, props: { ...e.props, word: BLANK, suffix: '' } }) : next(e),
14  )
15
16  // The line that closes a turn (`Baked for 3s`).
17  on('ui.render', { component: 'TurnDuration' }, ($, e, next) => next({ ...e, props: { ...e.props, word: CLOSED } }))
18}
19