rewrote my website, again
december 29, 2025
well, it's happened again. feels like this is a yearly tradition at this point. spent the afternoon writing a new version of this site from scratch in go, here's the source code if you're curious.
there was a few motivating factors behind this rewrite:
- make it easier to write blog posts (e.g. support for markdown rendering)
- consolidating some personal infrastructure (more on this below)
- i like writing go, it's fun
the new site is a single go file, which exposes two web servers:
- the public-facing website, e.g. static files and templated HTML pages
- an internal HTTP server, accessible only via my tailscale network. this server is by-default secure, e.g. it's not exposed to the public internet.
it's not a secret that i love tailscale, and in particular, i'm a really big fan of tsnet. tsnet allows you to embed tailscale itself inside your go program, and using a reusable auth key, the program can automatically join your tailscale network on startup, and get cleaned up on shutdown (ephemeral).
currently, the internal server has a single endpoint /log which is used to ingest
personal text logs into a turbopuffer namespace. i have
an iOS shortcut on my phone which, when triggered, sends a POST request to this endpoint
with some text data (e.g. "went for a walk", "ate lunch at cafe", etc). i use these logs
to keep track of what i'm doing throughout the day (and they also include location data).
having them exposed on a private server gives me some peace of
mind that they'd never be publicly accessible (i used to share my logs publicly,
but stopped doing that a while ago after realizing it was a pretty bad idea).
there's still a few things i'd like to add to the site, such as:
- a proper RSS feed for the blog
- a favicon (ugh)
- maybe some more pages about what i'm reading, watching, etc.
overall, i'm pretty happy with how it turned out. doing it from scratch meant i could really tailor it to what i wanted, e.g. if the binary detects it's running on my laptop, webpages are re-loaded on every request, making it easy to iterate on content/design. in prod, content is preloaded exactly once at startup.
personal software is fun!