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:

  1. Checks out the latest code
  2. Installs dependencies into a venv
  3. Restarts the systemd service
  4. 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.