What if your code editor matched the hero you were playing?
I'm a developer who plays Dota 2. And one day I realized something while staring at my terminal during a 45-minute game: my colorscheme didn't match anything about the world I was actually living in.
So I built eight.
necrophos.nvim isn't a collection of eight tints of the same palette. It's eight completely different Dota 2 heroes, each traced back to their actual in-game colors, transformed into syntax-aware, WCAG-compliant Neovim themes.
The Problem with Most Color Schemes
Dark themes get boring fast. They're usually:
- Generic: Navy background, random accent colors that change every theme
- Unrealistic: "Inspired by" a concept or feeling, not actually sourced from anything
- Aesthetic chaos: Comments fade into the background, three shades of similar hues melt together
I wanted something different. Something that felt real. Something that could make someone open Neovim and think: "Oh, I'm using Arc Warden today."
Eight Heroes, Eight Worlds
Necrophos — The Plague Doctor
Toxic green meets grave purple over deep pine. The emerald staff, the plague mask, the decay that lingers. Perfect for when you're debugging something nasty.
Kunkka — The Admiral
Night-ocean navy, ghostship teal, brass gold, and cannon crimson. You're navigating code like you're steering a ship through fog. Steel for operators, fire for alerts.
Invoker — The Arcane Mage
Here's where it gets clever. Invoker's three orbs map to syntax:
- Quas (ice blue) → functions
- Wex (violet) → keywords
- Exort (fire orange) → constants
- And gold for warnings, like the flash when you invoke a spell
Brewmaster — The Drunken Brawler
Brass kegs, olive robes, primal fire. Built directly from Mangix's model — which means intentionally no blue, because the hero's model doesn't have any. Jade anchors the cool end instead. Warm, earthy, bold.
Earth Spirit — Carved from Sacred Jade
Sacred jade, fired terracotta, cold granite. Valve's lore says Kaolin was literally carved from jade and buried with a stone funerary army — so the palette matches that origin. No blue here either, but the earthiness feels completely different from Brewmaster.
Lich — The Frozen Sovereign
Chain Frost cyan. Frost Armor mint. Sinister Gaze violet. And one warm crimson for errors, because a failure should never hide in the ice.
Arc Warden — The Primordial Fragment
Flux plasma meets magnetic fields. Teal, indigo, and runic gold scattered across a cosmic void. Like coding inside an electromagnetic discharge.
Dragon Knight — Davion
The widest hue separation of them all. Because Elder Dragon Form is literally four dragons:
- Green Dragon → strings
- Red Dragon → errors & exceptions
- Blue Dragon → functions
- Black Dragon → keywords
Plus Davion's steel plate and gold trim. It's pure visual separation.
This Isn't Just Pretty Colors
Every theme ships with measured numbers. Yes, actual math. Each color has its contrast ratio printed inline:
red = "#e8543c", -- Red Dragon, Breathe Fire (errors) - 5.2:1
green = "#8ad44a", -- Green Dragon, Corrosive Breath - 10.4:1
cyan = "#5fd0c8", -- Frost breath (types) - 10.2:1
What this means:
- ✅ Comments and syntax clear WCAG AA (≥4.5:1 contrast)
- ✅ Tokens that appear together are separated by hue, not just brightness
- ✅ Three distinct background levels so visual selections don't vanish on the cursor line
- ✅ Every color is defined once; no hardcoded hex values floating around
I tested these during real coding sessions, not just in swatch strips. Colors that look striking alone often turn unreadable in a 200-line function.
What Gets Themed?
Everything that matters:
-
Tree-sitter (full
@capture set, including Markdown) - LSP (diagnostics, underlines, signature help)
- Diffs & git (gitcommit, diffs)
- Terminal (all 16 ANSI slots, mapped per hero)
- Integration plugins: Telescope, which-key, nvim-notify, gitsigns, indent-blankline, nvim-dap-ui, Noice
Installation (30 Seconds)
lazy.nvim
{
"electromidz/necrophos.nvim",
name = "necrophos",
lazy = false,
priority = 1000,
config = function()
require("necrophos").setup({
theme = "dragon_knight",
transparent = false,
})
end,
}
packer.nvim / vim-plug
Just as quick. Full install instructions on GitHub.
The Keymap That Changes Everything
vim.keymap.set("n", "<leader>ut", "<cmd>NecrophosToggleTheme<cr>",
{ desc = "Next hero" })
Now you can cycle through all eight heroes while you code. Switch themes mid-session. Match your Dota mood.
Or use direct commands: :NecrophosDragonKnight, :NecrophosLich, etc.
Why This Matters
Developers spend hours staring at code. Hours. Your colorscheme isn't just decoration — it's part of your mental space. It affects readability, eye strain, and honestly? How much you enjoy being in your editor.
I built necrophos because I wanted to work in a world that felt specific. Not generic. Not auto-generated from a design system. Real hero colors, carefully adjusted to be readable, with reasoning you can audit yourself.
And because Dota 2 has some of the most beautifully designed hero kits in any game — why not let that design extend into your workspace?
Give It a Try
It takes 30 seconds to install. If you love:
- Dota 2 (obviously)
- Neovim and caring about your tools
- Color theory and readable code
- Attention to detail in design
Then open your package manager and grab necrophos.nvim.
Give it a star on GitHub. Try a few different heroes. Find the one that feels like home.
Because your editor should feel like your world, not just a default dark background with random colors.
The Code is Yours
It's MIT licensed. Fork it, extend it, add your own heroes. Each theme is self-contained in Lua — straightforward to read, easy to modify.
GitHub: electromidz/necrophos.nvim
Pick your hero. Ship your code.
What's your favorite Dota 2 hero? Which theme do you want to see next? Drop a comment or open an issue on GitHub.
Top comments (0)