fathom.nvim

February 25, 2026 · View on GitHub

A deep ocean dark colorscheme for Neovim. Rich blues and purple accents inspired by the depths of the abyss.

fathom.nvim preview

Features

FeatureDetails
TreeSitterFull @ highlight group coverage for accurate, context-aware syntax
LSP Semantic TokensDiagnostic*, Lsp*, and @lsp.* groups for rich editor intelligence
15 Plugin IntegrationsFirst-class support for Telescope, nvim-cmp, lualine, and more
Lualine Auto-ThemeMode-aware statusline colors applied automatically on load
Terminal ColorsCoherent 16-color palette for the built-in Neovim terminal
Transparent ModeStrip backgrounds for compositors and transparent terminals
Dim Inactive WindowsSubtle dimming of unfocused splits
Customizable StylesPer-category font styles for comments, keywords, functions, types, strings, and variables
Custom PalettesSwap or create palettes with full validation of required color keys
Runtime Plugin APIRegister/unregister plugin highlights at any time, even after the theme loads
Color Utilitiesdarken, lighten, and blend helpers for custom highlight callbacks

Installation

lazy.nvim

{
  "josstei/fathom.nvim",
  lazy = false,
  priority = 1000,
  config = function()
    require("fathom").setup()
    vim.cmd.colorscheme("fathom")
  end,
}
Other package managers

packer.nvim

use {
  "josstei/fathom.nvim",
  config = function()
    require("fathom").setup()
    vim.cmd.colorscheme("fathom")
  end
}

vim-plug

Plug 'josstei/fathom.nvim'
require("fathom").setup()
vim.cmd.colorscheme("fathom")

Configuration

All options with their defaults:

require("fathom").setup({
  palette = "fathom",
  transparent = false,
  dim_inactive = false,
  styles = {
    comments = { italic = true },
    keywords = { bold = true },
    functions = { bold = true },
    variables = {},
    types = {},
    strings = {},
  },
  integrations = {
    treesitter = true,
    lsp = true,
  },
  on_highlights = nil,
})
OptionTypeDefaultDescription
palettestring"fathom"Named palette to load (see Custom Palettes)
transparentbooleanfalseRemove background from Normal, NormalFloat, and lualine sections
dim_inactivebooleanfalseDim inactive window backgrounds to bg_dark
integrations.treesitterbooleantrueEnable all @ TreeSitter highlight groups
integrations.lspbooleantrueEnable Diagnostic*, Lsp*, and @lsp.* semantic token groups
on_highlightsfunction|nilnilFinal override callback fn(colors, config) -> table applied last

Syntax Styles

The styles table controls font attributes per syntax category. Each accepts any combination of bold, italic, underline, undercurl, and strikethrough.

KeyDefaultApplies To
styles.comments{ italic = true }All comment highlight groups
styles.keywords{ bold = true }Keywords, conditionals, loops, exceptions
styles.functions{ bold = true }Function names and calls
styles.variables{}Variable references
styles.types{}Type annotations and definitions
styles.strings{}String literals

Palette

ColorHexUsage
#050A14Background#050A14Editor background
#C8C8E0Foreground#C8C8E0Primary text
#5E81F4Blue#5E81F4Functions, cursor
#7C3AEDPurple#7C3AEDKeywords, booleans
#56B6C2Cyan#56B6C2Numbers, specials
#4A9A9ATeal#4A9A9AStrings, characters
#9D7CD8Magenta#9D7CD8Types, macros
#7EC49EGreen#7EC49EGit additions
#E05070Red#E05070Errors, git deletions
#D4A656Yellow#D4A656Warnings
#C87040Orange#C87040Terminal color, extension point
#B48EADPink#B48EADTerminal color, extension point

Plugin Support

All plugins are applied unconditionally. Missing plugins are safely skipped at runtime.

CategoryPluginHighlights
FinderTelescopePrompt, results, preview, selection, matching
Completionnvim-cmpAll CmpItem* kinds, abbreviation, match, deprecated
File Explorernvim-treeTree structure, git status, icons
GitGitSignsSigns, line numbers, line backgrounds, inline, blame
Statuslinelualine.nvimAuto-themed per mode
UInoice.nvimCmdline, popups, confirm, LSP progress, scrollbar
UIwhich-keyKey hint popups
UInvim-notifyNotification levels
UIdashboardDashboard elements
Navigationflash.nvimBackdrop, labels, match, cursor
Navigationleap.nvimMatch, primary/secondary labels, backdrop
Formattingindent-blanklineIndent guides, scope
Minimini.nvimcursorword, indentscope, jump, jump2d, statusline, surround, tabline, trailspace, animate, files, pick
Package Managerlazy.nvimPlugin manager UI
Package Managermason.nvimLSP installer UI

Lualine

Fathom auto-applies a mode-aware lualine theme when the colorscheme loads. No configuration needed.

ModeAccentHex
NormalBlue#5E81F4
InsertGreen#7EC49E
VisualPurple#7C3AED
CommandYellow#D4A656
ReplaceRed#E05070
TerminalCyan#56B6C2

The theme respects your transparent setting. To configure lualine manually instead:

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

Customization

Highlight Overrides

The on_highlights callback runs last in the highlight chain, giving you full control over any group:

require("fathom").setup({
  on_highlights = function(colors, config)
    return {
      ["@comment.todo"] = { fg = colors.palette.yellow, bold = true },
    }
  end,
})

The colors argument exposes both colors.palette (raw hex values) and colors.semantic (named roles like keyword, func, type).

Custom Plugin Highlights

Register highlights for plugins not covered by the built-in set. Registrations made after the theme loads are applied immediately.

require("fathom").register_plugin("my_plugin", function(colors, config)
  return {
    MyPluginNormal = { fg = colors.palette.teal, bg = colors.palette.bg_alt },
    MyPluginBorder = { fg = colors.semantic.border },
  }
end)

Custom Palettes

Create lua/fathom/palettes/<name>.lua returning a module with palette and semantic tables. The loader validates all required keys at load time.

return {
  name = "my_palette",
  palette = {
    bg = "#050A14",
    fg = "#C8C8E0",
    -- 20 required keys total, see lua/fathom/palettes/fathom.lua
  },
  semantic = {
    bg = "#050A14",
    fg = "#C8C8E0",
    keyword = "#7C3AED",
    -- 46 required keys total, see lua/fathom/palettes/fathom.lua
  },
}

Then activate it:

require("fathom").setup({ palette = "my_palette" })

Color Utilities

Helper functions available via require("fathom.utils") for use in on_highlights callbacks or custom palettes:

FunctionSignatureDescription
darken(hex, amount) -> hexDarken a hex color by a percentage (0–100)
lighten(hex, amount) -> hexLighten a hex color by a percentage (0–100)
blend(hex1, hex2, alpha) -> hexBlend two hex colors by alpha (0–1)

API Reference

FunctionDescription
require("fathom").setup(opts)Configure the theme. Does not apply highlights until :colorscheme fathom or .load()
require("fathom").load()Apply the colorscheme. Called automatically by :colorscheme fathom
require("fathom").register_plugin(name, fn)Register a custom plugin highlight callback
require("fathom").unregister_plugin(name)Remove a registered plugin callback
require("fathom").set_palette(name)Switch palettes at runtime and reload all highlights
require("fathom").palettes()List available palette names

License

MIT