Nightfall.nvim is a clean and eye-friendly Neovim colorscheme designed to enhance your coding experience. With a minimalist aesthetic and multiple flavors, it reduces eye strain and integrates seamlessly with popular plugins, making it perfect for extended coding sessions.
- πͺ Three flavors that all cover the same highlight groups.
- πΌοΈ Every highlight group Neovim documents through 0.12, including the newer completion, message and popup border groups.
- π² Every Treesitter capture Neovim documents, so no language falls back to a default color.
- ποΈ LSP diagnostics, virtual lines, inlay hints, code lenses and semantic tokens.
- π§© Thirty-four plugin integrations, each one switchable.
- ποΈ Colors and highlight groups you can override per flavor.
- β‘οΈ Compiled once and reused, so startup stays fast.
- π΅ Every color checked for contrast against its own background.
- π₯οΈ Matching themes for Alacritty, lazygit and yazi.
Install Nightfall.nvim with your favourite plugin manager. Calling setup is optional; without it every option keeps its default.
With lazy.nvim:
{
"2giosangmitom/nightfall.nvim",
lazy = false,
priority = 1000,
opts = {},
config = function(_, opts)
require("nightfall").setup(opts)
vim.cmd.colorscheme("nightfall") -- nightfall, deeper-night, maron
end,
}setup has to run before :colorscheme for its options to take effect.
require("nightfall").setup({
transparent = false, -- skip backgrounds so the terminal shows through
terminal_colors = true, -- set the terminal_color_* globals
dim_inactive = false, -- darken windows without the cursor
default_integrations = true, -- start from every integration enabled
styles = { comments = { italic = true } },
integrations = { flash = { enabled = false } },
color_overrides = {},
highlight_overrides = {},
})See :h nightfall-config for the full list and every default.
color_overrides replaces palette colors before highlights are built, so a replaced color reaches every group that uses it. highlight_overrides replaces highlight groups afterwards. Both are keyed by flavor name, or by all for every flavor, and a flavor's own entry wins over all. An entry of highlight_overrides is a table of groups, or a function that receives the palette and returns one.
require("nightfall").setup({
color_overrides = {
all = { fg = "#ffffff" },
nightfall = { bg = "#0b0b14" },
},
highlight_overrides = {
all = { Normal = { bg = "#120809" } },
nightfall = function(colors)
return { Comment = { fg = colors.teal, italic = false } }
end,
},
})Only the keys you name change; the rest of a group keeps the value the colorscheme gave it. See :h nightfall-config for details.
Every integration is on by default and takes at least enabled. Some take more: fzf and telescope accept a style of "bordered" or "borderless", and dap, mini, snacks, native_lsp and treesitter have a switch per feature.
require("nightfall").setup({
integrations = {
telescope = { enabled = true, style = "borderless" },
treesitter = { enabled = true, context = true },
flash = { enabled = false },
},
})Set default_integrations = false to start from none of them and opt back in one at a time.
A matching lualine theme ships with each flavor:
require("lualine").setup({ options = { theme = "nightfall" } })The extras/ directory carries matching themes for other tools, one file per flavor, generated from the same palettes.
| Tool | Where it goes |
|---|---|
| Alacritty | Import extras/alacritty/<flavor>.toml from alacritty.toml |
| lazygit | Merge extras/lazygit/<flavor>.yaml into your lazygit config |
| yazi | Copy extras/yazi/<flavor>.toml to ~/.config/yazi/theme.toml |
Contributions are welcome, whether they fix bugs, add an integration or improve the documentation.
The repository uses just for every task:
just deps # clone mini.test and mini.doc into deps/
just test # run the test suite
just fmt # format with stylua
just generate # regenerate doc/nightfall.txt and extras/
just ci # everything the CI runsdoc/nightfall.txt and everything under extras/ are generated, so change the source and run just generate rather than editing them by hand. CI fails if either is out of date.
Adding an integration means one file at lua/nightfall/groups/integrations/<name>.lua, exporting get(ctx, opts), plus an entry named <name> in the defaults in lua/nightfall/config.lua.
For local development, set vim.g.nightfall_no_cache = true so every reload rebuilds the theme, and reload the plugin on save:
vim.g.nightfall_no_cache = true
vim.api.nvim_create_autocmd("BufWritePost", {
pattern = "*/lua/nightfall/**.lua",
group = vim.api.nvim_create_augroup("nightfall_dev", { clear = true }),
callback = function()
for module in pairs(package.loaded) do
if module:match("^nightfall") then package.loaded[module] = nil end
end
require("nightfall").setup({})
vim.cmd.colorscheme(vim.g.colors_name)
vim.notify("Nightfall reloaded", vim.log.levels.INFO, { title = "Nightfall" })
end,
})Enjoying Nightfall.nvim? Give it a π on GitHub and share it with others!
This project is licensed under the MIT License.
Thanks to all the amazing contributors π
Nightfall.nvim owes gratitude to the following projects for their inspiration and contributions:


