A pink–cyan–lavender Neovim colorscheme. Strings are yellow, functions are pink, types are lavender — and green never reaches code.
Pure Lua. Zero runtime dependencies. Authored in HSL, AAA contrast on the night variant.
- No green in code. Most schemes use green for strings or comments. meowsoot reroutes the chroma — strings are yellow, types are lavender, functions are pink, keywords are cyan. The result is a syntax surface that's immediately recognisable in any screenshot. The invariant is structural, not stylistic —
greenisn't on thectable that group files can see, so a regression would fail loudly at load time. Green still appears in the only places that need it: diff add, git add, success states, the ANSI terminal slot. - Six chromatic accents, tuned together. Anchored at 190° · 208° · 275° · 328° · 20° · 50° — cyan, blue, lavender, pink, peach, yellow. Warm-biased. Three lightness tiers per accent (ANCHOR / STANDARD / QUIET) so the visual hierarchy of the syntax tree comes through without arbitrary highlight noise.
- Pure Lua, zero dependencies. ~50-line HSL → hex engine. No plenary, no required treesitter, no
lush.nvim. Loads fast, caches compiled highlights, easy to fork. - 22 plugin integrations, auto-detected via
lazy.nvim. Telescope, fzf-lua, Snacks, Gitsigns, nvim-cmp, blink.cmp, mini.*, noice, which-key, trouble, render-markdown, treesitter-context, flash, lazy.nvim, nvim-tree, indent-blankline. Bundled lualine theme. - Ecosystem in the box. Matching configs for Ghostty, Kitty, Alacritty, WezTerm, Tmux, Fish, fzf, Bat, Delta, and Lazygit live in
extras/, regenerated from the same palette. Your editor identity carries through to your shell and command-line tools.
The full editor surface. File tree, split buffers, lualine — all keyed to the same six-hue chromatic system.
Markdown via render-markdown.nvim. The rainbow heading wash, fenced code blocks, badges, inline links — all in palette.
Pickers. Fuzzy file search floating over a code buffer.
Git surface. Log view with an inline commit diff. The only place green is allowed to appear — for add lines and nothing else.
Moon — cool dark variant. The same buffer as the hero up top, neutrals rotated to a calm blue.
Dawn — light variant. The same buffer on warm cream — same hue identity, tier-inverted for readability.
Terminal ecosystem. Ghostty, Kitty, Alacritty, WezTerm, Tmux, Fish, Bat, and Delta all use extras/ configs regenerated from the same palette.
All three variants are resolved from the same HSL source of truth (lua/meowsoot/palette.lua). The tables below are regenerated whenever the palette changes — run just extras to refresh. Hex values are real text, so you can select and copy them.
Full swatch tables — Night · Moon · Dawn (click to expand)
Accents
Neutrals
Accents
Neutrals
Accents
Neutrals
The night variant is the main act. moon is a cool, blue-tinted dark counterpart — same accents, neutrals rotated to a calm blue (H≈230°) for a Rosé-Pine-Moon mood. dawn is a complementary light counterpart with the same hue identity, tier-inverted for readability on cream.
A fusion of two ideas. The charcoal background is inspired by Susuwatari — the wandering soot sprites from Studio Ghibli films. The pink and peach accents are inspired by Nyan Cat's pop-tart palette. The rest of the colors — cyan, lavender, yellow, blue — were tuned to round out the chromatic system.
The dawn variant carries the same hue identity onto a warm cream background: the same soot sprites, woken up at sunrise.
Requires Neovim 0.9+. No external dependencies.
{
"marekh19/meowsoot.nvim",
lazy = false,
priority = 1000,
config = function()
vim.cmd.colorscheme("meowsoot")
end,
}{
dir = "/path/to/meowsoot",
lazy = false,
priority = 1000,
config = function()
vim.cmd.colorscheme("meowsoot")
end,
}All options are optional. Defaults shown.
require("meowsoot").setup({
style = "night", -- "night" (warm dark) | "moon" (cool dark) | "dawn" (light)
transparent = false, -- transparent backgrounds
terminal_colors = true, -- set vim.g.terminal_color_0..15
styles = {
comments = { italic = true },
keywords = {},
functions = {},
variables = {},
sidebars = "dark", -- "dark" | "transparent" | "normal"
floats = "dark",
},
-- Plugin highlight groups. Auto-detected via lazy.nvim if `auto = true`.
plugins = {
all = false,
auto = true,
-- Force-enable / disable individual plugins:
-- telescope = true,
-- gitsigns = false,
},
cache = true, -- cache compiled highlights to disk
on_colors = function(c) end, -- mutate the color table
on_highlights = function(hl, c) end, -- mutate the highlight table
})
vim.cmd.colorscheme("meowsoot")Two ways to pick a variant:
require("meowsoot").setup({ style = "moon" })
vim.cmd.colorscheme("meowsoot")Or skip setup entirely and use the per-variant entry point:
:colorscheme meowsoot " night (warm dark, default)
:colorscheme meowsoot-moon " moon (cool dark)
:colorscheme meowsoot-dawn " dawn (warm light)To flip variants with :set background=light / dark, wire an autocmd:
vim.api.nvim_create_autocmd("OptionSet", {
pattern = "background",
callback = function()
vim.cmd.colorscheme(vim.o.background == "light" and "meowsoot-dawn" or "meowsoot")
end,
})Use the bundled lualine theme:
require("lualine").setup({ options = { theme = "meowsoot" } })It reads the active variant (vim.g.meowsoot_style, falling back to vim.o.background) and re-resolves on every :colorscheme switch, so it stays in sync.
gitsigns · telescope · nvim-cmp · blink.cmp · lazy.nvim · flash.nvim · nvim-tree · indent-blankline · treesitter-context · snacks.nvim · mini.icons / mini.files / mini.statusline / mini.indentscope / mini.diff / mini.notify / mini.pick · noice · which-key · trouble · render-markdown · fzf-lua
Pre-generated configs live in extras/, one file per palette variant. Night is the canonical default — it keeps the unsuffixed filename; moon and dawn add a -<variant> suffix.
| Tool | Night (default) | Moon | Dawn |
|---|---|---|---|
| Ghostty | extras/ghostty/meowsoot |
extras/ghostty/meowsoot-moon |
extras/ghostty/meowsoot-dawn |
| Kitty | extras/kitty/meowsoot.conf |
extras/kitty/meowsoot-moon.conf |
extras/kitty/meowsoot-dawn.conf |
| Alacritty | extras/alacritty/meowsoot.toml |
extras/alacritty/meowsoot-moon.toml |
extras/alacritty/meowsoot-dawn.toml |
| WezTerm | extras/wezterm/meowsoot.toml |
extras/wezterm/meowsoot-moon.toml |
extras/wezterm/meowsoot-dawn.toml |
| Tmux | extras/tmux/meowsoot.tmux |
extras/tmux/meowsoot-moon.tmux |
extras/tmux/meowsoot-dawn.tmux |
| Fish | extras/fish/meowsoot.fish |
extras/fish/meowsoot-moon.fish |
extras/fish/meowsoot-dawn.fish |
| fzf | extras/fzf/meowsoot.conf |
extras/fzf/meowsoot-moon.conf |
extras/fzf/meowsoot-dawn.conf |
| Bat | extras/bat/meowsoot.tmTheme |
extras/bat/meowsoot-moon.tmTheme |
extras/bat/meowsoot-dawn.tmTheme |
| Delta | extras/delta/meowsoot.gitconfig |
extras/delta/meowsoot-moon.gitconfig |
extras/delta/meowsoot-dawn.gitconfig |
| Lazygit | extras/lazygit/meowsoot.yml |
extras/lazygit/meowsoot-moon.yml |
extras/lazygit/meowsoot-dawn.yml |
WezTerm loads schemes by internal name, so the variant files declare meowsoot-moon / meowsoot-dawn (matching the filename) — set config.color_scheme accordingly. Every other tool loads by file path.
Bat and Delta share the generated Bat syntax theme. Install one variant and rebuild Bat's cache:
mkdir -p "$(bat --config-dir)/themes"
cp extras/bat/meowsoot.tmTheme "$(bat --config-dir)/themes/"
bat cache --buildSelect it for Bat with --theme="meowsoot" in $(bat --config-file), or set BAT_THEME=meowsoot. Delta reads the same compiled cache and accepts the same name through syntax-theme.
For matching Delta diff backgrounds, line numbers, and decorations, include the corresponding config from extras/delta/:
[include]
path = /path/to/meowsoot.nvim/extras/delta/meowsoot.gitconfigThe Delta config requires the matching Bat theme to be installed first. See extras/bat/README.md and extras/delta/README.md for every variant and verification commands.
Load your existing Lazygit configuration and a theme, with the theme last:
lazygit --use-config-file="/path/to/config.yml,/path/to/meowsoot.nvim/extras/lazygit/meowsoot.yml"Use lazygit --print-config-dir to locate your configuration. Choose the same variant as your terminal theme because Lazygit inherits the terminal background. See the Lazygit setup guide for every variant, Snacks configuration, and optional Delta integration.
These configs are generated artifacts. Changes made by hand are overwritten on regeneration.
After tuning lua/meowsoot/palette.lua:
just extrasBuilt by a small Lua generator (lua/meowsoot/extras/) using only headless Neovim — no external build dependencies. The README palette tables and swatches (static/swatches/) are regenerated by the same target.
Authored in HSL ({h, s, l}) for ergonomic tuning on the color wheel, resolved to hex at load time via lua/meowsoot/hsl.lua. Edit lua/meowsoot/palette.lua to shift hues / saturation / lightness; the rest of the theme follows automatically.
Green never reaches a syntax group. The chokepoint is lua/meowsoot/colors.lua — green is intentionally not exposed as a top-level key on the resolved colors table. Code-shaped group files (groups/base.lua syntax section, groups/treesitter.lua, groups/semantic_tokens.lua, groups/kinds.lua) cannot reach it. Green leaks only through the semantic aliases c.git.add, c.diff.add, c.ok, c.terminal.green, and the mini.icons UI category.
| Recipe | What it does |
|---|---|
just check |
Headless smoke-test: load the colorscheme, fail on errors |
just extras |
Regenerate everything under extras/ plus static/palette.svg |
just fmt |
Run stylua over lua/ and colors/ |
just check-fmt |
Verify stylua formatting (exits non-zero if dirty) |
just cache-clean |
Drop the compiled-highlights cache |
Inspired by tokyonight.nvim.
lua/meowsoot/
init.lua -- setup(opts) / load()
config.lua -- defaults + user-merge
theme.lua -- orchestrator: colors → groups → nvim_set_hl
util.lua -- blend / darken / lighten / template / cache
hsl.lua -- HSL ↔ hex (~50 lines, no dependencies)
palette.lua -- HSL palette (single source of truth, all variants)
colors.lua -- HSL → hex + semantic alias layer ("no green in code" chokepoint)
groups/
init.lua -- aggregator: cache, plugin auto-detect via lazy
base.lua -- editor UI + native Syntax/* + diff/git UI
treesitter.lua -- @* groups
semantic_tokens.lua -- @lsp.*
kinds.lua -- LSP kind helper
plugins/ -- per-plugin overrides
extras/ -- generators for terminal, shell, Bat, Delta, Lazygit, and palette docs







