Skip to content

devbydaniel/houston.nvim

Repository files navigation

houston.nvim

lint License: MIT Latest Release Neovim

A Neovim port of the Houston VSCode theme by Astro.

Pure Lua, no dependencies, faithful translation of the original TextMate scope mappings, treesitter + LSP semantic tokens, and a bundled lualine theme. 1138 highlight groups covering treesitter, LSP, and 25+ popular plugins out of the box.

Screenshots

TypeScript Astro
Lua Markdown

Palette

Role Hex
bg #17191e
bg_panel #23262d
bg_float #343841
fg #eef0f9
fg_dim #bfc1c9
fg_muted #858b98
fg_subtle #545864
blue #54b9ff
cyan #00daef
mint #4bf3c8
peach #ffd493
magenta #cc75f4
lavender #acafff
red #f44747
pink #f4587e

Requirements

  • Neovim ≥ 0.9 (treesitter highlight groups assume the modern @-prefixed capture names introduced in 0.8/0.9)
  • A terminal with true-color support (termguicolors)

Installation

lazy.nvim

{
  "devbydaniel/houston.nvim",
  lazy = false,
  priority = 1000,
  config = function()
    require("houston").setup({
      transparent = false,
      italic_comments = true,
    })
    vim.cmd.colorscheme("houston")
  end,
}

setup() is optional — :colorscheme houston works on its own with default options.

packer.nvim

use({
  "devbydaniel/houston.nvim",
  config = function()
    vim.cmd.colorscheme("houston")
  end,
})

vim-plug

Plug 'devbydaniel/houston.nvim'
" later, after plug#end():
colorscheme houston

Configuration

Defaults:

require("houston").setup({
  transparent = false,      -- transparent background
  italic_comments = true,   -- italic comments
  terminal_colors = true,   -- set vim.g.terminal_color_*
  styles = {
    keywords  = {},
    functions = {},
    variables = {},
    booleans  = {},
    types     = {},
  },
  -- Mutate the palette before highlights are built
  on_colors = function(colors) end,
  -- Mutate highlight groups before they're applied
  on_highlights = function(highlights, colors) end,
})

Examples

Override a color globally:

require("houston").setup({
  on_colors = function(c)
    c.bg = "#000000"
  end,
})

Override a single highlight group:

require("houston").setup({
  on_highlights = function(hl, c)
    hl.Comment = { fg = c.fg_muted, italic = true }
  end,
})

lualine

A lualine theme is bundled:

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

Supported plugins

Foundation:

  • Treesitter (@-prefixed capture groups)
  • LSP diagnostics, references, inlay hints, and semantic tokens (including the readonly modifier so JS/TS const references render in lavender)

Editor & navigation:

Completion:

LSP & diagnostics:

Git:

Markdown:

AI:

Debug:

UI & misc:

Missing one you use? Open an issue or send a PR — see CONTRIBUTING.md.

Structure

houston.nvim/
├── colors/houston.lua            # entry point (`:colorscheme houston`)
├── lua/
│   ├── houston/
│   │   ├── init.lua               # load() + setup()
│   │   ├── config.lua             # defaults + HoustonConfig type
│   │   ├── palette.lua            # raw hex values
│   │   └── groups/
│   │       ├── editor.lua          # core editor groups
│   │       ├── syntax.lua          # legacy vim syntax
│   │       ├── treesitter.lua      # @ capture groups
│   │       ├── lsp.lua             # diagnostics + semantic tokens
│   │       └── plugins.lua         # plugin highlights
│   └── lualine/themes/houston.lua
└── extras/houston-vscode.json    # source theme JSON for reference

Contributing

Issues and PRs welcome. See CONTRIBUTING.md for the project layout, local dev loop, and the Conventional Commits cheat sheet (used by release-please to automate the CHANGELOG and version bumps).

Credits

License

MIT. The original Houston VSCode theme is also MIT-licensed by The Astro Technology Company; see NOTICE for details.