Skip to content

Instantly share code, notes, and snippets.

@nicolashery
Last active February 21, 2026 17:45
Show Gist options
  • Select an option

  • Save nicolashery/dcb2e4ad920398f67c4c08114c349c5f to your computer and use it in GitHub Desktop.

Select an option

Save nicolashery/dcb2e4ad920398f67c4c08114c349c5f to your computer and use it in GitHub Desktop.
Monochrome and minimal color themes

Minimal Monochrome Themes

VS Code

Ghostty

  • Custom themes in this Gist:
    • Minimal Monochrome Light
    • Minimal Monochrome Dark
  • Put in ~/.config/ghostty/themes
  • Edit ~/.config/ghostty/config set theme = Minimal Monochrome Light

Zellij

  • Inherit terminal colors: in ~/.config/zellij/config.kdl set theme "ansi"

Neovim (LazyVim)

  • Custom themes in this Gist:
    • colors/minimal_mono_light.lua
    • colors/minimal_mono_dark.lua
  • LazyVim config:
    • lua/plugins/lazyvim.lua

Reading

return {
{
"LazyVim/LazyVim",
opts = {
colorscheme = "minimal_mono_light",
},
},
}
background = #1A1A1A
foreground = #EEEEEE
cursor-color = #EEEEEE
cursor-text = #1A1A1A
selection-background = #606060
selection-foreground = #EEEEEE
palette = 0=#1A1A1A
palette = 1=#F5A3A7
palette = 2=#8BCFAC
palette = 3=#F0C674
palette = 4=#89B4D4
palette = 5=#C9A5E0
palette = 6=#7DD4D0
palette = 7=#D0D0D0
palette = 8=#646464
palette = 9=#FFB8BA
palette = 10=#A8E6C3
palette = 11=#FFE082
palette = 12=#A8D1F0
palette = 13=#D9B8F0
palette = 14=#9DE5E0
palette = 15=#FCFCFC
background = #FCFCFC
foreground = #1A1A1A
cursor-color = #1A1A1A
cursor-text = #FCFCFC
selection-background = #D0D0D0
selection-foreground = #1A1A1A
palette = 0=#1A1A1A
palette = 1=#C97A7D
palette = 2=#5A9E6F
palette = 3=#B8893A
palette = 4=#5A8FB8
palette = 5=#8B6BA8
palette = 6=#4A9EA8
palette = 7=#D0D0D0
palette = 8=#646464
palette = 9=#B56B6B
palette = 10=#4D8B5E
palette = 11=#A67830
palette = 12=#4A7FA8
palette = 13=#7D5D9A
palette = 14=#3D8F99
palette = 15=#FCFCFC
-- Minimal Monochrome Dark
vim.o.background = "dark"
vim.g.colors_name = "minimal_mono_dark"
local c = {
bg = "#1A1A1A", -- matches VS Code terminal background for dark
fg = "#EEEEEE",
fg_soft = "#D0D0D0",
comment = "#7B7B7B",
subtle = "#3A3A3A",
subtle2 = "#222222",
cursor = "#EEEEEE",
visual = "#606060",
red = "#F5A3A7",
green = "#8BCFAC",
yellow = "#F0C674",
blue = "#89B4D4",
magenta = "#C9A5E0",
cyan = "#7DD4D0",
}
local function hl(group, spec)
vim.api.nvim_set_hl(0, group, spec)
end
-- Core UI
hl("Normal", { fg = c.fg, bg = c.bg })
hl("NormalNC", { fg = c.fg, bg = c.bg })
hl("Cursor", { fg = c.bg, bg = c.cursor })
hl("CursorLine", { bg = c.subtle })
hl("CursorColumn", { bg = c.subtle })
hl("LineNr", { fg = c.comment })
hl("CursorLineNr", { fg = c.fg })
hl("SignColumn", { bg = c.bg })
hl("ColorColumn", { bg = c.subtle2 })
hl("Visual", { bg = c.visual })
hl("Search", { bg = c.visual, fg = c.fg })
hl("IncSearch", { bg = c.visual, fg = c.fg })
hl("Pmenu", { bg = c.subtle2, fg = c.fg })
hl("PmenuSel", { bg = c.subtle, fg = c.fg })
hl("FloatBorder", { fg = c.subtle, bg = c.subtle2 })
hl("NormalFloat", { bg = c.subtle2, fg = c.fg })
hl("WinSeparator", { fg = c.subtle })
hl("VertSplit", { fg = c.subtle })
hl("StatusLine", { bg = c.bg, fg = c.fg })
hl("StatusLineNC", { bg = c.bg, fg = c.comment })
hl("TabLine", { bg = c.bg, fg = c.comment })
hl("TabLineSel", { bg = c.bg, fg = c.fg, bold = true })
hl("TabLineFill", { bg = c.bg })
-- Syntax (mostly monochrome)
hl("Comment", { fg = c.comment })
hl("Constant", { fg = c.fg_soft })
hl("String", { fg = c.fg_soft })
hl("Character", { fg = c.fg_soft })
hl("Number", { fg = c.fg_soft })
hl("Boolean", { fg = c.fg })
hl("Identifier", { fg = c.fg })
hl("Function", { fg = c.fg })
hl("Statement", { fg = c.fg, bold = true })
hl("Keyword", { fg = c.fg, bold = true })
hl("Operator", { fg = c.fg })
hl("Type", { fg = c.fg })
hl("PreProc", { fg = c.fg })
hl("Special", { fg = c.fg })
-- Diagnostics
hl("DiagnosticError", { fg = c.red })
hl("DiagnosticWarn", { fg = c.yellow })
hl("DiagnosticInfo", { fg = c.blue })
hl("DiagnosticHint", { fg = c.green })
hl("DiagnosticUnderlineError", { undercurl = true, sp = c.red })
hl("DiagnosticUnderlineWarn", { undercurl = true, sp = c.yellow })
hl("DiagnosticUnderlineInfo", { undercurl = true, sp = c.blue })
hl("DiagnosticUnderlineHint", { undercurl = true, sp = c.green })
-- Diff
hl("DiffAdd", { bg = "#28312C" })
hl("DiffDelete", { bg = "#352B2B" })
hl("DiffChange", { bg = "#282D31" })
hl("DiffText", { bg = "#364149" })
-- GitSigns
hl("GitSignsAdd", { fg = c.green })
hl("GitSignsChange", { fg = c.blue })
hl("GitSignsDelete", { fg = c.red })
-- Treesitter links
hl("@comment", { link = "Comment" })
hl("@string", { link = "String" })
hl("@number", { link = "Number" })
hl("@keyword", { link = "Keyword" })
hl("@keyword.function", { link = "Keyword" })
hl("@function", { link = "Function" })
hl("@type", { link = "Type" })
hl("@variable", { fg = c.fg })
hl("@property", { fg = c.fg })
hl("@punctuation", { fg = c.fg })
-- Minimal Monochrome Light
vim.o.background = "light"
vim.g.colors_name = "minimal_mono_light"
local c = {
bg = "#FCFCFC",
fg = "#1A1A1A", -- approximates VS Code #000000DF (alpha not supported here)
fg_soft = "#404040",
comment = "#999999",
subtle = "#D0D0D0",
subtle2 = "#F0F0F0",
cursor = "#1A1A1A",
visual = "#D0D0D0",
red = "#C97A7D",
green = "#5A9E6F",
yellow = "#B8893A",
blue = "#5A8FB8",
magenta = "#8B6BA8",
cyan = "#4A9EA8",
}
local function hl(group, spec)
vim.api.nvim_set_hl(0, group, spec)
end
-- Core UI
hl("Normal", { fg = c.fg, bg = c.bg })
hl("NormalNC", { fg = c.fg, bg = c.bg })
hl("Cursor", { fg = c.bg, bg = c.cursor })
hl("CursorLine", { bg = c.subtle2 })
hl("CursorColumn", { bg = c.subtle2 })
hl("LineNr", { fg = "#7A7A7A" })
hl("CursorLineNr", { fg = c.fg })
hl("SignColumn", { bg = c.bg })
hl("ColorColumn", { bg = c.subtle2 })
hl("Visual", { bg = c.visual })
hl("Search", { bg = "#D9D9D9", fg = c.fg })
hl("IncSearch", { bg = "#D9D9D9", fg = c.fg })
hl("Pmenu", { bg = "#F9F9F9", fg = c.fg })
hl("PmenuSel", { bg = c.subtle2, fg = c.fg })
hl("FloatBorder", { fg = c.subtle, bg = "#F9F9F9" })
hl("NormalFloat", { bg = "#F9F9F9", fg = c.fg })
hl("WinSeparator", { fg = c.subtle })
hl("VertSplit", { fg = c.subtle })
hl("StatusLine", { bg = c.bg, fg = c.fg })
hl("StatusLineNC", { bg = c.bg, fg = "#646464" })
hl("TabLine", { bg = c.bg, fg = "#646464" })
hl("TabLineSel", { bg = c.bg, fg = c.fg, bold = true })
hl("TabLineFill", { bg = c.bg })
-- Syntax (keep mostly monochrome)
hl("Comment", { fg = c.comment })
hl("Constant", { fg = "#777777" })
hl("String", { fg = "#777777" })
hl("Character", { fg = "#777777" })
hl("Number", { fg = "#777777" })
hl("Boolean", { fg = c.fg })
hl("Identifier", { fg = c.fg })
hl("Function", { fg = c.fg })
hl("Statement", { fg = c.fg, bold = true })
hl("Keyword", { fg = c.fg, bold = true })
hl("Operator", { fg = c.fg })
hl("Type", { fg = c.fg })
hl("PreProc", { fg = c.fg })
hl("Special", { fg = c.fg })
-- Diagnostics (subtle but readable)
hl("DiagnosticError", { fg = c.red })
hl("DiagnosticWarn", { fg = c.yellow })
hl("DiagnosticInfo", { fg = c.blue })
hl("DiagnosticHint", { fg = c.green })
hl("DiagnosticUnderlineError", { undercurl = true, sp = c.red })
hl("DiagnosticUnderlineWarn", { undercurl = true, sp = c.yellow })
hl("DiagnosticUnderlineInfo", { undercurl = true, sp = c.blue })
hl("DiagnosticUnderlineHint", { undercurl = true, sp = c.green })
-- Diff
hl("DiffAdd", { bg = "#E8F0EA" })
hl("DiffDelete", { bg = "#F5ECEC" })
hl("DiffChange", { bg = "#E8EEF4" })
hl("DiffText", { bg = "#DDE7EF" })
-- GitSigns (if you use it)
hl("GitSignsAdd", { fg = c.green })
hl("GitSignsChange", { fg = c.blue })
hl("GitSignsDelete", { fg = c.red })
-- Treesitter links (keep simple)
hl("@comment", { link = "Comment" })
hl("@string", { link = "String" })
hl("@number", { link = "Number" })
hl("@keyword", { link = "Keyword" })
hl("@keyword.function", { link = "Keyword" })
hl("@function", { link = "Function" })
hl("@type", { link = "Type" })
hl("@variable", { fg = c.fg })
hl("@property", { fg = c.fg })
hl("@punctuation", { fg = c.fg })
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment