Skip to content
Subway SeatSubway SeatSubway Seat

A color scheme for the long ride

Mind the gap

Correspondance

Sink into a warmer screen.

Stand clear of the closing tabs.

Take the scenic line.

Subway Seat is a walnut-brown theme from a 1970s subway car: orange bucket seats, wood-grain paneling, cream enamel and a little avocado. Three flavors, 117 ports, one palette.

Paris fills the same slots from its materials, not its map: Guimard's green underfoot, white carrelage in the light, and brass, terracotta, verdigris and enamel on top. Three flavors, 117 ports, the same 26 roles.

London is the same system riding a different network: Corporate Blue turned right down, London brick, the yellow off the platform edge, and the standard red kept rare so it still means something. Three flavors, 117 ports, the same 26 roles.

Three cities, nine flavors

Pick a seat.

Every flavor defines the same 26 roles, so a port written against roles works in all of them. New York rides warm, London rides cool and signal-lit, Paris rides dark iron and brass. Pick one and the whole site changes with you — type, texture and signage included.

Get on board

One line, and you're seated.

The installer looks for the apps you have, shows you the plan and asks once. It uses the flavor you're riding now, and everything it does comes back out with uninstall.

curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor walnut
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor tunnel
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor enamel
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor moquette
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor deep
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor portland
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor guimard
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor catacombes
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor carrelage
Pick your apps, follow light and dark, or clone the repo →

The palette

Nine grounds, four texts, thirteen accents.

The same 26 slots in all three cities. New York fills them warm — blue faded to denim, magenta reassigned to burnt orange. London fills them from its signage: brick, the platform-edge yellow, Corporate Blue and the standard red. Paris fills them from cast iron and the map: brass, ochre, pistachio, and the line colors. Pick a chip to copy it.

Burnt orangeLondon brickBronze #EC7F31#EC7F31#A04800#DE8946#DE8946#A54300#CA9245#CA9245#764C00

keywords, tags, the Claude spinner

Harvest goldHazard lineLaiton #F3BF45#F3BF45#976608#F2C03F#F2C03F#8D6C08#F1BF4B#F1BF4B#916D07

functions, commands, the cursor

AvocadoDistrict greenPatine #ADB956#ADB956#66740F#77C581#77C581#0D8131#70CAA9#70CAA9#218366

strings, additions

Seafoam tileDockland tealVert-de-gris #86AD95#86AD95#3E7157#54B4B5#54B4B5#007376#549B9F#549B9F#006267

types, classes, options

Redbird brightCorporate brightTerre cuite claire #FF8373#FF8373#BF4233#FE8474#FE8474#CC2E25#E7877B#E7877B#AC3B32

numbers, constants, deletions

TerracottaElizabeth violetBrique #F4A87E#F4A87E#843811#AE9EDC#AE9EDC#755FA9#FAB49C#FAB49C#B36B51

escapes, regex, decorators

Faded denimCorporate blueEmail #7F9BAE#7F9BAE#3F6480#7595DA#7595DA#0019A8#709BC8#709BC8#25629B

links and info, the only cool color

In VS Code

Layered like a good living room.

One chrome ground, grooves instead of lines, popovers lifted onto paper, and every hover and selection a thin wash of text color, so they sit right on any surface. This window is painted with the real theme file.

subway-seat
EXPLORER
▾ SUBWAY-SEAT
src
TSboard.ts
TSmta.tsM
TStrips.test.tsU
PYpalette.pyM
MDREADME.md
▸ OUTLINE
▸ TIMELINE
board.tsmta.ts palette.py
src › board.ts › Board › nextArrival
// Northbound — next train on the Sixth Avenue line
import { fetchFeed, type Trip } from "./mta";

type Line = "B" | "D" | "F" | "M";

@cached(30)
export class Board<T extends Trip> {
  private readonly stops = new Map<string, number>();

  async nextArrival(line: Line, stop = 42): Promise<number> {
    const feed = await fetchFeed(`/gtfs/${line}`);
    if (!feed.ok) throw new Error("signal problems\n");
    return feed.trips.filter((t: T) => t.stop === stop).length;
  }
}
okboolean
tripsTrip[]
ƒtoJSON() => object
statusnumber
PROBLEMSOUTPUTTERMINAL
bun test board
nextArrival returns the soonest train [4.2ms]
handles signal problems src/board.ts:12
» subway⎇ main*⚠ 1Ln 13, Col 12TypeScript

In the terminal

Ghostty, fish and friends.

The 16 ANSI colors are chosen so terminal tools land in the palette too, and each city reassigns the ones it has no use for: New York turns magenta into burnt orange and cyan into seafoam tile, London keeps blue for Corporate Blue alone, Paris puts brass where yellow goes. Starship's segments become a stripe of four.

oddur~/Code/subway-seat⎇ main !2⬢ v26.4◷ 12:48
git commit -m "stand clear of the closing doors"
[main 4d0899a] stand clear of the closing doors
2 files changed, 14 insertions(+), 3 deletions(-)

oddur~/Code/subway-seat⎇ main !2⬢ v26.4◷ 12:48
ll
drwxr-xr-x - oddur 10 Sep 12:48 dist
.rw-r--r-- 3.1k oddur 10 Sep 12:51 palette.py
.rwxr-xr-x 2.2k oddur 10 Sep 12:52 install.sh

oddur~/Code/subway-seat⎇ main !2⬢ v26.4◷ 12:48
rg arrival
src/board.ts
10: async nextArrival(line: Line, stop = 42)
31: const eta = arrival.minutes;

oddur~/Code/subway-seat⎇ main !2⬢ v26.4◷ 12:48
cd ~/Code/savaos
SPACES
subway-seatmain
extraction evaleval/v3 +12
document formattingdocs ~2
savaosmain
AGENTS
claudeworking
claudeneeds you
make the ground read brown, not black Update(palette.py) Updated palette.py with 1 addition and 1 removal 12 - base = "#2A1D14" 12 + base = "#362619" ⏺ Walnut now sits at 15% lightness, saturated enough to read as wood paneling. ✻ Percolating… (6s · ↓ 312 tokens) ⏵⏵ accept edits on (shift+tab to cycle)

In Claude Code

Themed all the way down.

Claude Code v2.1.268
Opus 4.7 · Claude Max
~/Code/subway-seat
find me a window seat, and check the seat tests still pass
2 background agents launched (↓ to manage)
Compare seat maps for the R46
Run the seat tests
Read 1 file
Update(src/car.ts)
Added 1 line, removed 1 line
9 car: 7431,
10 row: 7,
11 line: "F",
12 - window: false,
12 + window: true,
13 };
Row 7 on the F has the window, and it faces forward. I've marked it; the seat tests are still running.
Reading the Vignelli map (14s · ↓ 1.8k tokens)
Next stop: /clear gives you a fresh car. Stand clear of the closing doors.
Opus 4.7~/Code/subway-seat main !2load 42%$0.84
⏵⏵ accept edits on (shift+tab to cycle)
main
Compare seat maps for the R46Reading docs/cars/r46.md42.1k
Run the seat tests8.4k

Most themes stop at colors. This one follows Claude Code into every corner it lets you touch, and it all comes as one plugin.

  • A theme for every flavor Walnut, Tunnel, Enamel, with every one of Claude Code's color tokens set. Each also comes in a “terminal colors” version that colors code in diffs with your terminal's palette instead of Claude Code's Monokai.
  • A station-sign status line The model as a bullet, where you are, the line you're on, how full the car is, and the fare or your plan's pass.
  • Subagent rows Each helper gets a bullet colored by its state and its own little load meter.
  • Spinner verbs “Reading the Vignelli map”, “Riding the local”, “Running express”…
  • “Next stop” tips Real Claude Code tips, in the same unhurried voice.
  • A relaxed output style Warm and plain-spoken, never at the expense of being exact.
  • A theme for every flavor Moquette, Deep Level, Portland, with every one of Claude Code's color tokens set. Each also comes in a “terminal colors” version that colors code in diffs with your terminal's palette instead of Claude Code's Monokai.
  • A station-sign status line The model as a bullet, where you are, the line you're on, how full the car is, and the fare or your plan's pass.
  • Subagent rows Each helper gets a bullet colored by its state and its own little load meter.
  • Spinner verbs “Reading the diagram”, “Minding the gap”, “Standing clear of the doors”…
  • “Next stop” tips Real Claude Code tips, in the same unhurried voice.
  • A relaxed output style Warm and plain-spoken, never at the expense of being exact.
  • A theme for every flavor Guimard, Catacombes, Carrelage, with every one of Claude Code's color tokens set. Each also comes in a “terminal colors” version that colors code in diffs with your terminal's palette instead of Claude Code's Monokai.
  • A station-sign status line The model as a bullet, where you are, the line you're on, how full the car is, and the fare or your plan's pass.
  • Subagent rows Each helper gets a bullet colored by its state and its own little load meter.
  • Spinner verbs “Reading the plan”, “Waiting for the correspondance”, “Changing at Chatelet”…
  • “Next stop” tips Real Claude Code tips, in the same unhurried voice.
  • A relaxed output style Warm and plain-spoken, never at the expense of being exact.
/plugin marketplace add oddurs/subway-seat
/plugin install subway-seat@subway-seat
/subway-seat:setup
Every file in the plugin →

Ports

117 ports and counting.

Every port is generated from the same palette, in all six flavors, with install steps and the full file to copy. Not one of them knows which city it's in.

117 ports

Terminals20

Editors16

Agents7

Shell & prompt5

CLI & TUI26

Apps17

Desktop9

Palettes & formats17

Last stop

Alight here

Take a seat.

Mind the gap.

One line finds the apps you have, shows you the plan, and asks once before it touches anything. Everything it does comes back out again.

curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor walnut
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor tunnel
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor enamel
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor moquette
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor deep
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor portland
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor guimard
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor catacombes
curl -fsSL https://oddurs.github.io/subway-seat/install.sh | sh -s -- --flavor carrelage
117
apps covered
1
question, once
0
left behind on uninstall
Pick your apps, follow light and dark, or clone the repo →