How this site is built
Last updated 25 October 2026.
The stack
The site is built with Astro, using React for the few interactive parts like comments and some others. Most of the site is static.
I much prefer Astro for any website without heavy interactivity or auth. It's just such a nice modern framework to work with when there's so much bloat out there, especially with so many sites now being overengineered Next.js
It's hosted on Vercel. I don't like Guillermo Rauch but they make it too easy for side projects.
Content
| Posts | Ghost |
|---|---|
| Thoughts | Obsidian and Sanity |
| Photos | Sanity |
| Wiki | generated from tags and places |
Older posts live in a headless Ghost instance from my old travel blog. Ghost works great headless, so there was no reason to port everything over to Sanity, despite my OCD's best efforts to want to try.
Thoughts come from two places. Longer ones with photos I write in Sanity. Quick ones I write in Obsidian, so my Hermes agent can reference them as part of my second brain. Sometimes I record a thought instead of typing it; those are clearly labeled on the thoughts page.
Photos are hosted in Sanity, which makes it easy to compress and categorize them. I also post some favorites on 500px.
The wiki is the part of this site I love most, and it's very inspired by Obsidian. Each tag and place gets a page, mentions in posts link there automatically, and the graph shows how everything connects.
AI
My workflow for the site consists of various harnesses, typically Claude Code for active development, almost always on Opus 5.5. Hermes helps manage content and images and references my Obsidian vault (I'm still pretty new to Obsidian). More on my setup in how I work.
Sometimes I record a thought in Obsidian instead of typing it. Hermes transcribes the voice note and does a very light cleanup—punctuation, obvious transcription mistakes, and a little clarity, not a rewrite. I read and approve the wording before it goes into Sanity. Those thoughts have visible Speech-to-text and Minor AI cleanup labels that you can open for the full explanation. I want it to be clear what's mine and where AI helped.
Upcoming flights on the travel page come from Flighty, using the flighty-mcp-server and a custom sync script.