You turn a finished brand into a Claude Code mod: while Claude works, the terminal and the desktop app show the brand's colors, words and logo. You never ship it blind. You show it in HTML, get approval, then generate.
Before You Start
Load the brand package first. Look for brand.yaml (in ./, ./brand/, or brands/<slug>/);
read it, identity.md (palette) and voice.md (vocabulary) from the same folder. No package yet?
Run brand-init, then brand-identity and brand-voice. You need at least a primary color and an
SVG logo.
Confirm the team uses Claude Code (the terminal, or the Code tab of the desktop app). Mods are Claude Code plugins; they don't run in Cursor, claude.ai chat, or other agents. Ask; don't assume.
Steps
- Write
mod.jsonin the brand package (schema in the docstring ofscripts/brand-mod.py):primaryfromidentity.md(the script derives an 8-tone scale for the glint), orstopsif the brand already has its scale.logo_svg(color logo: desktop app, light theme) andlogo_light_svg(light logo: terminal and desktop dark theme) fromassets/.wordsper turn phase anddonefor the end of turn — see Words below.name,slugand the domain come frombrand.yaml; don't repeat them.
- Generate:
python3 scripts/brand-mod.py <package>/mod.json --media --checkWrites<package>/mod/<slug>-spinner/: the installable plugin (also its own marketplace),preview.html, aREADME.mdwith the GIFs first, andmedia/.--medianeedsagent-browserandffmpeg;--checkrunsclaude plugin validateandclaude plugin test. Both are optional; withoutrsvg-convertthe terminal gets no logo. - Show it: open or share
preview.html(two windows: Ghostty and the desktop app, light/dark toggle, "inside herdr" toggle). If your host can publish HTML pages (e.g. Claude Artifacts), publish it and hand over the link. - Approval gate: the owner approves the preview or asks for changes. Changes go into
mod.jsonand you regenerate. Never edithooks/brand.tsby hand, and never install or ship before approval. - Ship: the generated folder goes into a repo. Its README carries the install steps and the
/<slug>-spinner on|offcommand. Setartifacts.mod: trueinbrand.yaml.
Words
- Gerunds the team actually says, in their language: 3–6 per phase (
thinking,tool-use,tool-input,responding,requesting). Pull them fromvoice.md(vocabulary, tone), not from puns on the brand name. - Cut anything nobody says. In testing, invented phrases ("herding subagents", "big-braining") and brand puns ("Cofounded") read as forced the moment people saw them.
- The end of turn reads « for 12s» (the engine adds "for"): past participles work ("Shipped", "Cooked").
- Have someone on the team read the list before shipping.
What the mod does
- Terminal: a 2×2 square of three cubes with a turning gap, then the phase word; one glint in the brand scale crosses the square and the word. The logo sits at the right edge in Ghostty or kitty run directly (kitty graphics); in herdr, tmux, zellij or screen there is no logo and no stand-in.
- Desktop app (Code tab): the logo with a soft SMIL sweep, color logo on light themes and the light one when the OS is dark, and the word in one readable color.
- End of turn: the brand's
donewords instead of "Baked". /<slug>-spinner offbrings back Claude Code's own spinner and is remembered.
Design decisions and the failures behind them: method.md. Worked example:
examples/cofoundy/ (package, mod.json, generated mod with its README).
Related skills
- brand-identity — the palette and logo direction this skill reads.
- brand-voice — the vocabulary the spinner words come from.
- brand-guidelines — add the mod's preview to the brand book's applications section.