~/starikov

Colophon

This site is hand-built with Astro 5 ↗ — static HTML, no client framework — and deployed to GitHub Pages from a single workflow. But the part worth writing down is the color: every palette you can pick here is generated at build time from my dotfiles theme engine, the same colors.json files that theme my terminal. The whole thing is open source ↗.

The pipeline

One schema fans out to nine consumers. A single colors.json per variant drives a set of templates, which generate configs for eight terminal apps. This site is the ninth — app #9 of the theme engine.

The last mile of that pipeline runs live in your browser, too: in system mode a matchMedia listener keeps the theme in step with macOS's own light/dark switch in real time, no reload needed — the same auto-behavior the dotfiles apply in the terminal, mirrored here.

Honest tokens

Terminal palettes are tuned for a terminal, not a document. Used naively as web text they fail contrast — so this site splits them in two. The raw terminal tokens (--bg, --fg, --accent, --border, the sixteen ANSI colors) drive chrome only: borders, fills, accents, the swatches above. --muted is never text — measured, it lands at 1.8–2.5:1 across most variants, well under the readable floor.

The text colors are derived. At build, --text-secondary and --code-comment are computed by mixing color-mix(fg, bg) step by step until they clear the WCAG floors — 4.5:1 for body-adjacent text, 3:1 for large and 14px+ mono. Body fg-on-bg is validated at 4.5:1 for every variant, and any that fails is dropped from the build rather than shipped with a color you can't read. There is no opacity on body text, ever.

This is disclosed here on purpose. It is the web sibling of my validate-themes.sh — the contrast check that runs in the terminal, run again at build for the browser. Authenticity through honesty: the colors are real, and so is the math that makes them legible.

Type specimen

Two families do all the work: Inter for reading and UI, Commit Mono for identity — the wordmark, labels, code, and every terminal echo. No serif.

Inter Variable · body & UI

The quick brown fox jumps over the lazy dog — 0123456789

Commit Mono · identity

~/starikov ❯ theme storm && git commit -m "0O 1lI"

  • Statement 44px · home only
  • Heading 1 32px · h1
  • Heading 2 24px · h2
  • Heading 3 20px · h3
  • Body 16px · reading, 1.5 line-height
  • Small 14px · UI, captions
  • Mono 13px · labels, code

The stack

Astro 5
Static HTML out, Content Layer in. Zero client framework — no React, no hydration tax.
Vanilla TypeScript
The ⌘K palette, the theme runtime, the pre-paint boot script — a few KB of hand-written TS, no islands.
Pagefind
Full-text search indexed at build, loaded on demand. The search runs in your browser, not a server.
GitHub Actions + Pages
One workflow: pull the live sources, generate the themes, build, gate, deploy. A failed build never ships.
Inter + Commit Mono
Self-hosted, subset to latin, preloaded. Metric-matched fallbacks so nothing shifts as they load.

Daily drivers

/uses and /craft fold in here rather than living as their own pages — the hardware and terminal are already public on the live profile card; the short version:

OS
macOS, Linux
Editor
Neovim
Shell
zsh, tmux
Terminal
WezTerm
Keyboards
Keychron Q10 Max (Alice, QMK) · CODE V3 87-Key (Cherry MX Clears)

The craft is the same doctrine as the pipeline above: pulled from live sources at every deploy, gated by tests and a strict build before anything ships, and themed from one engine rather than hand-tuned per page.

Provenance

The 8 curated families (16 live variants) are regenerated on every deploy. This build:

Palette synced from dotfiles@f274559 built 2026-08-09 09:58 UTC

One number on the System card isn't build-time data: editor cold-start (~150ms) was measured locally on 2026-07-26, not this build — there's no neovim on the build runner. Every other System card number (plugin count, dotfiles lines/files, theme variant/family counts) is computed fresh at build, same as the palette above.

Deploy runs ↗ Site source ↗ Theme engine ↗