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.