Oshen.nvim

June 12, 2026 · View on GitHub

A Neovim colorscheme inspired by deep ocean water — five colors drawn from the sea's amber bioluminescence, sea foam, midnight navy, and the shifting blues between shallow and abyss. Ships dark (oshen-night) and light (oshen-day) variants, with first-class support for transparent terminals, and built to stay out of the way while you work.

Named after shenfiles, my personal dotfiles.

Code

Oil

Oil

Snacks picker

Snacks picker


Requirements


Installation

lazy.nvim

{
  "54L1M/Oshen.nvim",
  lazy = false,
  priority = 1000,
  config = function()
    require("oshen").setup({
      transparent = true, -- set false for opaque background
    })
    vim.cmd.colorscheme("oshen-night") -- or "oshen-day" for light
  end,
}

rocks.nvim

[plugins]
"Oshen.nvim" = "scm"

Configuration

require("oshen").setup({
  -- Remove all background colors so your terminal wallpaper shows through.
  -- Pairs well with ghostty's background-opacity setting.
  transparent = false, -- default
})

Light mode

Oshen ships both a dark and a light palette as two colorscheme variants. Each sets Neovim's background option for you, and Oshen re-applies itself automatically whenever background changes. Pick one in your config:

vim.cmd.colorscheme("oshen-night")  -- dark
vim.cmd.colorscheme("oshen-day")    -- light

Toggle at runtime — the colorscheme updates live:

:set background=light
:set background=dark

Both variants (oshen-day, oshen-night) appear as separate, previewable entries in colorscheme pickers like fzf-lua and Telescope.

Note: transparent is a dark-mode feature. The light palette depends on its solid backgrounds, so transparency is automatically disabled when background=light.


Features

  • Transparent background support — your wallpaper shows through everywhere
  • Treesitter semantic highlight groups
  • LSP diagnostics and semantic tokens
  • Modular architecture — groups and integrations are isolated files, easy to extend
  • JetBrainsMono Nerd Font glyph-aware

Plugin support

Plugin
gitsigns.nvim
blink.cmp
oil.nvim
snacks.nvim
lualine.nvim✓ built-in theme
which-key.nvim
vim-illuminate
nvim-ufo
render-markdown.nvim
todo-comments.nvim
nvim-treesitter-context
nvim-dap
harpoon
mini.nvim
tiny-inline-diagnostic.nvim

Palette

Source colors

The entire scheme is derived from five source colors. Nothing more.

RoleHexPreview
Keywords / Numbers#ffb703#ffb703
Foreground#f1faee#f1faee
Functions#abdadc#abdadc
Borders / Accents#457b9d#457b9d
Selection / UI#1d3567#1d3567
Full palette

Backgrounds

NameHexPreviewUsage
crust#060810#060810Deepest background, extreme fills
mantle#090c12#090c12Panels, popups, sidebars
base#0e1117#0e1117Main editor background

Surfaces

NameHexPreviewUsage
surface0#131c2b#131c2bCursorline, word highlights
surface1#1e2d42#1e2d42Raised UI (TreesitterContext, etc.)
surface2#2a3f58#2a3f58Hover states, picker selections

Overlays

NameHexPreviewUsage
overlay0#3d5570#3d5570Invisible guides, whitespace chars
overlay1#526d82#526d82Comments, inactive line numbers
overlay2#6a8599#6a8599Operators, punctuation, conceal

Text tiers

NameHexPreviewUsage
subtext0#8899aa#8899aaSecondary info, statusline text
subtext1#b0c4d8#b0c4d8Brighter secondary, parameters
text#f1faee#f1faeeMain foreground

Accents

NameHexPreviewUsage
amber#ffb703#ffb703Keywords, numbers, cursor
peach#e8944a#e8944aWarnings, orange tokens
green#a8c97f#a8c97fStrings, git added
sky#7ab8d4#7ab8d4String escapes, special punctuation
teal#abdadc#abdadcFunctions, info diagnostics
steel#457b9d#457b9dBorders, accents
lavender#c3a0d8#c3a0d8Types, hints, constructors
red#e05c6e#e05c6eErrors, git deleted
navy#1d3567#1d3567Visual selection, deep UI chrome

Lualine

A built-in lualine theme is included. The b and c sections use NONE background so they blend into a transparent terminal.

require("lualine").setup({
  options = {
    theme = require("oshen.integrations.lualine").get(),
    section_separators = "",
    component_separators = "",
  },
})

Mode colors:

ModeHexNamePreview
NORMAL#abdadcteal#abdadc
INSERT#a8c97fgreen#a8c97f
VISUAL#c3a0d8lavender#c3a0d8
COMMAND#ffb703amber#ffb703
REPLACE#e05c6ered#e05c6e

Plugin structure

lua/oshen/
├── init.lua                   public API (setup / load / get_palette)
├── palette.lua                all color definitions
├── highlights.lua             thin orchestrator — loads groups + integrations
├── groups/
│   ├── editor.lua             core editor UI
│   ├── syntax.lua             legacy vim syntax groups
│   ├── treesitter.lua         @capture groups
│   ├── lsp.lua                LSP diagnostics
│   ├── semantic_tokens.lua    @lsp.type.* and @lsp.mod.*
│   └── terminal.lua           vim.g.terminal_color_N
└── integrations/
    ├── lualine.lua
    ├── gitsigns.lua
    ├── illuminate.lua
    ├── blink.lua
    ├── oil.lua
    ├── snacks.lua
    ├── whichkey.lua
    ├── ufo.lua
    ├── render_markdown.lua
    ├── todo_comments.lua
    ├── treesitter_context.lua
    ├── dap.lua
    ├── harpoon.lua
    ├── mini.lua
    └── tiny_inline_diagnostic.lua

Adding a new integration

Create lua/oshen/integrations/myplugin.lua following this pattern:

local M = {}

local function hi(group, opts)
  vim.api.nvim_set_hl(0, group, opts)
end

function M.apply(p, transparent)
  hi("MyPluginNormal", { fg = p.text, bg = transparent and p.none or p.mantle })
end

return M

Then add "oshen.integrations.myplugin" to the integrations list in highlights.lua.


Accessing the palette

Other plugins or your own config can read the full color table:

local p = require("oshen").get_palette()

-- Example: custom indent-blankline colors
vim.api.nvim_set_hl(0, "IblIndent", { fg = p.overlay0 })
vim.api.nvim_set_hl(0, "IblScope",  { fg = p.overlay2 })

Ghostty + tmux

A matching Ghostty config and tmux palette are included in shenfiles.

Ghostty settings used with this theme:

background-opacity = 0.65
font-family = "JetBrainsMono Nerd Font Mono"

Contributing

Issues and PRs are welcome — especially for plugin integrations not listed above.

See CONTRIBUTING.md for setup instructions, the integration pattern, commit style, and PR guidelines.


License

MIT