Terminal Theme
Skill0 starsChanged 4 months agoMITView on GitHub
Coordinate one visual theme across your whole terminal — Ghostty, fish, zsh, and starship — so they never clash. Uses the "inherit" model by default — Ghostty's theme defines the 16 ANSI colors, and starship/fish/zsh are configured with ANSI color NAMES so they follow it automatically — change the Ghostty theme and the entire terminal re-themes with one edit. Use to SET UP coordinated theming (convert hardcoded hex in starship/fish to ANSI, pick the Ghostty theme as the source of truth), REPAIR a surface that clashes (a prompt or shell still on old hardcoded colors), UPGRADE by switching the theme (one Ghostty edit) or adopting the "matched" model for exact brand palettes, or OPTIMIZE by auditing every surface for hardcoded hex that breaks inheritance. Verified by auditing each surface and rendering ANSI swatches.
In this repository12 other files it gives its agents.
- Brew DoctorSkill
- Credential StoreSkill
- Dev EnvironmentSkill
- DotfilesSkill
- Ghostty ConfigSkill
- Git SetupSkill
- Identity ProfilesSkill
- macOS DefaultsSkill
- Neovim ConfigSkill
- Runtime VersionsSkill
- Shell SyncSkill
- SSH ConfigSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 1 is distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 10
Keep Ghostty, fish, zsh, and starship visually consistent — one theme, no clashes.
- Very specific: line 43
Read-only helpers in scripts/ — the *mutation* is editing config files (starship.toml, fish conf.d), these are the audit + verification …
- Very specific: line 77
Read ~/.config/devenv/config.toml.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Terminal theme
Keep Ghostty, fish, zsh, and starship visually consistent — one theme, no clashes. The default approach is the inherit model: Ghostty's theme defines the 16 ANSI colors (slots 0–15 + fg/bg), and the shells and prompt are configured with ANSI color names so they render with whatever Ghostty theme is active. Change the Ghostty theme → the whole terminal re-themes, one edit.
The golden rule is verification-first: prove coordination by auditing every surface for hardcoded hex (which won't follow the terminal) and rendering the ANSI palette everything shares.
Route to a workflow
| The user wants to… | Workflow |
| Make the four surfaces share one theme (convert hardcoded colors → ANSI, set the Ghostty knob) | reference/setup.md |
| Fix a surface that clashes — a prompt/shell still on old hardcoded colors | reference/repair.md |
| Switch the theme (one Ghostty edit), or move to the "matched" model for exact brand palettes | reference/upgrade.md |
| Audit every surface for hex that breaks inheritance, and tighten it | reference/optimize.md |
| Prove the surfaces agree (audit + swatches) | reference/verification.md |
No workflow named? (a bare /terminal-theme) — triage first: run scripts/theme_status.py:
- any
hardcoded (…)surface → repair (or setup if none are converted yet). coordinated yes→ report it and stop (offerupgradeto switch theme).
The two models
- Inherit (default, recommended). starship/fish/zsh use ANSI color names → they resolve to
Ghostty's palette. One source of truth (the Ghostty
theme), impossible to drift, no per-theme data. Trade-off: colors are the terminal's 16 slots, not a specific brand's exact hex. - Matched (advanced). Each surface gets a theme's exact hex (a native fish/starship theme + Ghostty theme of the same name). Brand-accurate, but every switch re-applies all surfaces and each theme needs its mapping. Covered in upgrade.md.
The scripts (call these, don't re-derive them)
Read-only helpers in scripts/ — the mutation is editing config files
(starship.toml, fish conf.d), these are the audit + verification around it.
| Need | Script |
| Audit coordination across all four surfaces (hardcoded hex = won't inherit) | scripts/theme_status.py |
| Render the terminal's ANSI palette as swatches (what everything inherits) | scripts/theme_swatch.py |
| List Ghostty themes (the one knob); highlight cross-tool families | scripts/theme_list.py [filter] |
Where each surface's theme lives
| Surface | Themed by | Inherit = use… |
| Ghostty | theme = <name> in ~/.config/ghostty/config — the knob (defines ANSI 0–15 + fg/bg) | — (owns ghostty-config) |
| starship | palette in ~/.config/starship.toml | ANSI names in [palettes.*] (no #hex) |
| fish | fish_color_* — fish 4.3+ stores them in conf.d/fish_frozen_theme.fish (ANSI names) | already inherits; per-color overrides go in config.fish (loads last, wins) |
| zsh | syntax-highlighter styles (ZSH_HIGHLIGHT_STYLES) if installed; else raw ANSI | ANSI slot numbers; no highlighter → already inherits |
Core principles
- Ghostty is the source of truth. In inherit mode, the only theme decision is the Ghostty
theme. Everything else is configured once to follow it. - Hardcoded hex is the enemy of coordination. A
#rrggbbin starship/fish/zsh pins that element regardless of the terminal theme → clash.scripts/theme_status.pyflags it; convert to an ANSI name. - Verify by audit + eyeball.
theme_status.pymust show every surfaceinherits; then rendertheme_swatch.pyand a glyph-heavy prompt in Ghostty to confirm they look like one theme. - Live-reload. Ghostty reloads with
cmd+shift+,; open a new shell for fish/zsh color changes (colors are read at shell start). Say so rather than claiming an open shell changed. - Track it.
starship.toml,config.fish(the fish color overrides), and fish'sconf.d/fish_frozen_theme.fishare dotfiles — version them via thedotfilesskill so the coordinated theme is reproducible.
Settings
Read ~/.config/devenv/config.toml; if a [terminal-theme] section exists, use it as defaults
(precedence: explicit > config > ask). Managed by the devenv skill. Keys honored:
model—inherit(default) ormatched.source— the surface that is the source of truth (defaultghostty).theme— the current theme name (the Ghosttytheme, e.g.Catppuccin Mocha).
Boundaries with the other skills
- ghostty-config owns the Ghostty
themeline (the knob); this skill sets which theme and makes the others follow. shell-sync owns fish/zsh sync + the starship prompt init; this skill owns the colors in starship.toml and fish's theme (config.fishoverrides). Change a shell's prompt structure in shell-sync; change its palette here.
Safety
- Back up starship.toml / fish config before rewriting palettes (timestamped copy).
- Converting to ANSI changes the exact colors (brand hex → terminal slots). Confirm the user wants inherit over matched before rewriting a curated palette.
- fish loads
config.fishafterconf.d/*(incl.fish_frozen_theme.fish), so per-color overrides belong inconfig.fish(fish's own guidance) — that's where a readablefish_color_autosuggestiongray goes. A stray hardcoded color there still wins, so audit it. - Autosuggestion is the one deliberate non-inherit: the 16-ANSI palette has no readable mid-gray,
so a fixed dim gray (
8a8a8a) is expected there —theme_status.pyexempts it.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

