Dancheong for Neovim
August 3, 2026 · View on GitHub
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 |
Install
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).
What is covered
- Legacy syntax groups and the full editor UI — floats, borders, folds,
diffs, spell, quickfix,
:terminalANSI colors. - Tree-sitter captures, including the granular ones most themes skip:
@variable.parameter,@keyword.return,@markup.heading.*,@string.escape,@constructor,@lsp.type.*,@lsp.typemod.*. - LSP semantic tokens — so colors stay put once a language server attaches instead of falling back to regex highlighting.
- Diagnostics with undercurl, not blocks of background color.
- Plugins: gitsigns, Telescope, nvim-tree, neo-tree, nvim-cmp, bufferline, indent-blankline (v2 and v3), which-key, nvim-notify, noice, trouble, todo-comments, lazy, mason, dashboard, nvim-dap, flash, illuminate, rainbow-delimiters.
Statusline
A matching lualine theme ships with each variant:
require("lualine").setup { options = { theme = "dancheong-night" } }
The rest of your tools
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.
- VS Code — free: Marketplace · Open VSX · source
- Everything else — Dancheong PRO
This colorscheme is free and MIT-licensed, and stays that way.
Contrast gate
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.
License
MIT