Timeline
The design of this site over the years
History
November 2026
Minor homepage refreshI simplified a few things on the homepage. Made the intro section a bit more concise so you can see the recent posts sooner. Moved the visual carousels to the bottom along with the email subscribe field which is the same width and feels more at home there. Also updated some colors to make hierarchy for the sections more apparent while cleaning up tabs, like the new favorites tab for posts.


As part of my post The Leica reset I built a new photo carousel component and a new full-screen media viewer. The carousel shows photos and videos with captions and properly aligns media how I like it in the article regardless of the aspect ratio.
Clicking any photo (from a carousel, photoset, or just a regular image in an article) now opens the media viewer. It supports all the expected gestures on mobile too. It replaced the modified third-party lightbox I had been using for a few years.
Table of contentsIt's no secret that many of my articles are quite long. In a previous design of this website a few years ago I had not only an table of contents card inline but also a smaller one you could access at any time on the side. I never brought that over when I redesigned so I decided it was time while I was writing my recent Leica article.
A few details:
- It fades and slides in once the inline table of contents scrolls out of view. Each section is shown as a thin line, with longer lines for top-level sections and shorter ones for subsections. Sections you've already read are a shade darker than the ones ahead.
- As you scroll, the widest line marks the section you're in, then glides toward the next one as you reach the last quarter of the current section.
- Hovering magnifies the lines around your cursor like the macOS Dock and shows the section's name.
- When your cursor leaves, the lines spring back past their resting widths and settle, with the bounce rippling outward from where the cursor left.
- It fades back when a full-width photo or carousel passes behind it, and it only shows on wider screens with a mouse or trackpad.
October 2026
I simplified my photostream stack a bit and moved away from the Neon postgres database it used. It now uses a Cloudflare D1 database. I wanted to avoid having too many different service providers. I use Cloudflare for everything else from image hosting to Workers so it was nice to cut out Neon.
Similarly, I removed PostHog from my stack. I had used it for web analytics for probably the last 6 months after moving away from Fathom Analytics. I originally moved off of Fathom Analytics after a price increase made me rethink how much I needed it. I found PostHog and it had a robust set of functionality that included a free tier that completely covered my needs. However, over time I really began to hate using it. It feels like a bloated app and I hated logging in each time to the one page I cared about.
So I began thinking what I really needed analytics for that Cloudflare's own analytics couldn't do for me. I care about two things mainly: overall site traffic and if there are any interesting new referrers so I can see who's linking to me and any conversation happening elsewhere about my content. I ended up building a new tool that I host on another Cloudflare Worker that processes the data captured by Cloudflare's advanced web edge analytics. It's not super realtime but it does the job for me.
September 2026
I moved this site from Next.js hosted on Vercel to TanStack Start hosted on Cloudflare. I've been with Next and Vercel for about two years and really had no complaints, but wanted to try out a new setup. With this migration I also moved all my media from S3 with CloudFront to R2, along with putting the entire site behind Cloudflare's proxy.
The move was a bit involved as my photostream has a few moving parts, including an image manipulation pipeline and database. Some of this isn't feasible with a Cloudflare worker alone, so I also have a separate Cloudflare container that manages my admin tasks like uploading and resizing huge images. One thing I really love about Cloudflare is its robust Zero Trust Access functionality, letting me protect/prevent access to any path.
It's still early but the new setup already feels faster.
Summer 2026
I designed and built a new photostream page to make it easier for me to share individual photos I've captured instead of only the larger photosets I publish on the photos page.
This was a fun project to build. It uses a Neon database and Cloudflare R2 storage with Cloudflare Image Transformations. I also have a little admin dashboard I built to let me drag photos in to upload, where EXIF data is imported and cleaned, while also letting me manage metadata like captions and linking to other photosets.
2025
I recently added a dark mode to the site after migrating to Next.js v15 and Tailwind CSS v4.1. I didn't want to do a basic black style dark mode so I worked on a dark greenish theme that I felt was complementary to the warm light mode theme. Also, I just like green.
I used the View Transition API along with an SVG filter to add a reveal animation to changing the theme. The theme toggle is the system setting by default, then if you click it, it will cycle through light and dark modes. It sets a cookie to store this setting so refreshing the page doesn't result in a flash of the wrong theme.
Mid 2024
Over several months in 2024 I began slowly designing and building the current site from scratch. It no longer uses the Jekyll static site generator in favor of Next.js.
Posts are all now converted to Markdown (MDX files); when I was on Jekyll I mostly wrote posts with HTML markup. It's hosted on Vercel, with some media still hosted on CloudFront. More to come about how I built it.

2021 - 2024


Gear page with custom-designed SVG icons for each category


I used to have a section called "Briefs" where I put smaller posts.
2019


2017

2015

2013

2011

It was in 2011 that I moved away from WordPress to Jekyll.
2010

2009

2008

2006

2005

