Four Neovim colorschemes drawn from dancheong (단청) — the pigment scheme painted on Korean temple eaves for the last 1,500 years. The palette is the old one: 진사 cinnabar, 뇌록 mineral green, 삼청 azurite, 석황 orpiment.
The colors are not eyeballed. They come out of a generator whose build fails
if any foreground/background pair misses its contrast gate — 177 distinct pairs,
7:1 for body text, 4.5:1 for UI text and syntax accents, 3:1 on selections and
diagnostics. Measured over what actually ships here: of the 311 text-bearing
highlight groups in each variant, none lands below 3:1, and comments land
between 4.57:1 and 4.70:1 depending on the variant. Run
python3 scripts/contrast_check.py to reproduce that.
| Variant | Background | For |
|---|---|---|
dancheong-night |
dark | default |
dancheong-dawn |
light | daylight, projectors |
dancheong-storm |
dark | high contrast — accents at 7.5:1 and up |
dancheong-mist |
dark | muted, low saturation |
lazy.nvim
{
"art220/dancheong.nvim",
lazy = false,
priority = 1000,
config = function()
vim.cmd.colorscheme("dancheong-night")
end,
}
packer.nvim
use { "art220/dancheong.nvim" }
vim-plug
Plug 'art220/dancheong.nvim'
Then :colorscheme dancheong-night (or -dawn, -storm, -mist).
Requires Neovim 0.8+ and a true-color terminal (termguicolors is set by the
colorscheme itself).
:terminal ANSI colors.@variable.parameter, @keyword.return, @markup.heading.*,
@string.escape, @constructor, @lsp.type.*, @lsp.typemod.*.A matching lualine theme ships with each variant:
require("lualine").setup { options = { theme = "dancheong-night" } }
The same palette is generated for VS Code, JetBrains, Sublime Text, Obsidian, iTerm2, Alacritty, Kitty, Ghostty, Windows Terminal, Warp, tmux and Zed — one source file, so the hex values match byte-for-byte across all of them.
This colorscheme is free and MIT-licensed, and stays that way.
The generator refuses to emit a variant whose colors miss their thresholds, so a palette change cannot quietly regress readability.
scripts/contrast_check.py re-measures the shipped colors/*.lua directly —
it parses every nvim_set_hl call, resolves groups with no bg against
Normal, and reports the worst pairs. It exempts groups that carry no text:
window borders, indent guides, whitespace markers, the cursor and visual blocks.
That exemption list is in the script, not hidden behind a passing score — read
it and disagree if you like. Everything else is measured, and nothing there is
below 3:1.
The pipeline write-up, including where the gate had holes: how the gate works.
MIT