Your own words on the busy line while Claude works, in place of Baking, Brewing and the rest.

Your own words on the busy line. While Claude works, Claude Code shows a little word that pulses, such as ✶ Baking… (12s). Bumper Sticker swaps that word for yours.
/plugin, find Bumper Sticker, and type your words into Your words, separated by commas: Revving, Idling, Drifting.It changes only the word. The timer, the token count and the colour stay as Claude Code draws them. It works in the terminal and in the desktop app. Nothing leaves your machine.
Nothing goes anywhere. Here is each thing, plainly.
What it sends, and where.
Which programs it runs, and why.
What it puts in the prompts it submits.
What each hook does.
ui.render for Spinner: swaps the busy word for one of yours. It changes only the word.See every Rostech mod, live, at rostech.app.
hooks/register.ts 36 lines1import type { Register } from 'claude-code'
2
3// The print-shop set: what a comics press does while you wait.
4export const PRESS: readonly string[] = [
5 'Penciling', 'Inking', 'Lettering', 'Coloring', 'Thumbnailing', 'Plotting',
6 'Scripting', 'Paneling', 'Splashing', 'Cliffhanging', 'Retconning',
7 'Crossing over', 'Rebooting', 'Greenlighting', 'Setting type', 'Kerning',
8 'Halftoning', 'Making ready', 'Inking the rollers', 'Pulling proofs',
9 'Cranking the press', 'Checking the plates', 'Folding', 'Stapling',
10 'Bundling', 'Trucking to the newsstand', 'Racking', 'Counting returns',
11 'Answering fan mail', 'Chasing the craze', 'Haggling with the distributor',
12 'Signing the creator', 'Pitching to Hollywood', 'Licensing',
13 'Climbing the ladder', 'Riding the coaster', 'Becoming a household name',
14]
15
16// "a, b ,c" into ["a", "b", "c"]; empty or missing gives the print-shop set.
17export function wordsFrom(text: unknown): readonly string[] {
18 if (typeof text !== 'string') return PRESS
19 const list = text.split(',').map(w => w.trim()).filter(w => w.length > 0)
20 return list.length > 0 ? list : PRESS
21}
22
23// The same word for the whole turn, a different one next turn. The engine
24// samples its own word once per turn, so that word is the seed: no dice.
25export function pick(list: readonly string[], seed: string): string {
26 let h = 0
27 for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) >>> 0
28 return list[h % list.length]
29}
30
31export const register: Register = (on, options) => {
32 const words = wordsFrom(options.words)
33 on('ui.render', { component: 'Spinner' }, async ($, e, next) =>
34 next({ ...e, props: { ...e.props, word: pick(words, `${e.props.word}|${e.requestId}`) } }))
35}
36