FIELD NOTES / HOW THIS WAS BUILT
Hollow Days is a dawn-patrol surf club and swell journal for a fictional cold-water left, Carrach Point. The audience checks the buoy before the news, so the site opens with instruments instead of marketing: a barreling-wave video hero, then a live-drawn tide curve and swell-period dial rendered like marine gauges. The directive was the ocean is the interface — every section carries water in it: a tide line rising behind content as you scroll, kelp swaying in the margins, and a WebGL pool you can drag wakes across.
Kelp green does the work an off-black usually does, so the dark theme reads as water, not as a default dashboard. Peach is rationed: needles, the now-marker, verdicts, one button.
The days it hollows, we’re there.
FAMILJEN GROTESK — a relaxed grotesk for structure; sturdy but never corporate, like club signage.
the buoy talks in its sleep
FRAUNCES ITALIC (LIGHT, LOW OPTICAL SIZE) — the swell-poetry voice; soft, slightly salt-warped, handwritten-logbook energy.
HS 6.2FT · TP 14.2S · 288° WNW
SPLINE SANS MONO — the buoy-report voice for stamps, tickers, axes and dues.
Both gauges are hand-drawn 2D canvas, DPR-scaled, with honest axes. The tide curve is a real semidiurnal model — an M2 constituent (12.42 h) plus a smaller S2 (12 h) — so highs drift later each day exactly as real tides do. Extremes are found numerically and labelled with times; the “now” marker uses your actual clock.
// tide height in metres above chart datum
h(t) = 2.4 + 1.7·sin(2π(t − 1.51)/12.42)
+ 0.35·sin(2πt/12 + 0.9)
The swell-period dial sweeps 0–20 s over 240° with a groundswell band at 12–20 s. A simulated buoy feed re-targets every five seconds; the needle chases it with an eased pursuit and breathes on top — two stacked sinusoids that mimic heave:
breathe = 0.22·sin(t/1400) + 0.08·sin(t/530)
needle += (period + breathe − needle) · 0.06
The divider is a classic ping-pong wave-equation simulation in WebGL1: a 256×128 float texture stores height in R and velocity in G. Each frame, every texel accelerates toward the average of its neighbours, damped so a wake lasts about four seconds. The pointer injects a Gaussian drop scaled by pointer speed; idle drips keep the pool alive when nobody’s touching it.
// simulation step (fragment shader)
avg = (left + right + up + down) / 4.0;
vel += (avg - height) * 2.0;
vel *= 0.988; // ~4s memory
height += vel;
The render pass derives a normal from the height gradient and lights it with the site palette: deep kelp base, sea-glass diffuse, a peach dawn specular, and a foam crease wherever curvature spikes. Under prefers-reduced-motion, or without float-texture support, the canvas swaps for a calm CSS gradient.
HERO VIDEO: HIGGSFIELD SEEDANCE 2.0 · STILLS: GPT-IMAGE-2 · INSTRUMENTS & WATER: HAND-WRITTEN CANVAS/WEBGL, NO LIBRARIES · TYPE: GOOGLE FONTS
BUILT WITH CLAUDE FOR THE FABLE 25 SERIES. THE FEED IS SIMULATED; THE COLD IS REAL.