A family of Neovim colorschemes built on Catppuccin, centred on warm sepia tones with deliberate active/inactive window contrast.
The main idea: when your focus moves between windows, the inactive ones shift — either to a cooler tinted chrome, or (in the spotlight variants) to full dark mode — so your eye always knows where the cursor is without reading line numbers.
Instead of picking a fixed variant, compose one from elements. :ChromakiBuild asks five questions:
- General style —
paper(the warm light page),sepia(the darker, actual sepia),light(white page),dark,nordic(Nord-inspired),blow(inspired by Jonathan Blow's Emacs "naysayer" look: tan on deep teal, green comments) - Active window background — style default, paper, sepia, white, black, matrix (phosphor green world), transparent (terminal background image shows through), or a custom hex code
- Inactive windows —
spotlight(flat grey-on-black via highlight namespaces),unchanged, orshadedin blue / green / red / yellow / purple / gray / night (tinted inactive windows + matching chrome) - Terminal windows — no special case, or a permanent world of their own (applied whether focused or not, with a matching global ANSI palette): matrix, paper, sepia, naysayer, light, dark, nordic, or transparent
- Full color or bones — bones renders Markdown structure through bold/italic typography instead of colors
The style supplies the palette; the active choice replaces the page background (text and chrome are automatically swapped for readable ones if the choice flips the page's polarity — accents keep the style's identity); the inactive choice picks the dimming machinery; the terminal choice pins :terminal windows to one look (see the terminal-windows section below for why they can't follow a light/dark split). The result is applied and saved as the chromaki-custom colorscheme (spec persisted to stdpath("data")/chromaki-custom.json), so it survives restarts and shows up in colorscheme pickers.
Programmatic use:
require("chromaki.builder").apply({
style = "nordic",
active = "transparent",
inactive = "spotlight", -- or "unchanged", or "shaded:blue"
terminal = "matrix", -- or "none", "paper", "sepia", "naysayer",
-- "light", "dark", "nordic", "transparent"
bones = true,
})The lighter warm page is called paper; sepia is the darker, actual-sepia page (chromaki-sepia). Old chromaki-sepia-{blue,green,…} names were paper aliases and have been removed — use chromaki-paper-* instead.
| Colorscheme | Character |
|---|---|
chromaki-paper-purple |
Paper page, lilac/purple chrome |
chromaki-paper-blue |
Paper page, steel-blue chrome |
chromaki-paper-green |
Paper page, muted-green chrome |
chromaki-paper-red |
Paper page, brick-red chrome |
chromaki-paper-yellow |
Paper page, amber chrome |
chromaki-paper-night |
Paper page, near-black chrome |
chromaki-sepia |
Plain sepia, no accent tint |
chromaki-dark |
Dark mode — inactive windows lighten instead of darken |
chromaki-dark-blue |
Dark mode with blue accent |
chromaki-dark-green |
Dark mode with green accent |
chromaki-paper-transparent |
Paper page, terminal background shows through the active window |
chromaki-dark-transparent |
Dark mode + transparent active window (was chromaki-sepia-dark-transparent) |
chromaki-light-transparent-spotlight |
Active window: paper. Inactive windows: flat monochrome dark, terminal background visible. Terminals: always Matrix green-on-black |
chromaki-spotlight-sepia-inverted |
Active window: sepia. Inactive windows: captured dark snapshot |
chromaki-transparent-light-bones-spotlight |
Bones spotlight variant with terminal background. Terminals: always Matrix green-on-black |
chromaki-matrix |
Phosphor green on pure black, bright-green separator bars, red kept for real errors |
chromaki-custom |
Whatever you last built with :ChromakiBuild |
- Neovim 0.8+
- catppuccin/nvim (declared as a dependency — installed automatically by Lazy)
{
"tsalmeida/chromaki.nvim",
dependencies = { "catppuccin/nvim" },
lazy = false,
priority = 1000,
config = function()
vim.cmd.colorscheme("chromaki-paper-purple")
end,
}Replace "chromaki-paper-purple" with any variant from the table above, or run :ChromakiBuild and use chromaki-custom.
Every variant except the transparent ones uses solid background colours. The inactive chrome colour comes from the surface palette entries — warmer or cooler depending on the variant's accent.
The spotlight variants go further: inactive windows are re-rendered in a separate highlight namespace (nvim_win_set_hl_ns), making them truly dark-mode regardless of the global scheme. This covers treesitter captures too, not just UI groups.
The transparent variants let the terminal's own background image show through inactive windows.
:terminal windows can't follow the light/dark spotlight split: app text drawn with explicit ANSI colours resolves through the terminal's ANSI palette, which Chromaki pins when the terminal world is applied. Chromaki therefore lets terminals have a permanent world of their own — applied whether focused or not, with the global ANSI palette pinned to match. Worlds: matrix (handcrafted phosphor ramp; red and yellow-green survive for errors and warnings while focused), any general style (paper, sepia, naysayer, light, dark, nordic), or transparent (ink text over the terminal emulator's own background image). The fixed transparent spotlight variants use matrix; built themes choose via the fourth :ChromakiBuild question, and a terminal world works with or without the spotlight.
Focus on most terminal worlds is signalled by the statusline — a bright accent bar when active — rather than by recolouring content. The fixed exception is a matrix terminal: when it loses focus, Chromaki routes that window through a blue/white-only namespace. Default terminal text, terminal UI groups, and Neovim-side content-aware highlights flatten to electric blue or white on black so an inactive matrix terminal reads as a solid blue surface. Explicit ANSI colours already stored by the terminal emulator are the remaining Neovim limitation: this build does not expose a per-buffer ANSI remap API, so app-forced ANSI cells cannot be recoloured per inactive window after the fact. Neovim also reads vim.g.terminal_color_0..15 at TermOpen, so terminals opened before switching schemes keep their old palette until restarted.
Chromaki also writes $COLORFGBG (0;15 for a light terminal world or scheme, 15;0 for a dark one, including matrix). Light host terminals often set 0;15 so apps that skip OSC 11 (Claude Code on Windows) do not paint white on paper; Neovim inherits that, and every :terminal job would otherwise inherit it too. A dark :terminal world then gets black body text on a black canvas (Grok's groknight theme is one). The env is applied when the scheme or terminal world loads; already-running terminal jobs keep the value they started with.
vim.g.inactive_win_bg_hint is set by each colorscheme to the intended inactive-window background colour. A focus-mode autocmd can read this to tint NormalNC at runtime, creating a smooth "dim inactive windows" effect without the spotlight machinery.
MIT