Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"theme": { "type": "string", "title": "Theme", "description": "Theme name: glowup, aurora, dusk, classic, cyberpunk, vaporwave, high-contrast, or one in ~/.claude/glowup/themes", "default": "classic" },
"reducedMotion": { "type": "boolean", "title": "Reduced motion", "description": "No shimmer or spinner animation from glowup", "default": false },
"pack": { "type": "string", "title": "Pack", "description": "Pack name: classic, crt, cozy, arcade, or one in ~/.claude/glowup/packs", "default": "classic" },
"spinner": { "type": "string", "title": "Spinner", "description": "Spinner name: stock, comet, eyes, orb-states, clawd, shimmer, or pack for the pack's own", "default": "pack" },
"spinner": { "type": "string", "title": "Spinner", "description": "Spinner name: stock, comet, eyes, orb-states, clawd, shimmer, scanline, ring, glitch, signal, or pack for the pack's own", "default": "pack" },
"pet": { "type": "string", "title": "Pet", "description": "clawd, robot, off, or a pet in ~/.claude/glowup/pets", "default": "clawd" },
"bubbles": { "type": "string", "title": "Speech bubbles", "description": "on (template lines), off, or haiku (Claude Haiku writes some lines; small paid calls on your account)", "default": "on" },
"statusline": { "type": "string", "title": "Status line fields", "description": "Comma-separated, in order: activity, ctx, 5h, week, cost, model, effort, agents, plan, branch, changes, cwd", "default": "activity,ctx,effort,5h,week" }
Expand Down
4 changes: 2 additions & 2 deletions .docket/ledger.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@
{"answers": ["q7"], "author": "claude-code", "branch": "main", "cost_if_wrong": "The Konami egg is built on a key path that does not reach the mod", "depends_on": [], "evidence": [], "id": "c13", "kind": "claim", "migrated_from": "c108", "pinned": false, "rationale": "tmux spike with a throwaway mod (scratchpad/keyspike): after an SGR mouse click on the Client, ↑↑↓↓←→←→BA arrived as all ten keys; without the click, b and a landed in the prompt", "revisit": "A Claude Code release changes Client focus or onKey", "schema": 3, "scope": [], "session": "", "state": "accepted", "supersedes": [], "supports": [], "text": "On Claude Code 2.1.291 a Client's surface.onKey receives arrow keys (up, down, left, right) and letters once the person clicks the Client; before a click the keys go to the prompt, and Escape returns the focus", "ts": "2026-10-07T06:40:08+00:00"}
{"alternatives": ["Crack overlays on one sheet", "Typing konami at the prompt to open a code dialog"], "answers": [], "author": "claude-code", "branch": "main", "choice": "Click Clawd's pet Client (it hops), type up up down down left right left right b a; the Client matches locally and posts once; the egg is a hidden built-in pet with four hand-drawn sheets, one per crack stage, cracking every 10 passing runs to stage 3", "cost_if_wrong": "Four sheets of art for one egg, and the code needs a terminal with mouse events", "decided_by": "owner", "depends_on": [], "evidence": [], "id": "d85", "kind": "decision", "migrated_from": "d109", "pinned": false, "rationale": "Owner picked 3 stages of 10 runs, full sheets per stage so cracks tilt with the wobble, and a hop on click with a quiet code", "revisit": "", "schema": 3, "scope": ["hooks/client/pet.tsx", "hooks/eggs.ts"], "session": "", "state": "adopted", "supersedes": [], "supports": [["c13"]], "text": "The Konami egg unlocks from a click on Clawd and the code typed into his Client", "ts": "2026-10-07T07:02:03+00:00"}
{"answers": [], "author": "claude-code", "branch": "feat/konami-egg", "cost_if_wrong": "", "depends_on": [], "evidence": [], "id": "q12", "kind": "question", "migrated_from": "q110", "pinned": false, "rationale": "", "revisit": "", "schema": 3, "scope": ["hooks/eggs.ts"], "session": "", "state": "open", "supersedes": [], "supports": [], "text": "What does the Konami egg hatch into, and when?", "ts": "2026-10-07T08:54:10+00:00"}
{"alternatives": ["Hints in the config pane's Pet row", "Haiku-written hint lines"], "answers": [], "author": "claude-code", "branch": "feat/egg-hints", "choice": "pet list shows ○ ??? after the built-ins; the first done bubble of each 24 h with the pane shown says one of two fixed lines, taking turns by a stored count; hint turns never ask Haiku; the config Pet row is unchanged", "cost_if_wrong": "A done bubble a day is replaced by a hint until the person finds the egg", "decided_by": "owner", "depends_on": [], "evidence": [], "id": "d86", "kind": "decision", "migrated_from": "d111", "pinned": false, "rationale": "Owner wanted a nudge toward the code without giving it; Haiku could improvise or spoil the code", "revisit": "", "schema": 3, "scope": ["hooks/eggs.ts", "hooks/register.tsx", "hooks/command.ts"], "session": "", "state": "adopted", "supersedes": [], "supports": [], "text": "While the egg is locked, glowup hints at it with ??? in /glowup pet list and a fixed bubble line at most once a day", "ts": "2026-10-07T11:56:39+00:00"}
{"alternatives": [], "answers": [], "author": "claude-code", "branch": "feat/egg-hints", "choice": "eggHint runs inside say() after its gates, so bubbles off, pet off, pane hidden and done-mood off all suppress it", "cost_if_wrong": "Someone with done bubbles off never sees a hint", "decided_by": "", "depends_on": [], "evidence": [], "id": "d87", "kind": "decision", "migrated_from": "d112", "pinned": false, "rationale": "Reuses say()'s gates instead of a second path", "revisit": "", "schema": 3, "scope": ["hooks/register.tsx"], "session": "", "state": "adopted", "supersedes": [], "supports": [], "text": "A finished turn's done bubble while the hint is due shows the hint; the setup turning off done bubbles also turns off hints", "ts": "2026-10-07T11:56:40+00:00"}
{"alternatives":["Hints in the config pane's Pet row","Haiku-written hint lines"],"answers":[],"author":"claude-code","branch":"feat/egg-hints","choice":"pet list shows ○ ??? after the built-ins; the first done bubble of each 24 h with the pane shown says one of two fixed lines, taking turns by a stored count; hint turns never ask Haiku; the config Pet row is unchanged","cost_if_wrong":"A done bubble a day is replaced by a hint until the person finds the egg","decided_by":"owner","depends_on":[],"evidence":[],"id":"d86","kind":"decision","migrated_from":"d111","pinned":false,"rationale":"Owner wanted a nudge toward the code without giving it; Haiku could improvise or spoil the code","revisit":"","schema":3,"scope":["hooks/eggs.ts","hooks/register.tsx","hooks/command.ts"],"session":"","state":"adopted","supersedes":[],"supports":[],"text":"While the egg is locked, glowup hints at it with ??? in /glowup pet list and a fixed bubble line at most once a day","ts":"2026-10-07T11:56:39+00:00"}
{"alternatives":[],"answers":[],"author":"claude-code","branch":"feat/egg-hints","choice":"eggHint runs inside say() after its gates, so bubbles off, pet off, pane hidden and done-mood off all suppress it","cost_if_wrong":"Someone with done bubbles off never sees a hint","decided_by":"","depends_on":[],"evidence":[],"id":"d87","kind":"decision","migrated_from":"d112","pinned":false,"rationale":"Reuses say()'s gates instead of a second path","revisit":"","schema":3,"scope":["hooks/register.tsx"],"session":"","state":"adopted","supersedes":[],"supports":[],"text":"A finished turn's done bubble while the hint is due shows the hint; the setup turning off done bubbles also turns off hints","ts":"2026-10-07T11:56:40+00:00"}
{"schema":3,"kind":"decision","id":"d88","text":"A file drops out of the Changes tab when git no longer reports it and tracks it.","state":"adopted","ts":"2026-10-07T13:17:02+00:00","author":"claude-code","session":"","branch":"feat/pane-and-hints","scope":["hooks/changes.ts","hooks/model.ts"],"rationale":"An uncommitted new file is also absent from git diff, so absence alone cannot tell a commit from an untracked file","supports":[],"depends_on":[],"answers":[],"supersedes":[],"evidence":[],"revisit":"","cost_if_wrong":"","pinned":false,"choice":"After the numstat diff, ask git ls-files which unreported files are tracked and drop those; untracked and ignored files keep their own counts","alternatives":["Drop every unreported file","Drop files only on a HEAD rebase"],"decided_by":""}
{"schema":3,"kind":"decision","id":"d89","text":"A refresh that finds new counts for a file touches it again.","state":"adopted","ts":"2026-10-07T13:17:02+00:00","author":"claude-code","session":"","branch":"feat/pane-and-hints","scope":["hooks/changes.ts","hooks/model.ts"],"rationale":"The brief makes at the sort key for Changes and Diff, and a git-only edit has to reorder; max keeps an edit that landed while git ran","supports":[],"depends_on":[],"answers":[],"supersedes":[],"evidence":[],"revisit":"","cost_if_wrong":"","pinned":false,"choice":"refreshCounts stamps the refresh time when counts change; mergeCounts keeps the later of the two times","alternatives":["Keep the first-seen time for refreshed files"],"decided_by":""}
{"schema":3,"kind":"decision","id":"d90","text":"The Diff tab reads hunks only while it is the visible tab.","state":"adopted","ts":"2026-10-07T13:17:02+00:00","author":"claude-code","session":"","branch":"feat/pane-and-hints","scope":["hooks/diff.ts","hooks/register.tsx","hooks/pane.tsx"],"rationale":"git diff is the costly call, and the render hook can only read published state","supports":[],"depends_on":[],"answers":[],"supersedes":[],"evidence":[],"revisit":"","cost_if_wrong":"","pinned":false,"choice":"Hunks live in the published pane view as a plain record, are read on the refresh queue while the tab shows and on switching to it, and untracked files are read with head -c 64 KB","alternatives":["Read the diff on every refresh","Keep hunks in module state outside the view"],"decided_by":""}
Expand Down
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Four spinners: `scanline` sweeps a bright column across a checkered bar and on through the spinner word, `ring` circles nine dots round an ellipse, `glitch` flickers the spinner word's letters into blocks in the pack's `read` and `agent` colors, and `signal` scrolls an oscilloscope trace. Each speeds up or changes shape while commands run or subagents work. Pick one with `motion.spinner` or `/glowup spinner <name>`.
- A `slab` row style: your prompt is a full-width bar in the pack's accent, numbered by turn; tool calls are numbered within the turn with the tool in capitals and `OK` or `FAIL` on the right; a short rule opens each reply.
- Hints that a secret pet exists: `???` in `/glowup pet list`, and now and then a line from Clawd.
- A Diff tab shows this session's changes as themed hunks.

Expand Down
2 changes: 1 addition & 1 deletion docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Each refusal prints a message naming the failed check. Adding a theme whose name

| Command | What it does |
| --- | --- |
| `/glowup spinner <name>` | Use one spinner (`stock`, `comet`, `eyes`, `orb-states`, `clawd` or `shimmer`) on top of the current pack. Prints `Spinner: <name>`. An unknown name lists the valid ones. |
| `/glowup spinner <name>` | Use one spinner (`stock`, `comet`, `eyes`, `orb-states`, `clawd`, `shimmer`, `scanline`, `ring`, `glitch` or `signal`) on top of the current pack. Prints `Spinner: <name>`. An unknown name lists the valid ones. |
| `/glowup spinner list` | List the spinners. A filled dot marks the one showing now, whether it is your override or the pack's own. |
| `/glowup spinner default` | Drop the override and go back to the pack's spinner. Prints `Spinner: pack default`. |

Expand Down
4 changes: 2 additions & 2 deletions docs/install.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ curl -fsSL https://glowup.khimani.dev/install.sh | sh -s -- --yes --pack crt
| `--yes` | Install without the picker, with the defaults or the options below. The script adds it when there is no terminal. |
| `--pack NAME` | `classic`, `crt`, `cozy` or `arcade`. Default `classic`. |
| `--theme NAME` | A theme on top of the pack: `classic`, `glowup`, `aurora`, `dusk`, `cyberpunk`, `vaporwave` or `high-contrast`. `classic` keeps the pack's own colors. Default: not set. |
| `--spinner NAME` | `stock`, `comet`, `eyes`, `orb-states`, `clawd`, `shimmer`, or `pack` for the pack's own. Default `pack`. |
| `--spinner NAME` | `stock`, `comet`, `eyes`, `orb-states`, `clawd`, `shimmer`, `scanline`, `ring`, `glitch`, `signal`, or `pack` for the pack's own. Default `pack`. |
| `--pet clawd\|off` | Default `clawd`. |
| `--bubbles on\|off\|haiku` | Speech bubbles. `haiku` lets Claude Haiku write some lines, as small calls on your account. Default `on`. |
| `--reduced-motion` | Turn off glowup's animation. |
Expand Down Expand Up @@ -92,7 +92,7 @@ The installer sets every setting except `statusline`. To change them afterwards,
| `pet` | `clawd` or `off` | `clawd` | Shows Clawd, or no pet. |
| `bubbles` | `on`, `off` or `haiku` | `on` | Speech bubbles from templates, none, or lines written by Haiku. |
| `theme` | A theme name | `classic` | A theme on top of the pack. `classic` keeps the pack's own colors. |
| `spinner` | A spinner name | `pack` | A spinner on top of the pack: `stock`, `comet`, `eyes`, `orb-states`, `clawd` or `shimmer`. `pack` keeps the pack's own spinner. |
| `spinner` | A spinner name | `pack` | A spinner on top of the pack: `stock`, `comet`, `eyes`, `orb-states`, `clawd`, `shimmer`, `scanline`, `ring`, `glitch` or `signal`. `pack` keeps the pack's own spinner. |
| `statusline` | Comma-separated field ids | `activity,ctx,effort,5h,week` | The status line fields and their order. Unknown ids are dropped. See [Status line](statusline.md#choosing-the-fields). |
| `reducedMotion` | `true` or `false` | `false` | Turns off glowup's animation. |

Expand Down
9 changes: 7 additions & 2 deletions docs/pack-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Packs are read from `~/.claude/glowup/packs`, or `$CLAUDE_CONFIG_DIR/glowup/pack
"theme": "classic", // a theme to start the palette from
"palette": { "accent": "#ff3ec8", "text": "#f0e6ff" },
"bg": "#1a0b33", // what braille and half-block fades blend toward
"rows": "cards", // classic | cards | minimal | retro
"rows": "cards", // classic | cards | minimal | retro | slab
"border": "bold", // round | single | double | bold | classic
"borderColor": "#ff3ec8",
"gradient": ["#ff3ec8", "#38e8ff"],
Expand All @@ -33,7 +33,7 @@ Packs are read from `~/.claude/glowup/packs`, or `$CLAUDE_CONFIG_DIR/glowup/pack
"pet": { "body": "#7aa2f7", "light": "#a9c1ff", "shade": "#4a6fc4" } // Clawd's colors
},
"motion": {
"spinner": "orb-states", // stock | comet | eyes | orb-states | clawd | shimmer
"spinner": "orb-states", // stock | comet | eyes | orb-states | clawd | shimmer | scanline | ring | glitch | signal
"shimmer": 2, // 0 none, 1 soft, 2 fast
"color": "#38e8ff", // defaults to the palette's accent
"field": { "shape": "simplex", "speed": 0.3, "scale": 0.36, "dither": "4x4" }
Expand Down Expand Up @@ -82,6 +82,7 @@ Styles wrap or prefix a transcript row; the content Claude Code draws inside it
| `cards` | An accent side bar `▎` and a `you` label | A dim side bar, and a `claude` label on the first block of a reply | A dim bordered card with a mark: `✓`, `✗`, `■` for interrupted, `…` while running |
| `minimal` | A `› text` line | Claude Code's | A dim one-line `· Read src/auth.ts` once it finishes cleanly |
| `retro` | A `[YOU]` tag on its own line above your prompt | A `[CLAUDE]` tag on the first block | A `[READ ]`-style tag, then `[ OK ]`, `[FAIL]`, `[STOP]` or `[....]` |
| `slab` | A full-width bar in `accent` with your prompt in the background color and `PROMPT 03` on the right | An 8-cell `─` rule in `accent` above the first block | `01 READ ` before the row, then `OK`, `FAIL`, `STOP` or `…` on the right; results indented under their call |

Not styled: notifications, messages from other agents, prompts expanded with ctrl+o or `--verbose`, the folded "Read 3 files" line, and tool progress. Outside fullscreen, rows already in scrollback keep the style they were printed with.

Expand Down Expand Up @@ -132,6 +133,10 @@ A [renderer plugin](packs.md#drawing-with-a-plugin) that answers for the pack dr
| `orb-states` | 4×2 | A braille orb whose motion follows the activity: thinking, searching, working, running, agents. |
| `clawd` | 5×2 | Clawd waving, in his own color. |
| `shimmer` | 1×1 | A still `✻` with a shimmering word. |
| `scanline` | 10×1 | A bright sweep across a bar, and the spinner word lights as it passes. |
| `ring` | 6×2 | A bright braille arc with a fading tail circling an oval. |
| `glitch` | 1×1 | A still `◆` with a glitching word. |
| `signal` | 10×2 | A braille wave trace that scrolls and is brightest at its right edge. |

The shimmer is a wave of color across the spinner word, between the gradient's two colors, or the accent and text colors when there is no gradient. `1` is soft and `2` is fast.

Expand Down
2 changes: 1 addition & 1 deletion docs/web/app/landing/SpinnersSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { usePack } from './PackContext.tsx'
import { SpinnerCanvas } from './SpinnerCanvas.tsx'

const STATES: OrbState[] = ['think', 'search', 'work', 'run', 'agents']
const IDS = (Object.keys(SPINNERS) as SpinnerId[]).filter(id => id !== 'shimmer')
const IDS = (Object.keys(SPINNERS) as SpinnerId[]).filter(id => id !== 'shimmer' && id !== 'glitch')

export function SpinnersSection() {
const { look } = usePack()
Expand Down
Loading
Loading