Aether.nvim

June 30, 2026 · View on GitHub

A dark Neovim colorscheme with WCAG accessible contrast ratios, direct color injection, and broad plugin support.

Branch note: This is the v3 branch. Use branch = "v3" in your plugin manager.

Aether.nvim

Requirements

Neovim 0.8 or later with true color support enabled:

vim.opt.termguicolors = true

Install

lazy.nvim

{
    "bjarneo/aether.nvim",
    branch = "v3",
    priority = 1000,
    config = function()
        require("aether").setup()
        vim.cmd.colorscheme("aether")
    end,
}

With custom colors

Every palette color is a named variable you can override directly. Pass any combination through the colors table.

{
    "bjarneo/aether.nvim",
    branch = "v3",
    name = "aether",
    priority = 1000,
    opts = {
        colors = {
            bg         = "#1a1d24",
            dark_bg    = "#13161c",
            darker_bg  = "#0e1015",
            lighter_bg = "#242830",

            fg         = "#a2aebb",
            dark_fg    = "#6b7688",
            light_fg   = "#c0ccd5",
            bright_fg  = "#dfe6eb",
            muted      = "#4a5366",

            red        = "#ad523c",
            yellow     = "#d4a05a",
            orange     = "#c47a4e",
            green      = "#5e9a7e",
            cyan       = "#5b9ea0",
            blue       = "#5a8faa",
            purple     = "#8b6e9e",
            brown      = "#7d5440",

            bright_red    = "#c46e5a",
            bright_yellow = "#e0b87a",
            bright_green  = "#7eb89a",
            bright_cyan   = "#7ebcbe",
            bright_blue   = "#7aaac2",
            bright_purple = "#a68eba",

            accent               = "#ad523c",
            cursor               = "#a2aebb",
            foreground           = "#a2aebb",
            background           = "#1a1d24",
            selection             = "#2c3040",
            selection_foreground = "#dfe6eb",
            selection_background = "#4a5366",
        },
    },
    config = function(_, opts)
        require("aether").setup(opts)
        vim.cmd.colorscheme("aether")
    end,
}

LazyVim

Create ~/.config/nvim/lua/plugins/colorscheme.lua:

return {
    {
        "bjarneo/aether.nvim",
        branch = "v3",
        name = "aether",
        priority = 1000,
        opts = {},
        config = function(_, opts)
            require("aether").setup(opts)
            vim.cmd.colorscheme("aether")
        end,
    },
    {
        "LazyVim/LazyVim",
        opts = {
            colorscheme = "aether",
        },
    },
}

Configuration

All options and their defaults:

require("aether").setup({
    transparent = false,
    terminal_colors = true,
    dim_inactive = false,
    lualine_bold = false,

    styles = {
        comments = { italic = true },
        keywords = { italic = true },
        functions = {},
        variables = {},
        sidebars = "dark",     -- "dark", "transparent", or "normal"
        floats = "dark",       -- "dark", "transparent", or "normal"
    },

    colors = {},

    on_colors = function(colors) end,

    on_highlights = function(highlights, colors) end,

    plugins = {
        all = package.loaded.lazy == nil,
        auto = true,
    },
})

Color Palette

All 30 named variables in the default palette. Override any of them through the colors table.

Backgrounds

NameHexPurpose
bg#1a1d24Editor background
dark_bg#13161cSidebars, statusline
darker_bg#0e1015Darkest background
lighter_bg#242830Cursor line, highlights
background#1a1d24Background (terminal alias)

Foregrounds

NameHexPurpose
fg#a2aebbDefault text
dark_fg#6b7688Secondary text
light_fg#c0ccd5Light foreground
bright_fg#dfe6ebBrightest foreground
muted#4a5366Comments, line numbers
foreground#a2aebbForeground (terminal alias)

Accents

NameHexPurpose
accent#ad523cPrimary accent
red#ad523cErrors, deletions
yellow#d4a05aTypes, warnings
orange#c47a4eConstants, numbers
green#5e9a7eStrings, additions
cyan#5b9ea0Regex, hints
blue#5a8faaKeywords, info
purple#8b6e9eStorage, tags
brown#7d5440Escape sequences

Bright Variants

WCAG AA compliant versions used for text on the default background. Each meets a minimum 4.5:1 contrast ratio against bg.

NameHex
bright_red#c46e5a
bright_yellow#e0b87a
bright_green#7eb89a
bright_cyan#7ebcbe
bright_blue#7aaac2
bright_purple#a68eba

Selection

NameHexPurpose
cursor#a2aebbCursor color
selection#2c3040Visual selection
selection_foreground#dfe6ebSelection text
selection_background#4a5366Selection background

Derived Colors

These colors are computed from the palette at load time. They are not injectable directly but can be changed through on_colors.

NameDerived fromPurpose
errorredDiagnostic errors
warningyellowDiagnostic warnings
infoblueDiagnostic info
hintcyanDiagnostic hints
todobright_blueTodo highlights
bordermutedWindow borders
git.addgreenGit additions
git.deleteredGit deletions
git.changeorangeGit changes

Advanced Customization

Override derived colors

Use on_colors to modify any color after the palette is resolved:

require("aether").setup({
    on_colors = function(colors)
        colors.hint = colors.orange
        colors.error = "#ff0000"
    end,
})

Override highlight groups

Use on_highlights to change any highlight group directly:

require("aether").setup({
    on_highlights = function(hl, colors)
        hl.Comment = { fg = colors.muted, italic = true }
        hl.Function = { fg = colors.bright_blue, bold = true }
    end,
})

Transparent background

require("aether").setup({
    transparent = true,
    styles = {
        sidebars = "transparent",
        floats = "transparent",
    },
})

Disable italics

require("aether").setup({
    styles = {
        comments = {},
        keywords = {},
    },
})

Creating a Variant

Create your own named colorscheme by adding a file at ~/.config/nvim/colors/<name>.lua:

require("aether").load({
    name = "midnight",
    colors = {
        bg = "#000000",
        fg = "#c0c0c0",
        blue = "#6699cc",
    },
})

Then activate it:

:colorscheme midnight

Lualine

The lualine theme loads automatically when you set it:

require("lualine").setup({
    options = {
        theme = "aether",
    },
})

Hot Reload

Hot reload is enabled automatically when the plugin loads. It watches:

  • Edits to plugin files while developing aether itself
  • ~/.config/aether/theme/neovim.lua (rewritten by the aether CLI when generating a theme)
  • ~/.config/omarchy/current/theme/neovim.lua (when running under omarchy)
  • ~/.local/state/omarchy/current/theme/neovim.lua (newer omarchy state layout)
  • LazyReload events from lazy.nvim

Manual commands:

:AetherReload         " reload colorscheme with current config
:AetherReloadStatus   " show which paths are being watched

Supported Plugins

Aether provides highlight groups for these plugins. All integrations load by default; set plugins[name] = false to opt out.

Blink.cmp, Comment.nvim, conform.nvim, Diffview, Fidget, Flash, Gitsigns, indent blankline, Mason, Mini.nvim, Neo tree, Noice, nvim dap, nvim lint, nvim tree, Snacks, Telescope, Trouble, Which Key

Core support is always loaded for LSP diagnostics, Treesitter, Markdown, and Git.

License

MIT

Author

Bjarne Øverli (@iamdothash)