✻ for the terminal you already live in
Prompt it, and it builds you your own.
install
Node 20 or newer. Nothing else to configure.
$ npm i -g claude-code-scenes $ ccs
Then /theme to pick one, or /theme create "a vibe" to
design your own.
bundled
Three ship with it. Everything else you prompt for.
/theme create
Two ways in. Both land in the same place.
If you already know the vibe, say it outright
If you would rather look first — the flow in the demo above
/theme→✦ Create your own→describe it
One generation, then a loop. You get two views of the draft — the backdrop animating at full size, and a scripted session exercising about fifteen colour slots — and either accepts a change in plain language: “slower”, “add drifting embers”, “calmer warnings”. Refinements return a delta, so anything you did not mention stays as it was, and you can undo. Nothing is written to disk until you keep it.
good to know
Animations need the alternate screen buffer, which is on by
default. If you prefer inline rendering, /tui off turns it off
permanently — themes still apply their colours, they just stop moving.
Theme files are meant to be shared, so nothing in one is ever
executed. Shader expressions go through a hand-written lexer and
parser — no eval, no Function constructor, no
property access — under hard caps, with a fuzz test.
Details in docs/features/theme-scenes.md.
Installing runs nothing. No postinstall, no
lifecycle scripts of any kind, and no network beyond the registry itself.
The ripgrep binaries the search tools need travel inside the package — all
six platforms — rather than being fetched on your machine, so an install
works offline, behind a firewall, and under --ignore-scripts.
It costs about 13 MB.
contributing
Needs Bun ≥ 1.3.11.
$ bun install $ bun run vendor:ripgrep # rg for this machine; the search tools need it $ bun run hooks # pre-commit formatting, once per clone $ bun run dev # run it $ bun run precheck # typecheck + lint + test $ bun run capture:scenes # regenerate the scene assets from the engine
privacy
Short version: to your model provider, and nowhere else. This project runs no servers, has no account, and collects nothing for itself.
Your prompts, code and conversations go to whichever provider you have configured — Anthropic by default, or OpenAI, Gemini, Grok, Bedrock or Vertex if you set one up. That traffic is between you and them, under their terms. It is not proxied through anything belonging to this project, and no copy is kept anywhere.
Themes never leave your machine. They are ordinary JSON files on disk. Designing one sends your description — “winter vibe, snowfall” — to the same provider that answers your prompts, and nothing else.
Off until you turn them on: crash reporting (needs
SENTRY_DSN), web search, and artifact publishing (needs a host you
choose). None has a default destination.
Installing reaches nothing but the registry. There are no install scripts, so nothing runs on your machine and nothing is fetched from anywhere else — the ripgrep binaries the search tools need are already in the package.
No feature-flag calls. Upstream's client fetched configuration at every startup, carrying a device id and your account identifiers. It is off here unless you point it at a server of your own.