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.



termguicolors support{
"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") -- 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:
transparentis a dark-mode feature. The light palette depends on its solid backgrounds, so transparency is automatically disabled whenbackground=light.
| 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 | ✓ |
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 |
![]() |
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
| Name | Hex | Preview | Usage |
|---|---|---|---|
amber |
#ffb703 |
![]() |
Keywords, numbers, cursor |
peach |
#e8944a |
![]() |
Warnings, orange tokens |
green |
#a8c97f |
![]() |
Strings, git added |
sky |
#7ab8d4 |
![]() |
String escapes, special punctuation |
teal |
#abdadc |
![]() |
Functions, info diagnostics |
steel |
#457b9d |
![]() |
Borders, accents |
lavender |
#c3a0d8 |
![]() |
Types, hints, constructors |
red |
#e05c6e |
![]() |
Errors, git deleted |
navy |
#1d3567 |
![]() |
Visual selection, deep UI chrome |
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 M
Then 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.