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.
Features
| Feature | Details |
|---|---|
| TreeSitter | Full @ highlight group coverage for accurate, context-aware syntax |
| LSP Semantic Tokens | Diagnostic*, Lsp*, and @lsp.* groups for rich editor intelligence |
| 15 Plugin Integrations | First-class support for Telescope, nvim-cmp, lualine, and more |
| Lualine Auto-Theme | Mode-aware statusline colors applied automatically on load |
| Terminal Colors | Coherent 16-color palette for the built-in Neovim terminal |
| Transparent Mode | Strip backgrounds for compositors and transparent terminals |
| Dim Inactive Windows | Subtle dimming of unfocused splits |
| Customizable Styles | Per-category font styles for comments, keywords, functions, types, strings, and variables |
| Custom Palettes | Swap or create palettes with full validation of required color keys |
| Runtime Plugin API | Register/unregister plugin highlights at any time, even after the theme loads |
| Color Utilities | darken, 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,
})
| Option | Type | Default | Description |
|---|---|---|---|
palette | string | "fathom" | Named palette to load (see Custom Palettes) |
transparent | boolean | false | Remove background from Normal, NormalFloat, and lualine sections |
dim_inactive | boolean | false | Dim inactive window backgrounds to bg_dark |
integrations.treesitter | boolean | true | Enable all @ TreeSitter highlight groups |
integrations.lsp | boolean | true | Enable Diagnostic*, Lsp*, and @lsp.* semantic token groups |
on_highlights | function|nil | nil | Final 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.
| Key | Default | Applies 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
| Color | Hex | Usage | |
|---|---|---|---|
| Background | #050A14 | Editor background | |
| Foreground | #C8C8E0 | Primary text | |
| Blue | #5E81F4 | Functions, cursor | |
| Purple | #7C3AED | Keywords, booleans | |
| Cyan | #56B6C2 | Numbers, specials | |
| Teal | #4A9A9A | Strings, characters | |
| Magenta | #9D7CD8 | Types, macros | |
| Green | #7EC49E | Git additions | |
| Red | #E05070 | Errors, git deletions | |
| Yellow | #D4A656 | Warnings | |
| Orange | #C87040 | Terminal color, extension point | |
| Pink | #B48EAD | Terminal color, extension point |
Plugin Support
All plugins are applied unconditionally. Missing plugins are safely skipped at runtime.
| Category | Plugin | Highlights |
|---|---|---|
| Finder | Telescope | Prompt, results, preview, selection, matching |
| Completion | nvim-cmp | All CmpItem* kinds, abbreviation, match, deprecated |
| File Explorer | nvim-tree | Tree structure, git status, icons |
| Git | GitSigns | Signs, line numbers, line backgrounds, inline, blame |
| Statusline | lualine.nvim | Auto-themed per mode |
| UI | noice.nvim | Cmdline, popups, confirm, LSP progress, scrollbar |
| UI | which-key | Key hint popups |
| UI | nvim-notify | Notification levels |
| UI | dashboard | Dashboard elements |
| Navigation | flash.nvim | Backdrop, labels, match, cursor |
| Navigation | leap.nvim | Match, primary/secondary labels, backdrop |
| Formatting | indent-blankline | Indent guides, scope |
| Mini | mini.nvim | cursorword, indentscope, jump, jump2d, statusline, surround, tabline, trailspace, animate, files, pick |
| Package Manager | lazy.nvim | Plugin manager UI |
| Package Manager | mason.nvim | LSP installer UI |
Lualine
Fathom auto-applies a mode-aware lualine theme when the colorscheme loads. No configuration needed.
| Mode | Accent | Hex |
|---|---|---|
| Normal | Blue | #5E81F4 |
| Insert | Green | #7EC49E |
| Visual | Purple | #7C3AED |
| Command | Yellow | #D4A656 |
| Replace | Red | #E05070 |
| Terminal | Cyan | #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:
| Function | Signature | Description |
|---|---|---|
darken | (hex, amount) -> hex | Darken a hex color by a percentage (0–100) |
lighten | (hex, amount) -> hex | Lighten a hex color by a percentage (0–100) |
blend | (hex1, hex2, alpha) -> hex | Blend two hex colors by alpha (0–1) |
API Reference
| Function | Description |
|---|---|
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