ZM Photos
photos.zjm.me
In 2026 I started getting more serious about photography. In the past, I had posted my photos to Instagram, usually during some trip. The descriptions got longer as I found people liked reading about my travel. But I hated relying on Instagram, and I wanted more control over the quality and metadata of the photos. So I decided to build my own photo website, which I could link to from Instagram and Bluesky.
There’s no doubt AI has changed programming, and my photo site is a perfect example. I still love programming, and I have no reservations about getting into the weeds when I need to. But for a project like this, I was more interested in the design and outcome of it than actually implementing it myself. So for the most part, the code was written with Claude in a tight design feedback loop. This sometimes did require looking under the hood to make sure things were done correctly, but overall it was a pleasant cycle of design, test, loop. The speed of AI code allows you to experiment more ambitiously.
The look of the site was inspired by my film camera, the Pentax MX. I found fonts that best matched the Pentax logo (Archivo) and the copy in the manual (Univers). The “MX” logo on the camera is one of my favorites, so I spent a good amount of time reconstructing it in Affinity Designer and adapting it to my own “ZM” logo.
One of the first things I added was simple analytics. As much as I hate the invasive ways most websites track users, I recognize the need for some feedback for site owners. I was most interested in how many users saw each post, and how they got there. The simplest, least invasive method I could think of was leaving an anonymous visitor ID cookie on each device to avoid double-counting views. Links I post in different outlets carry a tag to let me know when visitors use those links. The result is a collection of graphs that help me see how users are using the site without tracking or identifying them.
An early benefit of those analytics was discovering that most users viewed the site from a mobile device (as expected), but that users didn’t realize the mobile view had a photo carousel they could swipe through. This led to some iteration on how to present the carousel in a more intuitive way.