Yet Another Personal Site. Again, With Feeling.
If I really sit down and think about how many personal websites I have built, I have a solid habit of spending a lot of time on designing and building them. And then immediately proceeding to never touch them again, even with the express intent of making it easy on myself by using a content management system. Which means, they were grossly over-engineered and required constant code and maintenance to just keep running.
Let’s take a running tally of what past systems I can even remember using:
- Drupal
- Joomla
- WordPress
- Ghost
- Orchard
- Sitefinity
- Laravel
The big thing I noticed is that I had fun building them and integrating my design into them, but soon it became a chore to maintain updates and plugins. It was less about the content and more about the content system. That, in our industry, is technical debt.
Payload
My last site, built back in 2018, was in Laravel because I was very familiar with it and most content management systems of that time period. At the time I was building massive websites for large clients at a web firm in St. Louis.
This time I was going to do it differently. I now have an R&D background leading and mentoring teams in planning, architecting, and developing massive systems built on microservices, message brokers, IoT, container orchestration, etc. I know what complexity means to a system now.
After spending a couple of nights doing research and reading documentation, I decided that the combination of Payload and React would be the best possible solution for what I was after.
Every frontend developer knows about Angular, React, Vue and Svelte frameworks. My answer for content was Payload and its features:
- Code first (TypeScript which plays well with the above frameworks)
- Open Source
- Local API, REST, GraphQL
- Auth, access control, uploads, versioning, scheduling are baked in
- Next.js
- Minimal but powerful and extensible admin UI
- Multi-author with editorial workflows
The first version of the site was done. I just needed to start writing content. I spun up my Docker container in OrbStack.
It was amazing.
Until I realized I was doing the same thing again. I was running a database and an admin UI just for myself to publish things to the web.
I built the first version of this site on a really good CMS and still tore it out.
It was my fault and not a problem with Payload. If you haven’t had time to check it out, you definitely should. It can even do e-commerce.
There had to be something less complex with fewer features, which required me to step away from my assumptions of what I needed.
The Lesson
Every personal site I have ever built failed the same way. I kept choosing infrastructure engineered for multiple writers and editorial workflows when there was only ever going to be one of me. Same pattern, different decade.
Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.
— Antoine de Saint-Exupéry
I love minimalism. Everything has a place and a purpose. I apply this to my house, vehicle, outdoor kit, fishing equipment, guitar pedal board, etc. Why not apply it to my personal site? Sometimes, “keep it simple stupid” is the best course of action.
I was worried about using the “popular” stack and not about what would be enjoyable for me to write in. What I needed was simplicity outside of work. I made a short list of essentials.
- No build pipelines. I write and maintain pipelines in Microsoft DevOps and GitHub Actions at work all the time.
- Only use TypeScript when absolutely necessary.
- Static HTML by default. Virtual DOM only where I explicitly opt in.
- E2E testing for my personal site felt absurd.
- No database. No admin UI. No authentication.
The main thing I decided: My job is complicated, my website shouldn’t be.
Why Astro
Immediately, I went back into research mode.
I had heard of Astro a couple of years ago, but didn’t pay it too much attention. As I pored over the documentation, I had Claude and Gemini do a breakdown on my requirements versus functionality.
It was a Eureka moment. ZERO TypeScript by default. If I wanted to extend it, I had islands. I use Markdown every day. Everything is static and it’s portable. And I don’t have to worry about content security. Every box checked.
The Supporting Cast
Of course, I had to make it mine because I like to tinker. The site shows what I am currently listening to on Spotify because I love music. I added a script that fetches book and game cover art and their links on deployment. I have my own journal.
“The Bench” is where I imagine myself sitting on a park bench in deep thought.
It’s simple. It works and it’s extensible.
The cheapest, fastest, and most reliable components of a computer system are those that aren’t there.
— Gordon Bell
The bench is built. It’s not fancy or ornate. The point was always just the sitting and thinking.