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.
- Neovim >= 0.9
- A terminal with
termguicolorssupport - JetBrainsMono Nerd Font (recommended)
{
"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,
}[plugins]
"Oshen.nvim" = "scm"require("oshen").setup({
-- Remove all background colors so your terminal wallpaper shows through.
-- Pairs well with ghostty's background-opacity setting.
transparent = false, -- default
})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") -- lightToggle at runtime — the colorscheme updates live:
:set background=light
:set background=darkBoth variants (oshen-day, oshen-night) appear as separate, previewable
entries in colorscheme pickers like
fzf-lua and
Telescope.
Note:
transparentis a dark-mode feature. The light palette depends on its solid backgrounds, so transparency is automatically disabled whenbackground=light.
- 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 | |
|---|---|
| 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 | ✓ |
Source colors
The entire scheme is derived from five source colors. Nothing more.
| Role | Hex | Preview |
|---|---|---|
| Keywords / Numbers | #ffb703 |
|
| Foreground | #f1faee |
|
| Functions | #abdadc |
|
| Borders / Accents | #457b9d |
|
| Selection / UI | #1d3567 |
Full palette
Backgrounds
| Name | Hex | Preview | Usage |
|---|---|---|---|
crust |
#060810 |
Deepest background, extreme fills | |
mantle |
#090c12 |
Panels, popups, sidebars | |
base |
#0e1117 |
Main editor background |
Surfaces
| Name | Hex | Preview | Usage |
|---|---|---|---|
surface0 |
#131c2b |
Cursorline, word highlights | |
surface1 |
#1e2d42 |
Raised UI (TreesitterContext, etc.) | |
surface2 |
#2a3f58 |
Hover states, picker selections |
Overlays
| Name | Hex | Preview | Usage |
|---|---|---|---|
overlay0 |
#3d5570 |
Invisible guides, whitespace chars | |
overlay1 |
#526d82 |
Comments, inactive line numbers | |
overlay2 |
#6a8599 |
Operators, punctuation, conceal |
Text tiers
| Name | Hex | Preview | Usage |
|---|---|---|---|
subtext0 |
#8899aa |
Secondary info, statusline text | |
subtext1 |
#b0c4d8 |
Brighter secondary, parameters | |
text |
#f1faee |
Main foreground |
Accents
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:
| Mode | Hex | Name | Preview |
|---|---|---|---|
| NORMAL | #abdadc |
teal | |
| INSERT | #a8c97f |
green | |
| VISUAL | #c3a0d8 |
lavender | |
| COMMAND | #ffb703 |
amber | |
| REPLACE | #e05c6e |
red |
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
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 MThen add "oshen.integrations.myplugin" to the integrations list in highlights.lua.
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 })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"
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.