closealistairwhite.net / projects / alistairwhite-net

Projects

Things I’ve built to find out how they work

Hardware, firmware and software I took far enough to break, measure and write down.

All Projects

1 project

The site homepage rendered as a Windows 95 desktop
active
012026

alistairwhite.net

A data-first personal site, fronted by a fake Windows 95 desktop that actually works.

+7
alistairwhite.net/live
The live homepage running inside the project popup
The homepage, live. Boot it, drag the windows around, pick the flowers.

alistairwhite.net

active

A data-first personal site, fronted by a fake Windows 95 desktop that actually works.

A personal site built data-first: every page is rendered per request from a relational schema in Cloudflare D1, with no CMS and no build-time content step. The homepage is a working Windows 95 desktop — CRT boot sequence, draggable windows, a day/night cycle timed to music, and a complete Minesweeper.

My role

Everything — schema design, the data layer, all of the frontend, and the deployment.

The hard part

Two, pulling in opposite directions. The homepage is deliberately maximal and needed to stay at 60 fps while animating an entire landscape, and the content model needed to stay general enough that projects, logs, photos and reading all live in one graph rather than four bespoke tables. Doing both without a framework meant being careful about what runs on every frame.

Approach

Single-table inheritance for content: a shared entries table with per-type satellite tables and an ordered blocks table for anything that varies per entry. On the frontend, no framework at all — plain ES modules, one system per file, with hit targets deliberately separated from the artwork so animation never moves what is under the cursor. The projects page splits its payload by load stage so the grid ships cards only.

What I learned

That the data model is the part worth getting right early. Adding this page needed twelve new columns and two tables but changed nothing that already existed, because the original schema separated what every entry has from what each type has. The frontend lesson was smaller and more surprising: almost every animation bug I hit was a hit-testing bug wearing a costume.

Results

Live at alistairwhite.net, served entirely from Cloudflare Workers with no origin server. Cold pages render in a single round trip to D1, and the homepage holds 60 fps through the full day/night transition.

Read the full write-upDesign decisions, what went wrong, and the engineering log