Colophon

What this site is made of, and roughly how much of it there is.

Posts
31
Words
19,297
Photos
484

Posts, words, and photos are counted at build time. The rest is read from two Cloudflare Workers described below.

Site

React and TypeScript, built with Vite and prerendered to static HTML by vite-react-ssg. Pushing to main builds the site with GitHub Actions and publishes it to GitHub Pages.

Posts are Markdown files in the repo next to the code, including this page.

My website was hosted on Squarespace for many years, but in 2026 I decided to rewrite and host it elsewhere to save money and experiment with web technologies.

Bluesky

Every blog post is also published to my Bluesky account as a standard.site record, so it also shows up in the AT Protocol network as a longform document.

Moving parts

Two Cloudflare Workers (Listening and Reading) power the data used by listening, reading, log, and the homepage: Listening pulls scrobbles from Last.fm into a D1 archive on a cron schedule. Reading pulls read books from my Hardcover account daily and takes saved articles I send from my phone and personal computer via a POST request I make to an authenticated endpoint in this worker. Each serves a cached JSON bundle the page fetches in the browser.

The Listening Worker keeps its precomputed aggregates in KV, so answering a request means reading a few small blobs rather than scanning the whole scrobble archive. Those are rebuilt on the cron, on slower cadences the further back they reach. The Reading Worker doesn't use KV at all since book and article data is written less frequently than my music data.

Both Workers also render themselves as text when accessed not through a browser:

curl listening.cailinpitt.com
curl reading.cailinpitt.com

Photographs

484 photographs across 10 galleries, served from Cloudflare R2. A local script compresses each original photo to WebP and uploads them to a bucket, so no photo is ever committed to the repo. EXIF data is read from original photos and included on the website (camera type and settings).

24 of them carry a location, shown on the photo map. Photo locations are at a neighborhood level and not the exact spot a photo was taken.