A cohesive theme system

One palette.
Every tool.

One palette mapped onto every tool you live in — editor, terminal, prompt, notes, launcher, chat. Strings stay teal whichever surface you're on. Errors stay rose.

Beta All themes and the CLI are in beta — feedback welcome. See the changelog →

31
shipping themes
1
palette contract
No
hand-matched ports

Why Slatewave

Stop re-picking colors for every tool.

Same colors,
every surface.

Strings stay teal whether you're in VSCode, bat, Helix, or Sublime. Errors stay rose. The palette doesn't reset when you switch tools.

Mapped,
not approximated.

Each port maps the same semantic roles to its native theme keys — terminal.ansi* in VSCode, theme[plus_emph_style] in delta. No eyeballing screenshots.

Adopt one.
Add the rest.

Install the editor theme today. The terminal, prompt, notes app, launcher, and chat ports all use the same hex values when you're ready for them.

Start here

Install Slatewave where it will change your day first.

Pick the workflow you use most, copy the install command, then expand the same palette across the rest of your setup.

Most direct

Start in VSCode or Cursor

Get the editor palette first: syntax, workbench chrome, selections, and diff colors all tuned for long sessions.

Install editor theme →

Terminal-first

Match your prompt and shell

Carry the same slate foundation and teal accent into Oh My Posh, Starship, Ghostty, tmux, and terminal palettes.

Use terminal bundle →

One command

Install the whole family at once

brew install the Slatewave CLI, then slatewave init detects what's on your machine and installs every theme you pick — backups, uninstall, and all.

Install the CLI →

The same palette, everywhere

A few surfaces. One visual language.

Editor, terminal, notes — three of the 31 shipping themes, rendered with the authoritative Slatewave palette. These previews aren't screenshots; they use the same colors you'd install. See all 31 themes →

Editor · VSCode

View theme →
// slatewave/palette.ts
export const accent = '#5eead4';

export interface Theme {
  name: string;
  surface: 'editor' | 'terminal' | 'notes';
}

export function apply(theme: Theme): string {
  return `${theme.name} on ${theme.surface}`;
}

Terminal · Oh My Posh

View theme →
/ Dev / getslatewave main ↑11 ✏?3 ~1
101ms CPU: 80.49% RAM: 68/68GB 1:43 AM
git status
/ Dev / getslatewave main ↑11 ✏?3 ~1
124ms CPU: 34.12% RAM: 14/16GB 1:44 AM
docker ps
/ Dev / getslatewave main ↑11 ✏?3 ~1
245ms CPU: 54.80% RAM: 24/32GB 1:45 AM

Notes · Obsidian

View theme →

Slatewave Preview

Headings

Plain body text sits at var(--sw-slate-200) over the slate editor. Bold brightens toward #f1f5f9 so emphasis reads clearly. Italics shift muted toward var(--sw-slate-300).

Links and tags

Tags travel inline — #slatewave #theme/preview #demo

Lists

  • First item with a pink marker
  • Second item
  • Nested item (indentation guide on the left)
    • Deeper still
  • Back to the root

The palette

A single source of truth.

Every Slatewave theme is generated from this palette. Change a role here, and the same role shifts everywhere else.

  • Slate 900 bg.inset #0f172a
  • Slate 800 bg.elevated #1e293b
  • Slate Chrome bg.raised #21252b
  • Slate Editor bg.base #282c34
  • Slate 500 fg.faint #64748b
  • Slate 300 fg.muted #cbd5e1
  • Slate 200 fg.default #e2e8f0
  • Teal 300 accent — signature #5eead4
  • Teal 200 syntax.string #99f6e4
  • Sky 400 syntax.keyword #38bdf8
  • Rose 400 syntax.constant #fb7185
  • Purple syntax.language #b388ff
  • Amber 400 syntax.escape #fbbf24
  • Coherent

    Every theme is generated from the same palette, not ported by eye.

  • Calm

    Tuned for long sessions: high legibility, low chromatic fatigue.

  • Open

    Every theme lives in its own public repo under the WTFPL — do what you want with it.