Skip to content

Colophon

How this site is made — the light, the letters, the files.

The light

Six sections, six hues, one rule: every surface shares oklch(0.88 0.055 h), so no face dominates. Posts drift from their section by a hash of their slug — ±8° of hue, ±0.03 lightness, ±0.015 chroma — and every derivable shade is contrast-tested at build time: body ink ≥ 7:1, everything else ≥ 4.5:1, or the build refuses. The full proof lives on the swatch page.

facehuesurfaceaccentspecimen
Journal18°#facaca#902634Aa aeiou
Frames62°#f3d0b3#794301Aa aeiou
Motion112°#d8dcb2#545701Aa aeiou
Sound168°#b5e4d1#016249Aa aeiou
Signal238°#b7def8#015981Aa aeiou
About302°#ded0f6#623a91Aa aeiou

The letters

Display: Fraunces (variable, OFL) with its SOFT and WONK axes engaged — the same substance, seen at a slight angle, which is the site's whole argument. Body: Hanken Grotesk (OFL), standing in until Switzer is supplied. Mono: JetBrains Mono (OFL) for captions, EXIF, timestamps, durations, and code. All self-hosted, subset to Latin + Latin Extended; no CDN is consulted. The type scale is modular 1.25 anchored on a 19px reading size, nine steps, no exceptions.

Fraunces carries the headlinesHanken Grotesk carries the readingJetBrains Mono keeps the records

The files

Next.js (App Router, static export), React, Tailwind CSS v4, React Three Fiber for the homepage, MDX for the writing (validated by Zod at build — a malformed post cannot ship), Shiki for code with a theme generated from the Signal hue, wavesurfer for the waveforms, Pagefind for search. The output is a directory of files; any static host can serve it, and rsync can move it. Sample imagery, audio, and video are currently procedural placeholders, generated from each post's own shade.

Analytics: none at present. If any are added they will be cookieless (Plausible or Umami) — this site does not want a consent banner, and earns that by not needing one.