The low western sun.

A warm dark color scheme for terminals, editors, and tooling. Cream text, cool dusk ground, color spent where it matters.

dusk.ts
// the west keeps the warmth; the ground goes cool
import { afterglow, indigo } from "./dusk";

export function sunset(hour: number): Sky {
  if (hour < 17) return indigo;
  return afterglow({
    ground: "#2b2428",
    lastLight: "#dccbb5",
    degreesWest: 12,
  });
}

Two tiers, split by the sun

Color means weight. Identifiers stay cream; accent color is spent on token classes that matter, split along the horizon.

Loud tier

Chroma 0.14. Keywords and the cursor carry the saturated half of the family; functions ride one step lighter.

return const if await
sunset() afterglow() map()

Quiet tier

Chroma 0.055, one lightness band. Strings, numbers, and types stay calm so structure reads without sparkle.

"#dccbb5" 'dusk'
17 0.055 Sky string

In VS Code

960+ workbench colors, 66 token rules, semantic tokens, terminal ANSI, diff and git decorations. The full workbench, not just the editor.

nishibi (workspace)
1// roles, not hexes
2export const P = {
3  bg0: "#2b2428",   // canvas
4  fg1: "#dccbb5",   // body text
5  kw:  "#e0567e",
6  fn:  "#ec84b7",
7  str: "#8abaac",
8} satisfies Palette;

Nishibi and Nishibi Light themes, side by side in the extension picker.

In the terminal

The full ANSI 16 set. Claude Code, tmux, and every CLI tool render through your terminal's palette, so one scheme covers them all.

pwsh · claude
~ $ git checkout -b afterglow
Switched to a new branch 'afterglow'
~ $ cargo build --release
   Compiling nishibi v0.3.2
    Finished release [optimized] in 3.4s
~ $ ./nishibi west
afterglow  kw   fn
dusk        str  num  type
~ $ _

Windows Terminal scheme: dark and light, swap with one paste into settings.

In t3code

Full surface mapping: toolbar, sidebar, inputs, focus rings, message surfaces, inline code blocks.

t3code
show me the loud tier
assistant
The saturated half: keywords and functions, chroma 0.14.
const tier1 = { kw, fn };

Theme import, schema v1, with a light variant generated from the same roles.

In Zebar

The palette ships as custom properties, so widgets pull roles straight from the scheme.

cpu 12% mem 46% net 2.1 MB/s 21:34

Widget colors from --nishibi-* custom properties.

The palette

Role-first, not hex-first. Every variant keeps the exact lightness and chroma structure; only the hue family moves. Switch variants in the header to compare.

Ground

bg0#2b2428
bg1#383034
bg2#3e353a
bg3#453d41
bgSide#1f191c
bg1d#30292d

Light

fg0#e9d8c2
fg1#dccbb5
fg4#8d8389
gray#9c9298

Loud tier

kw#e0567e
fn#ec84b7

Quiet tier

str#8abaac
num#ada9cf
type#8fb3ce

Fills

mint#88bc99
gold#c6ae7e

On paper

The same story inverted: warm paper ground, family ink, both accent tiers darkened instead of brightened. Every role passes 4.5:1 on the paper. This panel always shows the light version of the variant you picked.

dusk.ts
// same tokens, paper ground
const paper = dusk("#f9f0eb", { ink: "#3c2e36" });
export function dawn(hour: number): Sky {
  return hour > 6 ? Light.of(paper) : Indigo;
}

Ships as a VS Code theme, a Windows Terminal scheme, and the t3code light variant.