Overview
xeno.nvim generates complete Neovim colorschemes from three seeds — background, accent, and an optional foreground. The foreground defaults to the background seed's hue and chroma, so a single background + accent pair is enough to produce a coherent theme across every highlight group.
How it works
Pass your seeds to require('xeno').theme() and set the colorscheme:
require('xeno').theme('my-theme', {
background = '#1E1E1E',
accent = '#8CBE8C',
})
vim.cmd('colorscheme my-theme')
xeno derives a full 50–950 color scale from each seed and maps them across syntax, UI, diagnostics, and plugin highlight groups automatically.
Plugin support
Built-in theming for 20+ plugins including Telescope, nvim-tree, and bufferline. Each plugin exposes high-level options so you can tune things like selected_bg or border without touching individual highlight groups:
highlights = {
plugins = {
["nvim-telescope/telescope.nvim"] = {
bg = "@background.950",
border = "@accent.500",
},
},
}
What I learned
Generating perceptually consistent color scales from arbitrary hex seeds required working in OKLCH rather than HSL. The trickiest part was deriving a foreground that felt natural — not just a lightened version of the background, but something with the same hue character that could shift properly between light and dark mode.
Stack
- Language: Lua
- Color space: OKLCH
- Targets: Neovim 0.9+