← Blog

How I Built This Site

Welcome to the first post on my blog. Fittingly, it's about the thing you're reading it on — this site, and how I put it together.

Why build it from scratch

I wanted three things a templated site builder couldn't quite give me: full control over the code, a place to actually learn by building, and ownership of my own content and data. So instead of renting a blog, I built one.

The stack

The whole site is a single Python application:

  • FastAPI for the web framework — fast, async, and a joy to work with.
  • Jinja2 templates with a light, editorial theme I designed by hand.
  • SQLite for storage — no database server to babysit, and the file lives on a path that survives every deploy.
  • Gunicorn + Uvicorn workers in production.
  • Azure App Service for hosting, with deploys automated through GitHub Actions.

A blog with its own admin

The part I'm most happy with is that I can write and publish entirely from the browser — no editor, no rebuild, no redeploy. There's a Markdown editor with a live preview, support for both long-form articles and short notes, and the admin lives behind a private path so it isn't sitting at an obvious URL.

Publishing once, posting everywhere

When I publish a post, the site can automatically cross-post it to X and LinkedIn, with a live preview of how each will look before it goes out. One write, three places.

Editing safely after publishing

A post can change after it goes live. So edits to a published post are saved as a draft — the live version stays exactly as it was until I explicitly hit "Publish changes." No more half-finished edits leaking onto the live site.

What's next

Now that the foundation is here, the plan is simple: write more. Thanks for reading the first one.