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
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.
#EC7F31#EC7F31#A04800#DE8946#DE8946#A54300#CA9245#CA9245#764C00keywords, tags, the Claude spinner
#F3BF45#F3BF45#976608#F2C03F#F2C03F#8D6C08#F1BF4B#F1BF4B#916D07functions, commands, the cursor
#ADB956#ADB956#66740F#77C581#77C581#0D8131#70CAA9#70CAA9#218366strings, additions
#86AD95#86AD95#3E7157#54B4B5#54B4B5#007376#549B9F#549B9F#006267types, classes, options
#FF8373#FF8373#BF4233#FE8474#FE8474#CC2E25#E7877B#E7877B#AC3B32numbers, constants, deletions
#F4A87E#F4A87E#843811#AE9EDC#AE9EDC#755FA9#FAB49C#FAB49C#B36B51escapes, regex, decorators
#7F9BAE#7F9BAE#3F6480#7595DA#7595DA#0019A8#709BC8#709BC8#25629Blinks 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.
// 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;
}
}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.
In Claude Code
Themed all the way down.
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:setupPorts
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