Seven websites went in. One came out.

In 2024, my About page said I ran seven websites across three environments (dev, staging and production), 21 environments in total, all for less than $6 a month. My serverless article bragged about running 20+ web apps for free. 😎

All true! But the side projects behind those numbers had gone quiet a long time ago: Carnal in September 2023, Actrok and Diary in early 2024.

So on October 7, 2026, I shut down everything in that setup except this site. The ones that shipped got a proper funeral. 🪦

What was in the box

Since about 2023, this site and my side projects lived together in one monorepo on SST v2, which deploys through CloudFormation via AWS CDK, with pnpm on top. Everything had three stages: production, staging, and my own dev stage.

By this fall, that added up to 35 CloudFormation stacks and 119 Lambda functions. All 119 were on Node 18, a runtime AWS had already deprecated. 😬

Here's who lived there:

  • This site. Next 14, articles in MDX, plus a Payload CMS 3.0 beta scaffold I set up and never used. 🤣
  • Diary. A ChatGPT plugin that collected your random notes during the day and turned them into a proper diary entry, plus its landing page. OpenAI shut down ChatGPT plugins in 2024.
  • Carnal. An open-source macOS app that turned your computer into a local knowledge base for GPT. I built it in public during buildspace Nights & Weekends and tweeted the week 4 update on September 4, 2023.
  • Actrok. "Grant GPT a hand." It let a GPT work on your own Mac. Actnel was the relay underneath it, running on Fly.io.
  • A link shortener at l.derekxwang.com. It had 201 links, and 200 of them pointed at Diary plugin files. So it wasn't really a link shortener. It was Diary's calendar-link printer.
  • A newsletter sign-up. 51 people subscribed. I sent zero emails. Sorry! 🙏

Keep one, bury the rest

The decision was simple: keep the personal site and retire everything else.

The other option was moving 119 functions off a deprecated runtime for projects that hadn't changed since early 2024. Put like that, it wasn't a hard call.

But I didn't want them to just disappear. They shipped, and a couple of them even got launch posts on this site (Diary GPT, Actrok). So each one got a small tomb:

Each tomb has the project's icon, a screenshot of its landing page captured on its last day, what it was, what I built, and how it ended. The Projects page now has a "Laid to rest." section under the live projects, and every tomb there wears an "In memoriam" badge.

The new stack

Here's what the site runs on now:

  • Bun 1.4 instead of pnpm
  • SST v4. 4.0 shipped in February 2026, and it's built on Pulumi and Terraform, so no more CloudFormation.
  • Next 16 and React 19
  • Two stages instead of three: dev and prod

One site, two stages. That's it. The newsletter list came along too, and the sign-up box on the home page now only promises a note when I publish something new.

The cutover cost about 12 minutes of downtime.

Things that bit me

Of course, not everything went smoothly:

  1. Ghost DNS records. Leftover certificate-validation records from the old setup blocked the new certificate.
  2. The image optimizer crashed. SST's default image optimizer (OpenNext 3.9.14) crashed on Next 16.3. Images are served unoptimized for now, so I shrank the heavy ones instead.
  3. The 403 surprise. I had a public/articles folder for article media. SST routes every top-level folder in public/ to S3, so CloudFront sent every /articles page to S3, and S3 answered 403. Luckily we caught it on dev. Lesson learned: keep public/ folder names away from your route names.

While I was in there

The same night, I cleaned out the whole AWS account, not just this app:

  • Leftover stacks from my 2017–2018 projects: an IoT camera app, a Stripe-based pass app, a demo app, and an old DeepLens experiment. That's the era my serverless story starts in. 🦕
  • 384 orphaned log groups, old experiment deploys, and a dead DNS zone.
  • I kept a few older projects that are still live, plus one 2018 project I chose to keep.

The scary part

The cleanup also turned up a few things that really shouldn't have still been there:

  • A monitoring vendor that shut down in 2024 still had read-only access to the account.
  • An old IAM user with an admin access key, created for a vendor and never used, was still active.
  • Two other old IAM users still had live keys.
  • A 2018 demo app's anonymous identity pool was still handing out credentials as of August 2026, most likely to scanners.

All of it is gone now. If your AWS account is older than some of your side projects, go take a look. 👀

The numbers

  • The heaviest article, Why I Stay with Serverless, went from 5.7 MB to 439 KB. The 5 MB GIF of Elmo at the chalkboard became a short video.
  • On simulated mobile, its largest element now shows up in 3.1 s instead of 28 s.
  • Lighthouse accessibility went from 96 to 100.
  • The site gained share previews, a sitemap and security headers.
  • The fake template pages are gone. The Speaking page listed conference talks and podcasts that never happened; they came with the template. The Uses page listed the template author's desk setup. Uses is real now.

How I did it

All of this happened in one long evening. Claude Code was the agent doing the legwork: taking inventory of what was actually running, doing the migration and cleaning up the account, with worker agents for code review and implementation. I made the calls: what stays, what gets a tomb, and what gets deleted.

The agent did the digging. I decided what to bury. 🪦

Wrapping up

2024 me wasn't wrong: serverless made it really cheap to keep seven websites running. It also made it really easy to never turn them off. 🤣

Now it's one site, two stages, and a small graveyard on the Projects page.

Rest in peace, Diary, Actrok and Carnal. Thanks for the fun. 🙏