vim-nightfly-colors: a true-color dark theme with two separate implementations
A dark midnight theme for modern Neovim & classic Vim
At a glance
- What is it?
- nightfly is a dark midnight colorscheme for Neovim and classic Vim whose highlights exist twice, once in Lua and once in legacy Vimscript. It looks precise in a true-color terminal, ships ten options, and publishes no releases at all.
- Who is it for?
- nightfly suits Neovim users who already work in a true-color terminal and want a dark palette tuned for treesitter, LSP and diagnostics, and it still serves classic Vim through the legacy Vimscript path. Skip it if your terminal is limited to 256 colours, or if you need a tagged release you can pin, since the repository publishes none.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 50 days ago.
- What is it written in?
- Mainly Lua, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A dark theme that refuses to run without true color
nightfly is a dark midnight colorscheme for modern Neovim and classic Vim, published as the GitHub project bluz71/vim-nightfly-colors and written primarily in Lua. The project documentation is direct about one hard requirement: nightfly is a true-color-only colorscheme, and it expects an up-to-date Vim or Neovim in a true-color terminal or a GUI client such as gVim. That single constraint should shape how you evaluate it. A palette built from specific hex values cannot be honoured by a terminal that only offers 256 colours, and the editor falls back to whatever approximation the terminal invents. Dark palettes lose most of their argument at reduced depth, because the subtle separation between background, comments and punctuation is exactly what gets compressed. If your terminal is limited to 256 colours, nightfly is the wrong choice no matter how good the screenshots look.
One repository, two highlight implementations
The author states plainly that all nightfly highlights in Neovim are implemented in Lua, whilst highlights in Vim are implemented in legacy Vimscript. That split is visible in the repository layout, where a lua/ directory and a colors/ directory sit side by side with autoload/, after/, doc/ and extras/. Having both styles is why a single installation command can serve two editor generations, and it is also why a change to one implementation does not automatically reach the other. The presence of an after/ directory points at a second loading point, which is how a theme can adjust itself once other plugins have already defined their own highlight groups. The top level also carries nvim.toml, stylua.toml and selene.toml, the files used to format and lint the Lua side. A samples/ directory holds example files for a wide spread of languages, from c.c and go.go to julia.jl and php.php, which is the practical way to see how the highlight set behaves.
Installing nightfly through three plugin managers
Installation is handled by whichever plugin manager you already run. The installation notes cover lazy.nvim, vim-plug and the newer Neovim vim.pack, each with the plugin renamed to nightfly so that the colorscheme command resolves. For lazy.nvim the specification is this:
{ "bluz71/vim-nightfly-colors", name = "nightfly", lazy = false, priority = 1000 },The lazy = false setting keeps the theme loading during startup rather than on first use, and priority = 1000 gives it precedence over other colour definitions. For vim-plug the declaration is:
Plug 'bluz71/vim-nightfly-colors', { 'as': 'nightfly' }The 'as': 'nightfly' option is what gives the installed directory its short name. Neovim's own vim.pack works along the same lines:
vim.pack.add({
{ src = "https://github.com/bluz71/vim-nightfly-colors", name = "nightfly" },
})Note the naming split: the repository is called vim-nightfly-colors while the name your editor will look for is nightfly. Any of the three routes produces that name.
Activating the palette and the ten options behind it
Declaring the plugin is not enough, since the colorscheme has to be switched on from the init file. The usage notes give one line for each editor:
-- Lua initialization file
vim.cmd [[colorscheme nightfly]]" Vimscript initialization file
colorscheme nightflyOptions use the same mechanism, as global variables, and there are ten of them. Italics, undercurls and terminal colours are on by default. Cursor colouring, the normal-mode popup menu, the normal-mode float window, transparency, underlining of the matching parenthesis and virtual text colouring are all off by default, and nightflyWinSeparator carries the value 1. The cursor is left uncoloured unless you ask otherwise:
vim.g.nightflyCursorColor = truelet g:nightflyCursorColor = v:trueThe same variable names apply in both editors, since the project keeps the Vimscript and Lua paths behaviourally aligned.
Statusline plugins need their own trigger
Statusline is handled apart from the main palette, because a statusline plugin defines its own highlight groups after the colorscheme has loaded. lightline has to be pointed at nightfly explicitly:
let g:lightline = { 'colorscheme': 'nightfly' }vim-airline and lualine are described differently. In both cases the nightfly theme loads once the plugin starts, with no extra setting shown. The author's linefly statusline plugin also supports the nightfly theme, as does the legacy mistfly-statusline. This leaves a small but real gap in the documentation. A statusline that has not been configured correctly usually falls back to the editor's default colours, and the documentation does not explain how to diagnose that situation. It also gives no fallback for editors where none of these plugins are installed at all.
Why the styled plugin list is split three ways
The list of styled integrations is grouped into three buckets, and the grouping is a quick read on how the theme behaves under each plugin. The Neovim-only group includes Neovim Tree-sitter, Neovim Diagnostic, Neovim LSP Semantic Highlights, Telescope, nvim-cmp, blink.cmp, Gitsigns, Lualine, Noice, Neo-tree, Neogit, nvim-dap-ui and Hop, among others. The group covering both editors includes BufExplorer, CtrlP, Coc.nvim, Fern, fzf.vim, lightline and vim-airline. The Vim-only group covers ALE, GitGutter, indentLine, NERDTree, Signify and Tagbar. The Neovim-only group is the longest by some distance, which fits a project whose Neovim implementation is the more current of the two. One detail worth copying from the author's note: fzf.vim works best with the matching fly16 bat theme from the same author.
Where nightfly falls short, and what the sibling theme changes
Several limits deserve plain statement. The true-color requirement is the first. The second is release history: the repository has no GitHub releases at all, so there is no tagged version to pin and no changelog to read. The last push was on 2026-09-03, which makes the most recent change to the palette a dated event rather than a released version, and it says nothing about a regular cadence. The project also lists no homepage. As for an alternative, the author maintains a separate dark theme called moonfly and points at it as a project of interest. It lives in its own repository, so moving to it is a swap rather than a configuration change, and the note about moonfly does not describe it in any detail, which means evaluating it means opening that repository separately. The licence field on the repository says MIT, and MIT requires the copyright notice and licence text to travel with copies of the code, so a fork of the palette needs to keep the LICENSE file.
Editorial conclusion
nightfly suits Neovim users who already work in a true-color terminal and want a dark palette tuned for treesitter, LSP and diagnostics, and it still serves classic Vim through the legacy Vimscript path. Skip it if your terminal is limited to 256 colours, or if you need a tagged release you can pin, since the repository publishes none. Before switching, compare the nightflyCursorColor, nightflyTransparent and nightflyWinSeparator values in your init file against the defaults listed above, because the last push was on 2026-09-03 and there are no release notes describing what changed.
Frequently asked questions
Does vim-nightfly-colors work in classic Vim as well as Neovim?
Yes, with a caveat. All nightfly highlights in Neovim are implemented in Lua, while the Vim side is implemented in legacy Vimscript, so both editors get a matching palette from one installation. You activate it with `colorscheme nightfly` in Vim and `vim.cmd [[colorscheme nightfly]]` in Neovim.
What does vim-nightfly-colors need from my terminal?
It is a true-color-only colorscheme, so it requires an up-to-date Vim or Neovim in a true-color terminal or a GUI client such as gVim. In a terminal limited to 256 colours the palette is approximated and the theme loses much of its point.
How do I enable the coloured cursor in vim-nightfly-colors?
The cursor is left uncoloured by default. Set `vim.g.nightflyCursorColor = true` in a Lua init file, or `let g:nightflyCursorColor = v:true` in a Vimscript init file, and the cursor will be coloured.
Does vim-nightfly-colors come with its own statusline plugin?
No, it is compatible with statusline plugins. lightline needs `let g:lightline = { 'colorscheme': 'nightfly' }`, while vim-airline and lualine pick up the nightfly theme once they start. The author also maintains linefly and the legacy mistfly-statusline, both of which support the theme.
How do I install vim-nightfly-colors with lazy.nvim?
Add the plugin to your lazy.nvim specification with the name set to nightfly so the colorscheme command resolves: `{ "bluz71/vim-nightfly-colors", name = "nightfly", lazy = false, priority = 1000 }`. The same naming applies if you prefer vim-plug or Neovim vim.pack.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/bluz71-vim-nightfly-colors)Was this useful?