← all blog posts

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!