History
Built with TanStack Start2026—Now
Moved to TanStack Start, and moved from Vercel to a Cloudflare setup: Workers, Image Transformations, and a Cloudflare container to handle a media workflow when I add new photos to my /photostream pages. I also migrated my media from S3 with CloudFront to Cloudflare R2.
Built with Next.js2024—2026
Built from the ground up; an entirely new site and design from scratch. Posts are now Markdown based with custom components (MDX files), such as a new photoset component, footnotes, and more. Hosted on Vercel, with most media on CloudFront.
Built with Jekyll (static site generator)2011—2024
Custom theme for the entire period, hosted on a server at first, then with static files directly on AWS S3 with CloudFront, then with Netlify.
Built with WordPress2005—2011
With various themes (K2, my mod Deviance, my theme 281, a modified Thesis theme), hosted on various servers: locally on my G4 Mac Mini, then on MediaTemple.

November 2026
Minor homepage refresh

I 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.

Before
After
PaulStamatiou.com homepage before the November 2026 refresh
PaulStamatiou.com homepage after the November 2026 refresh
New photo carousel component and media viewer

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 contents

It'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.

finally built a proper photostream to share one-off photos https://t.co/T6LmVFBJ7s neon database, cloudflare r2 image transformations, full admin panel for me to edit metadata and upload without a deploy, dev and prod envs where changes can be sync'd if i need but most https://t.co/r0zH1zBHT8 View full post →
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.

finally got around to updating my site to @nextjs 15 + @tailwindcss v4. finally added a dark mode which was quite nice with oklch() + v4 theme vars. i made it greenish to complement my warm light mode. also used View Transition API + svg filter for this theme reveal effect. https://t.co/avLrwfFSto View full post →
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.

PaulStamatiou.com in late 2024
2021 - 2024
PaulStamatiou.com in 2024
PaulStamatiou.com gear page in 2022

Gear page with custom-designed SVG icons for each category

PaulStamatiou.com in late 2021
PaulStamatiou.com in 2021

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

2019
PaulStamatiou.com in 2019
PaulStamatiou.com about page in 2019
2017
PaulStamatiou.com in 2017
2015
PaulStamatiou.com in 2015
2013
PaulStamatiou.com in 2013
2011
PaulStamatiou.com in 2011

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

2010
PaulStamatiou.com in 2010
2009
PaulStamatiou.com in 2009
2008
PaulStamatiou.com in 2008
2006
PaulStamatiou.com in 2006
2005
PaulStamatiou.com in late 2005
PaulStamatiou.com in 2005
Handcrafted by Stammy for 21.18 years · Contact