Repository navigation
Expand bundled theme catalog: Ayu, Kanagawa, Everforest, Flexoki, Material & more #401
Description
Goal
Expand NMSh's bundled, offline, selectable theme families to cover recognizable palettes from the terminal/editor ecosystem (Ayu, Kanagawa, Everforest, etc.), with attractive real previews and correct semantic colors. Do not duplicate themes already shipped, conflate NMSh-owned UI themes with host-terminal themes, or silently modify Ghostty/Terminal.app configuration.
Existing catalog (confirmed on stabilize/post-v020-slice3)
- 12 NMSh Native palettes: Lavender, Brand, Cool, Warm, Grayscale, Aurora, Ocean, Sunset, Forest, Rose, Nebula, High Contrast.
- 8 bundled external families / 19 variants: Catppuccin (Latte, Frappé, Macchiato, Mocha), Dracula, Tokyo Night (Night, Storm, Moon, Day), Gruvbox (Dark, Light), Rosé Pine (Main, Moon, Dawn), Nord, Solarized (Dark, Light), One Dark / One Light.
- User-created/imported themes are already supported in the theme library; imports and Theme Bridge are not substitutes for easy offline built-in presets. Do not re-add the above.
- Registry/selection:
src/appearance/themeFamilies.ts,themeSelection.ts,themeColor.ts,src/prompt/configuration.ts; documentationdocs/design/theme-families.md.
Proposed additions (bundled presets)
Tier 1 — recognizable essentials
- Ayu — Dark, Mirage, Light. Canonical: https://github.com/ayu-theme/vscode-ayu
- Kanagawa — Wave, Dragon, Lotus. Canonical: https://github.com/rebelot/kanagawa.nvim
- Everforest — Dark and Light, starting with Medium; offer Soft/Hard only when they meaningfully change NMSh-owned surfaces (no redundant editor-background-only variants). Canonical: https://github.com/sainnhe/everforest and https://github.com/sainnhe/everforest/blob/master/palette.md
- Flexoki — Dark, Light, carefully tuned semantic accents. Canonical: https://github.com/kepano/flexoki
- Material / Palenight — Palenight plus other distinct Material palette(s) after verifying upstream provenance and license. References: https://github.com/material-theme/vsc-community-material-theme and https://github.com/astrit/vscode-material-palenight-theme
- Classic Monokai — one classic open-licensed terminal palette, not a copied proprietary Monokai Pro filter. Reference: https://github.com/stephenway/monokai.terminal
- Night Owl — Night Owl and Light Owl. Canonical: https://github.com/sdras/night-owl-vscode-theme
- GitHub Primer — GitHub Dark Default, Dark Dimmed, Light Default; High Contrast where genuinely distinct. Canonical: https://github.com/primer/github-vscode-theme
- Oxocarbon — Dark, Light. Canonical: https://github.com/nyoom-engineering/oxocarbon.nvim
Tier 2 — broaden the catalog after Tier 1
- One Half — Dark, Light: https://github.com/sonph/onehalf
- Horizon — Dark, Bright (do not duplicate font/style-only variants): https://github.com/jolaleye/horizon-theme-vscode
- Poimandres — distinctive muted dark: https://github.com/drcmda/poimandres-theme
- Vesper — peppermint/orange dark: https://github.com/raunofreiberg/vesper
- Tomorrow / Tomorrow Night — source and license verification required before bundling; prioritize distinct classics.
- Iceberg — verify canonical palette/terms before bundling.
- Snazzy — verify canonical palette/terms before bundling.
- Alabaster — verify canonical palette/terms before bundling.
- Zenburn — verify canonical palette/terms before bundling.
- Synthwave-style / cyberpunk palette — optional; pick clearly licensed open-source source, avoid confusing existing NMSh Nebula/Aurora or mimicking protected Warp-only themes.
Out of scope unless separately approved: reproducing Warp's proprietary bundled imagery/branding; copying Monokai Pro commercial filters (its official CE program has restrictions: https://monokai.pro/contribute); Dracula Alucard unless an appropriately licensed canonical source/permission is verified; recoloring the host terminal's global window/background/ANSI palette or changing shell rc files.
Product and implementation requirements
- No palette approximations: collect hex values from each canonical upstream project/revision; verify licenses, notice/attribution and permitted redistribution before committing data. Record exact source/revision/license in
docs/design/theme-families.md. Palettes stay bundled offline; no fetching at runtime. - Use the existing single theme family/variant registry and saved
nmsh.paletteID. Register unique stable typed IDs, appropriate dark/light flag, prompt semantic roles, UI chrome roles (accent, separators, selection, status, appropriate text tiers), anddefaultVariant. Update normalization, theme selection, Theme Studio clone, /syntax, /cursor follow-theme, Setup and export/import compatibility. Never change prior IDs or override explicit module colors. - Honor meaningful variants: no pseudo-variants distinguished only by editor background/fonts/italics that NMSh cannot control. Light variants must preserve contrast when host background is unknowable; do not claim to set the terminal background. Document what NMSh actually recolors.
- Build a usable picker for 20+ families / 50+ variants: grouping, easy keyboard navigation/search/filter (including dark/light), deterministic live previews using real NMSh prompt, syntax, chrome, historical selection and powerline wedges. Preview before applying, Esc restores saved state, settings persist only on explicit Apply. Keep existing /theme, /appearance, Setup paths consistent. No network request or code execution on browsing.
- Keep NMSh Lavender Native as the fresh-install/Recommended default; do not overwrite existing theme selections, custom/imported library entries or older configs.
- Respect truecolor/256-color/ANSI-16,
NO_COLOR, Safe glyphs, Reduced Motion, theme-aware contrast (especially light on an arbitrary dark terminal), 32/50/80/132-column and short frames; stable cell widths/selection wedge backgrounds. Tests should use actual production renderers. - Update docs and include a gallery/catalog view or deterministic preview captures; avoid huge runtime asset dependencies.
Verification / delivery
- Unit/integration tests for per-family variant counts, IDs, normalization, selection, migration, theme-role contrast, source data checks, clone/import-export and no unexpected host-side changes.
- Rendering tests for prompt/branch/status, selected Nerd Font wedges, modal rows, Chat/Normal transcript, syntax and cursor palette; real previews for dark/light, selected, narrow and NO_COLOR.
- Focused tests + canonical
verify:release+ exact-head CI; independent review for palette correctness/licensing, accessibility and regressions. - Dedicated feature branch/worktree with scratch/build/cache on verified external T7 (fail closed; preserve existing worktrees). No version bump, merge, tag or release without maintainer approval. Existing v0.19/v0.20 physical-QA gates remain independent.
- At handoff list shipped themes/variants versus deferred, exact upstream references/licenses, before/after previews, test results and any host limitations.
References / motivation
- Warp built-in themes and theme picker: https://docs.warp.dev/terminal/appearance/themes/
- Warp's public custom theme collection: https://github.com/warpdotdev/themes
- Ghostty ships hundreds of themes sourced from iTerm2-Color-Schemes: https://ghostty.org/docs/features/theme
- NMSh already distinguishes its UI themes from host terminal theme and has a separate optional Theme Bridge:
docs/design/theme-families.md.
This is a catalog/UX backlog issue. It does not authorize work on the current stabilization branch or waive the existing integration/release gates.
Activity
raiseCatError commentedon Oct 18, 2026
v0.21: #418 adds Ayu (Dark/Mirage/Light), Kanagawa (Wave/Dragon/Lotus), Everforest (Dark/Light), Flexoki (Dark/Light) and Night Owl (Night Owl/Light Owl). Values come exactly from MIT sources at pinned commits; copyright lines were read from each LICENSE. Theme Studio also gets a
/filter. Deferred, with reasons indocs/design/theme-families.md: Oxocarbon (runtime HSLuv grays), GitHub Primer (built primitives), Material/Palenight and Monokai (licensing), and Tier 2.Merge pull request #418 from raiseCatError/feature/v021-themes