I rebuilt my personal site from scratch. The old version was set up to be temporary and functional, and frankly it looked kind of shoddy. It was a Flask app—and I love Flask for quick and easy projects—but I have a new object of affection in terms of web infrastructure.
The new stack is simple: FastAPI with Jinja2 templates, server-rendered HTML, content authored as Markdown files in my Obsidian vault. No JavaScript framework. No build step. No CMS.
The Content Pipeline
Obsidian has been a game-changer for keeping my thoughts and projects organized and being able to visualize how everything is connected. I have been integrating it into everything I can. For this site, I write essays and blog posts in my Obsidian vault under specific directories. Each file has YAML frontmatter with title, date, tags, and a summary. A sync script copies publishable files (where draft: false) into the repo’s directory.
# Frontmatter schema
---
title: "Post Title"
date: 2026-05-17
tags: [python, fastapi]
summary: "One-line description"
category: blog
draft: false
---
The app reads Markdown from the site’s content directory on request, parses frontmatter with python-frontmatter, converts to HTML with the markdown library, and caches everything in memory. File modification times drive cache invalidation — if I change a file, the next request picks it up. Automation means more productivity!
Deployment
git push origin main triggers a post-receive hook on the server that:
- Checks out the latest code
- Installs dependencies into a venv
- Restarts the systemd service
- Runs a health check (rolls back on failure)
Total deploy time: ~5 seconds.
The Aesthetic
I wanted something light and effortless — warm cream background, serif headings (Cormorant Garamond), generous whitespace, an amber accent color. The opposite of the dark-mode-everything trend. Reading-optimized at ~700px content width.
The CSS is a single file. No framework. It’s responsive via a few media queries and auto-fill grids.
What’s Next
More essays. The vault is where they develop — sometimes over weeks — and when they’re ready, the sync script and a git push are all it takes to publish.