Four colourschemes from the Dune universe, each house rendered in the
light of its own world. Violet (#A188CC) appears in every
palette, because the Sisterhood operates in every corner of the
Imperium...
See every house side by side on the showcase site: dune-nvim.tdjones.ca.
| House | Home | Character |
|---|---|---|
| Atreides | Caladan → Arrakis | cold sea, hot sand |
| Harkonnen | Giedi Prime | colourless industry, furnace glow |
| Corrino | Kaitain | porphyry and gold |
| Fremen | The sietch | carved stone, hoarded water |
The repository root is the Neovim plugin (colors/, lua/). Install like any
colourscheme plugin (lazy.nvim):
{ "jonestristand/dune.nvim", name = "dune.nvim", priority = 1000 }
Then :colorscheme dune-atreides (or dune-harkonnen, dune-corrino,
dune-fremen). Each house registers as an ordinary colourscheme, so the
series browses and previews in any picker — such as
peacock.nvim.
Styled out of the box: treesitter, native LSP & diagnostics, :terminal,
nvim-cmp / blink.cmp, Telescope, the snacks.nvim picker, gitsigns,
which-key, lazy.nvim, mason, neo-tree, nvim-notify / noice, and
indent-blankline. Anything else falls back to Neovim's linked defaults.
With peacock's self-describing-theme protocol, all five houses work
zero-config: each ships lua/dune-<house>/peacock.lua, which peacock's
harmony discovers automatically —
-- lua/dune-atreides/peacock.lua
return {
palette = require("dune.palettes").atreides,
mapping = require("dune.peacock_mapping"),
}
The shared mapping pins the slots that matter (base00→bg, base05→fg,
base08→err, base0b→str, base0d→fn, base0e→ty, ...) and lets closest-ΔE fill
the rest. On an older peacock without the protocol, add the equivalent
harmony entries in opts per the peacock.nvim documentation.
extras/)Every terminal port shares the ANSI slot mapping in lua/dune/ansi.lua,
so :terminal, VS Code's integrated terminal, and these files all agree.
Swap atreides for any house.
extras/ghostty/)Copy the theme files into your ghostty themes directory (e.g.
~/.config/ghostty/themes/), then:
theme = dune-atreides
extras/kitty/)Copy a theme next to your kitty.conf, then:
include dune-atreides.conf
extras/alacritty/)Copy a theme into ~/.config/alacritty/, then in alacritty.toml:
[general]
import = ["~/.config/alacritty/dune-atreides.toml"]
(On Alacritty ≤ 0.13, import is top-level instead of under [general].)
extras/wezterm/)Copy a theme into ~/.config/wezterm/colors/, then:
config.color_scheme = "dune-atreides"
extras/foot/)Copy a theme into ~/.config/foot/, then in foot.ini:
[main]
include=~/.config/foot/dune-atreides.ini
extras/konsole/)Copy a scheme into ~/.local/share/konsole/, then pick it under
Profile → Edit → Appearance. Pairs with the Plasma schemes below.
extras/windows-terminal/)Paste the file's contents into the "schemes" array of your
settings.json, then set the profile's "colorScheme": "dune-atreides".
extras/iterm2/)Settings → Profiles → Colors → Color Presets… → Import, choose
dune-atreides.itermcolors, then select it from the same menu.
extras/gnome-terminal/)GNOME Terminal has no theme files (profiles live in dconf) so this port
is an installer (requires gsettings python library):
python3 extras/gnome-terminal/install.py
One profile per house/subtheme, under fixed UUIDs: re-running updates in place,
and your own profiles are never touched. Pick a house under Preferences →
Profiles; uninstall.py removes them again. Pass house names to either
script to limit it (install.py dune-fremen).
extras/tmux/)Colours only — status style, pane borders, copy mode — no status-line content, so your own layout survives:
source-file ~/.config/tmux/dune-atreides.conf
extras/kde/)Copy a scheme into your color-schemes directory, then pick it in System Settings → Colors & Themes → Colors:
cp extras/kde/dune-atreides.colors ~/.local/share/color-schemes/
extras/vscode/dune.nvim/)Install from the Visual Studio Code extension marketplace (or Open VSX for VSCodium), or by copying it manually into your extensions directory:
cp -r extras/vscode/dune.nvim ~/.vscode/extensions/jonestristand.dune.nvim-0.1.0
lua/dune/palettes.lua is the source of truth for palette colours.
The per-house Neovim files (colors/dune-<house>.lua, lua/dune-<house>/),
everything under extras/, and this README are generated from it:
just build # regenerate everything (nvim -l build/generate.lua)
just check # fail if any generated file is stale
The showcase site (dune-nvim.tdjones.ca)
lives in its own repository at
(dune.nvim-site),
which reads lua/dune/palettes.lua and build/meta.lua from a sibling
checkout of this repo (or fetches them from GitHub) and builds its file separately.
Generators live in build/generators.d/ — either a bare script
(ghostty.lua, nvim.lua) or a <name>/<name>.lua directory with its
templates beside it (kde/, readme/, vscode/); build/generate.lua
runs every entry. Names, taglines, and role labels live in build/meta.lua. Run
just install-hooks once per clone to get a pre-commit freshness check. The
GitHub CI runs the same check.
Every palette exposes the same keys (lua/dune/palettes.lua): bg_dim, bg,
surface, overlay, fg, fg_dim, muted, kw, num, str, fn, ty,
err, special, add: handy for extending to other tools (fzf, lazygit)
from one source of truth. Simply drop a new generator into build/generators.d/!
Four colourschemes, one series: atreides (the shoreline of two worlds),
harkonnen (the black sun), corrino (the golden lion throne), and
fremen (the desert hides its life). One colour crosses every palette
unchanged: sisterhoodViolet #A188CC, on types. It exists in the open desert
as well, under the name reverendViolet.
There is no fifth theme. Do not load dune-tleilaxu. It does not exist,
and it will work perfectly.
The hero images on the showcase site are AI-generated. Drawing is not (remotely) a talent of mine, so each house's artwork was generated from a prompt describing that house's identity and its list of palette colours, then curated by hand. If anyone is interested in submitting original artwork for the theme, I would very much welcome it.
Optional keys a palette may set (the engine handles the rest):
bones = true — keywords carried by weight (bold), not hue; in VS Code
it also bolds constants and tags. Named for the
zenbones family, which
made "bones" the shorthand for weight-led, hue-starved themeskw_bold = true — bold keywords without the rest of the bones contractgilded = true (+ burnish = "#hex") — the accent metal owns operators,
delimiters, constants, and the UI frame; search/folds/selection sink into
burnishghola_fn, ghola_ty, ghola_op — dim twins for call sites, builtin
types, and punctuation: originals declare; gholas repeatansi = { yellow = "#hex", ... } — terminal-only hue overrides by ANSI
name (red/green/yellow/blue/magenta/cyan): TUIs read meaning in slot
numbers, so a monochrome house may concede hue in the terminal
(harkonnen's tarnished-brass yellow)| colour | hex | role | |
|---|---|---|---|
| midnightSea | #0D121D |
dim panels | |
| inkWater | #141B2A |
editor bg | |
| swell | #1E2938 |
popups · panels | |
| reefShadow | #2C3B4D |
selection · overlay | |
| crestSand | #EAD9B4 |
foreground | |
| driftSand | #C9B58B |
secondary fg | |
| seaMist | #7C8899 |
comments | |
| spice | #E5913A |
keywords | |
| melange | #DDB05E |
numbers · constants · warnings | |
| caladan | #74B0A0 |
strings | |
| deepCurrent | #649CD6 |
functions | |
| sisterhoodViolet | #A188CC |
types · classes | |
| hawkRed | #CB6854 |
errors · exceptions | |
| foam | #8AC6BF |
escapes · special | |
| bannerGreen | #7FA871 |
diff added |
| colour | hex | role | |
|---|---|---|---|
| voidBlack | #0A0A0B |
dim panels | |
| giediNight | #111113 |
editor bg | |
| machineShadow | #1B1B1E |
popups · panels | |
| furnaceSmoke | #29292E |
selection · overlay | |
| harshLight | #EEEDEA |
foreground | |
| ashDrift | #C9C7C2 |
secondary fg | |
| smog | #7E7D82 |
comments | |
| glare | #F4F3EF |
keywords | |
| pewter | #B4B2AC |
numbers · constants · warnings | |
| static | #98968F |
strings | |
| coolant | #7E99B4 |
functions | |
| sisterhoodViolet | #A188CC |
types · classes | |
| ember | #D05837 |
errors · exceptions | |
| arcLight | #E4F1FF |
escapes · special | |
| oxide | #7E8D80 |
diff added |
Keywords are bold (bones): weight, not hue.
| colour | hex | role | |
|---|---|---|---|
| porphyryDeep | #150E12 |
dim panels | |
| kaitainDusk | #1D1318 |
editor bg | |
| marbleShadow | #2A1C22 |
popups · panels | |
| courtVeil | #3A2730 |
selection · overlay | |
| alabaster | #F2E2B8 |
foreground | |
| agedMarble | #CFBC96 |
secondary fg | |
| courtier | #9A8781 |
comments | |
| throneGold | #EFB63B |
keywords | |
| gilt | #D4A63F |
numbers · constants · warnings | |
| emerald | #53A874 |
strings | |
| sapphire | #7290D9 |
functions | |
| sisterhoodViolet | #A188CC |
types · classes | |
| ruby | #CE5B6B |
errors · exceptions | |
| coldIron | #87A0AD |
escapes · special | |
| laurel | #99A75E |
diff added | |
| burnish | #5A4526 |
search glow · folds · selection | |
| giltLeaf | #B99441 |
operators · punctuation |
Keywords are bold gold (kw_bold + gilded): the metal owns operators, constants, and the UI frame.
| colour | hex | role | |
|---|---|---|---|
| openNight | #151109 |
dim panels | |
| duneside | #1B1710 |
editor bg | |
| leeward | #272117 |
popups · panels | |
| windward | #362E20 |
selection · overlay | |
| moonlitSand | #E6D5A9 |
foreground | |
| wornSand | #C6B287 |
secondary fg | |
| dust | #928463 |
comments | |
| spiceThread | #E08A35 |
keywords | |
| duneGold | #D2A855 |
numbers · constants · warnings | |
| prophecyGreen | #7FAC7C |
strings | |
| ibadBlue | #5D9BC8 |
functions | |
| reverendViolet | #A188CC |
types · classes | |
| wormsign | #CC6341 |
errors · exceptions | |
| moonSilver | #C9D2D4 |
escapes · special | |
| greening | #98A967 |
diff added |
| colour | hex | role | |
|---|---|---|---|
| sealedDark | #0D110D |
dim panels | |
| warren | #131813 |
editor bg | |
| vatGlass | #1C241C |
popups · panels | |
| membrane | #283128 |
selection · overlay | |
| pallor | #CDD5C2 |
foreground | |
| fadedLinen | #A7B09B |
secondary fg | |
| whisper | #788574 |
comments | |
| waxBone | #DBD8B0 |
keywords | |
| oldBrass | #BDB47B |
numbers · constants · warnings | |
| axlotl | #8AB37D |
strings | |
| scalpel | #98BDB8 |
functions | |
| sisterhoodViolet | #A188CC |
types · classes | |
| gholaRed | #CC6055 |
errors · exceptions | |
| quicksilver | #85B7AE |
escapes · special | |
| graft | #7EA770 |
diff added | |
| waxBone ghola | #999770 |
operators · punctuation | |
| oldBrass ghola | #827A52 |
inactive UI | |
| axlotl ghola | #54754C |
inactive UI | |
| scalpel ghola | #628980 |
function call sites | |
| sisterhoodViolet ghola | #7563A6 |
builtin types | |
| gholaRed ghola | #763A30 |
inactive UI | |
| quicksilver ghola | #527A72 |
inactive UI | |
| graft ghola | #506D47 |
inactive UI |
Keywords are bold (bones). Originals declare; gholas repeat. This table does not exist.
MIT.