shay paris

as seen at the 1939 world's fair

$ about-this-site

When I first approached building a personal site, I got sidetracked for months with all the cool options and frameworks out there. I had a ton of fun experimenting with static site generators like Astro and Gatsby but ultimately landed on a small, minimal stack:


  • FastAPI: handles the core application logic
  • Jinja2 + HTMX: lightweight, server-driven UI with small client-side interactions
  • Tailwind CSS: utility-first styling within a constrained design system
  • Gunicorn: runs the application reliably under load
  • Nginx: manages incoming traffic and HTTPS
  • Debian-based VPS: a small server that I operate directly

It's flexible but predictable and I own it end-to-end. By design, there's very little unnecessary abstraction. This makes it easy to quickly add a new feature or debug an issue.


Running everything myself forces me to understand how all the pieces fit together. I can't mindlessly follow a tutorial or hit a deploy button, so I end up learning every time I touch it (even if it’s just that I should have documented something better).


In action, the flow looks roughly like this:


┌────────────┐ │ Browser │ └────┬───────┘ │ Request ▼ ┌────────────┐ │ Nginx │ → serves static assets, terminates HTTPS └────┬───────┘ ▼ Proxy ┌────────────┐ │ Gunicorn │ └────┬───────┘ ▼ ASGI (async) ┌────────────┐ │ FastAPI │ ├────────────┤ │ Routes │ → `/`, `/about`, `/home/*` │ Templates │ → Jinja2 + HTMX └────────────┘