Changelog
This site is a living thing. It grows, breaks, gets rebuilt, and occasionally surprises me.
2018
Original Site Launch
First version with Tachyons CSS, audio player for DJ mixes, Pinboard bookmarks integration, Are.na vibes section, and a shop. The whole thing was held together with good intentions and functional CSS. It worked, somehow.
2019
Markdown Pipeline
Rebuilt the content system with markdown-it parser, table of contents generation, and JSON resume integration. This was the first time the site felt like a real publishing system instead of a bunch of HTML files.
2020
Dark Mode & Photoblog
Implemented dark mode toggle and automated photoblog system. 2020 was the year everyone added dark mode. I also automated photo uploads because life's too short to manually resize images.
2021
Art Section
Added dedicated art pages and updated projects with NBC News and CCRB journalism pieces. The site started pulling double duty as portfolio and blog around this point.
2023
Tailwind Redesign
Ripped out Tachyons and replaced it with Tailwind CSS + Nuxt UI. Added 3D canvas experiments and GitHub data integration. The Tachyons-to-Tailwind migration was one of those things that took a weekend but paid off for years.
2024
Stats Dashboard
Personal metrics aggregating GitHub, YouTube, LastFM, Chess.com, and a bunch of other APIs into one dense dashboard. Two versions: full stats for the web (~2.4KB) and a lite version optimized for iOS Shortcuts (~345 bytes). Because sometimes you want to know your chess rating from your watch.
website2 Launch
Complete rebuild from scratch. Nuxt 3, Docker deployment, new markdown processing pipeline. Fresh start after 6 years on the old stack. The content pipeline goes Obsidian -> processMarkdown.mjs -> structured JSON -> Vue components. Write in your editor, publish with a git push. The way it should be.
Pottery Shop & RSS
Added a pottery page with Stripe checkout because apparently I make ceramics now. Also RSS feed and a public tags.json endpoint. The pottery page was mostly an excuse to learn Stripe's API, but people actually bought things.
Scrap Graph View
Interactive graph visualization of scraps with Supabase backend integration. The precursor to the threads visualization -- same impulse to see how ideas connect, just rougher around the edges.
2025
Flashcard System
Built a full spaced repetition flashcard system because I kept forgetting things I'd already written about. 3D card flip animations, multi-deck support, the whole deal. There's something deeply satisfying about turning your own blog posts into study material. API endpoints for learning data so I can track what sticks.
Threads Visualization
D3 force-directed graph showing how posts, scraps, and tags actually connect to each other. You scroll through 350vh of interconnected content and watch the relationships emerge. Top 25 tags pinned as maypoles down the page in a sine wave. It's the kind of thing that makes you realize how much you've written about the same three topics.
Scraps Browser
New page for browsing the Supabase scraps collection. Tag filtering, metadata display, the whole archival experience. Scraps are the stuff that doesn't quite make it into a blog post but is too good to lose -- bookmarks, notes, fragments of ideas. Now they have a proper home.
Kalshi Predictions Integration
Live prediction market portfolio tracking with real-time P&L, calibration analysis, and position commentary. I wanted to put my money where my forecasts are, literally. Tracks how well-calibrated my bets are against my stated confidence levels. The calibration curve is humbling.
Gear Inventory Overhaul
Rebuilt the gear page with smart unit conversion, favorites, weight-per-category stats, and Tuftian data visualizations. Every piece of gear I own, weighed and categorized. The histogram of weight distribution by category is chef's kiss. 8px baseline grid, ultra-dense tables, sparklines inline. Edward Tufte would approve (I hope).
Tufte-Style Sidenotes
Major typography overhaul. Footnotes now appear as margin notes on desktop, the way Tufte intended. Replaced an 800-line complex sidenotes system with a 113-line client-side plugin that just works. Delete-driven development at its finest. Georgia serif, proper vertical rhythm, the whole editorial treatment.
Dynamic Tags System
Tags endpoint with journalist pyramid ordering -- most important and frequently used tags surface first, like a newsroom would prioritize stories. Also added llms.txt for AI crawlers because the robots should know what they're reading too.
Cryptographic Predictions
10 predictions for 2025-2029, SHA-256 hashed and committed to git. The idea is simple: write down what you think will happen, commit to it in public, then come back later and see how wrong you were. Accountability through math.
Scrapbook View
Data-dense scrapbook view with tag filtering and an enhanced Pinboard bookmarklet with smart tag suggestions. The bookmarklet auto-suggests tags based on the page content, which is the kind of small automation that saves you 3 seconds a hundred times a day.
Predictions API
Built the foundation for the forecasting section. Predictions system with cryptographic verification -- SHA-256 hashes locked into git commits so you can't retroactively claim you predicted something you didn't. Honest futures.
2026
The Great Alt Text Campaign
Added AI-generated descriptions to 881 images because every reader deserves to know what they're looking at. Used Claude's vision API with a content-first prompt, confidence scoring, and a manual review queue for the tricky ones. Also restored 87 dead Cloudinary images from backups and replaced 10 dead links with Internet Archive URLs. Accessibility isn't a feature, it's the floor.
Raw git commits (1)
OCT 12, 2026
Merge 72e91e7b2b033e1fb6f4c98aa872f794de6a80ed into b8fa186dfd05f1a6641927ee47dcab421173068f
EJ Fox · 2:32 PM