Backend & APIs
Python is my primary language for backend services, data processing, and automation. I use Flask for established projects and FastAPI for new services where async and auto-generated docs add value.
I'm Jamie, a software developer based in the UK who builds real things that actually run. Every project on this site is live, deployed, and doing something useful. No templated demos, no copy-paste tutorials.
I got into programming because I wanted to automate things that annoyed me. The first real project was a script to scrape rental listings. I was tired of manually checking property sites every morning. That script became GlobeScraper, and the process of building it taught me more than any course could.
Since then, I've built tools across the full stack: backend APIs with Flask and FastAPI, data pipelines with Python, real-time applications with WebSockets, and this portfolio site itself: a static HTML/CSS site that scores 97+ on every Lighthouse metric without a single framework dependency.
I care about software that works. Not software that looks impressive on a slide deck, but software you can clone, run, and actually use. Every project here has a live demo, source code, and deployment documentation.
Python is my primary language for backend services, data processing, and automation. I use Flask for established projects and FastAPI for new services where async and auto-generated docs add value.
I build with semantic HTML and vanilla CSS. No frameworks unless they solve a real problem. This site itself is the proof: zero JS dependencies, system fonts, dark theme via CSS custom properties, sub-second load times.
Everything runs on a single Hetzner VPS (CX23, Debian). I manage deployment with Docker, reverse proxy with Nginx, process management with systemd, and TLS with Let's Encrypt. CI/CD via GitHub Actions.
Data validation with Pydantic, ORM with Prisma, web scraping with BeautifulSoup, ML experiments with scikit-learn, and testing with pytest. Every tool chosen because it solves a specific problem, not because it's trendy.
Every project starts as a working prototype. I deploy early, test with real data, and iterate based on what breaks. Perfection is the enemy of done.
I reach for the simplest tool that solves the problem. SQLite before Postgres. Vanilla CSS before Tailwind. Flask before Django. Complexity is earned, not assumed.
I deploy to my own server, manage my own infrastructure, and debug my own production issues. No hidden Vercel magic. I understand every layer from DNS to database.
These principles aren't abstract ideals. They're reflected in every project:
When I'm not building software, I'm usually reading about it, or doing something entirely unrelated to keep perspective. Good engineering comes from understanding people and problems, not just languages and frameworks.
I believe the best software is built by people who are curious about the world, not just about technology. The problems worth solving exist outside the terminal.