Spinner
Custom Spinner Verbs
Custom Spinner Verbs
While LifeOS works, Claude Code’s spinner doesn’t just show a generic word — it shows a custom animated working-verb with your own vocabulary, icon, color, and animation. It’s a small thing that makes the system feel like yours instead of a stock tool. Alongside the verb, a rotating set of tips surfaces short, current facts about the system while you wait.
Verbs and tips are two distinct features that share Claude Code’s spinner:
- Spinner verbs — the animated working word (“Composing”, “Forging”, “Climbing”) plus its icon, color, and animation.
- Spinner tips — the informational strings that rotate during longer work, kept in sync with the system’s real state.
Spinner verbs
The verb vocabulary and its styling are defined once as customization assets and pushed to the live config.
- Source of truth:
LIFEOS/USER/CUSTOMIZATIONS/Spinner/—verbs.json(the working words),icons.json,colors.json,anims.json, plus aREADME.md. The same vocabulary is mirrored in the settings source so the terminal and the websites say the same words. - Live config:
settings.json→spinnerVerbs.verbs, generated byMergeSettings.tsfromUSER/CONFIG/settings.user.json. Edit the settings SOURCE, never the generated file. - Sync tool (maintainer tree, not in the release payload):
LIFEOS/TOOLS/SyncSpinnerAssets.tscopies verbs/icons/colors/anims from the customization dir to the downstream web projects that render the same spinner. It does NOT writesettings.json— the terminal vocabulary comes from the settings source viaMergeSettings.ts. Its targets are principal-specific, so a public install editsspinnerVerbs.verbsin its own settings source. - Renderer: Claude Code’s own spinner reads
spinnerVerbsandspinnerTipsOverridefromsettings.json.LIFEOS/LIFEOS_StatusLine.shdraws neither.
To change the vocabulary, edit verbs.json in the customization directory, copy the list into spinnerVerbs.verbs in the settings source (USER/CONFIG/settings.user.json) and regenerate settings.json with MergeSettings.ts. On the maintainer tree, also re-run the sync tool so the websites pick it up. Never hand-edit settings.json.
Verbs follow your favorites. themes.json beside verbs.json maps each book or show to the verbs drawn from it. A favorite is a loved title in the MediaTaste database (USER/MEDIA/media.jsonl) or a hand-curated entry rated 8 or higher in USER/BOOKS.md, and each needs at least three verbs built on real in-world terms. The /ic spinner-verbs check blocks when a favorite has fewer, when a theme names a verb that no longer exists, when a dropped or disliked work still has themed verbs, when two verbs differ only in case, or when verbs.json, settings.user.json and settings.json disagree.
Spinner tips
The tips are short informational strings shown during longer operations. They’re kept accurate against the current system — skill counts, hook counts, version strings — by a dedicated maintenance intent.
- Live config:
settings.json→spinnerTipsOverride.tips. - Maintenance: the UpdateTips intent of the release/maintenance skill (
/utwhere that private command is installed; not shipped) re-checks every tip against the system as it is and adds verbs for new favorites./udruns it on every pass, so staleness never outlives a docs update. Without it, editspinnerTipsOverride.tipsin the settings source by hand. - Gate: the maintainer-side
icspinner-tipscheck blocks on source→generated drift, duplicate tips, stale version strings and counts, a tip naming a skill or hook that is gone or a capability in the retirement registry, and a slash command with no tip. It cannot tell when a tip’s sentence went false about a feature that still exists; the/udrefresh and the/ic --deepspinner row cover that.
Examples
Adding a working-verb the right way
Someone wants the statusline to say “Foraging” while long jobs run. The verb vocabulary is a customization asset, so the edit goes to the source first; the live config is derived from it (copy the list into the settings source and regenerate with MergeSettings.ts; the sync tool only feeds the websites):
- Add
"Foraging"(with its icon, color, and animation entries) to the JSON underLIFEOS/USER/CUSTOMIZATIONS/Spinner/. - Add the same word to
spinnerVerbs.verbsin the settings SOURCE (USER/CONFIG/settings.user.json) and regeneratesettings.jsonwithMergeSettings.ts; on the maintainer tree also runSyncSpinnerAssets.tsso the downstream websites pick it up. - Claude Code’s spinner picks it up from
settings.jsonon the next spin.
Editing settings.json directly would work for one session and then get overwritten. The customization dir is the source of truth. The sync tool only mirrors it to the websites; the live config moves by copying verbs.json into the settings source and running MergeSettings.ts, and /ic spinner-verbs blocks until the three copies agree.
When the tips go stale
Verbs are cosmetic; tips make a factual claim — skill counts, hook counts, version strings — so they rot when the system changes underneath them. After adding a skill or cutting a release, the fix is not to hand-edit spinnerTipsOverride.tips; it is to run the UpdateTips intent (/ut where installed; not shipped), which re-audits every tip against the current counts and versions and rewrites the stale ones. Same principle as the verbs: change the system, then run the tool that reconciles the surface to it.
flowchart TD
A[Edit verbs.json in CUSTOMIZATIONS/Spinner] --> B[SyncSpinnerAssets.ts, maintainer-side, to the downstream websites]
A --> B2[Same words in settings.user.json] --> M[MergeSettings.ts]
M --> C[settings.json spinnerVerbs.verbs]
C --> D[Claude Code spinner shows the verb]
E[System changes: new skill, new version] --> F[Run the UpdateTips intent, where the release skill is installed]
F --> G[settings.json spinnerTipsOverride.tips]
G --> D
H[Hand-edit live config] -.->|overwritten on next sync| C
Both halves of the spinner follow one rule: the source of truth is upstream of the live config, and a tool — never a hand edit — reconciles them. The dashed path is the anti-pattern the whole design exists to prevent.
Related
- These render in Claude Code’s own spinner; the statusline (
LIFEOS/LIFEOS_StatusLine.sh) is a separate surface. - Pulse — the Life Dashboard:
LIFEOS/DOCUMENTATION/Pulse/PulseSystem.md - LifeOS maintenance (the UpdateTips intent lives here; its
/utshortcut is private, not shipped): the release/maintenance skill.
