
Since Claude Code came out, I’ve built a bunch of small personal projects in just a few days.
But with code generation no longer being an issue, two problems remained:
• checking that the AI hasn’t done something stupid
• being able to deploy each project really fast without spending hours re-coding a CI/CD pipeline or (worse!) doing everything by hand.
So I set up a standardized stack that I use to code all my projects.
Here’s an overview:
Backend: Python (flask or fastapi, uv, pytest, Celery…), SQLite
Frontend: React/Next depending on needs
Packaging:
• each service runs in Docker with two stages: dev (debug mode for local dev) and prod (for… prod)
• 2 Docker Compose files: docker-compose.dev.yml and docker-compose.yml (prod)
• just to handle all local dev commands and special recipes: just up, just test…
Production:
• a personal domain hosted on Cloudflare; all my projects live on <project>.mydomain.com unless there’s a specific need
• VMs bought one by one on Digitalocean (the provider doesn’t really matter)
• a single repository for the infrastructure, containing: • a Terraform module to manage subdomains per project
• an Ansible playbook to deploy any project using the stack described above onto whichever VM I want
• a single file listing the config of all my projects, and a just deploy <project> command
• each VM hosts a traefik reverse proxy deployed in Docker, so routing config is defined per project (via Docker tags) rather than at the reverse proxy level
Three benefits to this:
• Claude Code hallucinates a lot less because the framework is the same and very well defined across all my projects
• It’s much easier for me to keep an eye on the code as it grows
• Deploying a new project takes 2 minutes, and removing one takes just as long
A system that’s more than enough for most of my personal projects.
