The tools and technology I use every day.
My setup has evolved quite a bit over the years, but these are the tools I currently rely on for software development, platform and DevOps engineering, running my projects, and generally spending far too much time in front of a computer.
Workstation
Mac Studio — M1 Max, 32GB RAM
My main development machine. The M1 Max still has more than enough performance for the kind of work I do, including running multiple development environments, Docker containers, frontend build tools, databases, and far too many browser tabs at the same time.
Three-monitor setup
I've become completely dependent on having three displays. Usually that means code on one screen, the application or browser on another, and documentation, terminals, logs, or whatever else I'm working with on the third. Going back to a single display now feels slightly claustrophobic.
Apple Magic Keyboard with Touch ID
Simple, reliable, and I like having Touch ID directly on the keyboard. Being able to authenticate without reaching for anything else is one of those small conveniences that I'd miss almost immediately.
Apple Magic Trackpad
I've always preferred Apple's trackpads to traditional mice. macOS gestures make navigating between desktops and applications incredibly quick, especially when I've got a lot going on at once.
SteelSeries wireless headset with hot-swappable batteries
The hot-swappable battery system is the killer feature for me. I can use the headset all day, swap the battery when it gets low, and carry on without ever needing to plug the headset in to charge.
Development environment
Visual Studio Code
My main editor and where the majority of my development work happens. I use it across Python, TypeScript, React, Django, Flutter, infrastructure configuration, and pretty much everything else I work on.
VS Code Dev Containers
I'm a big fan of keeping development environments defined alongside the project rather than relying on whatever happens to be installed on my Mac. Most of my larger projects have a devcontainer so dependencies, runtimes, tooling, and configuration stay consistent.
Docker
Docker is involved in most of my projects in one way or another. I'll typically use it for development environments, databases, Redis, background workers, supporting services, and production deployments.
Git & GitHub
GitHub is where I keep virtually all of my software projects. As well as source control, I use GitHub Actions heavily for automated testing, builds, deployments, and other CI/CD jobs, including a set of shared, reusable workflows I maintain across my own projects.
pnpm
My preferred package manager for modern JavaScript and TypeScript projects. It's fast, space-efficient, and particularly nice when working with projects containing multiple frontend applications or packages.
Languages & frameworks
Python & Django
Python has been my primary programming language for years, with Django forming the backend of most of the larger web applications I've built, including Vanderheim, a full-stack community platform for a Twitch streamer. I like how quickly Django lets me go from an idea to a properly structured application without needing to reinvent everything around it.
FastAPI
My usual choice when I need a lightweight, async-first service alongside a larger Django application, rather than for the whole application itself. I've used it to build dedicated event-driven services that need to stay fast and independently deployable.
React & TypeScript
React is my usual choice for application frontends, with TypeScript giving me enough structure to stop larger frontend codebases from becoming complete chaos.
Next.js
I use Next.js for public-facing websites and applications where server rendering, static generation, routing, and React all need to work together. My current projects use the App Router rather than the older Pages Router.
Tailwind CSS
My default choice for styling React and Next.js projects. Once you're used to working with utility classes it's difficult to go back to constantly jumping between markup and separate CSS files.
GraphQL & Apollo
I've used GraphQL extensively for communication between Django backends and React applications, generally with Graphene on the Python side and Apollo Client on the frontend.
Celery
My usual choice when a Django application needs background jobs, scheduled tasks, queues, or work that really shouldn't be happening during an HTTP request.
Data & infrastructure
PostgreSQL
PostgreSQL is my default relational database and has been behind most of the serious applications I've built. Unless a project gives me a particularly good reason to use something else, this is normally where I start.
Redis
I mostly use Redis alongside Django and Celery for caching, queues, and other short-lived application data. It's one of those technologies that quietly ends up in almost every sufficiently complicated project.
Kubernetes
I run production workloads on a self-managed Kubernetes cluster, with each service defined as its own Helm chart. Owning it end to end, rather than using a fully managed offering, has meant a much deeper understanding of how the underlying pieces actually fit together.
Terraform
My default tool for provisioning infrastructure as code, from cloud servers and Kubernetes clusters to DNS and self-hosted platform tooling. If it's infrastructure I depend on, it's defined in Terraform, not clicked together by hand.
Ansible
My tool of choice for server configuration and application deployment. I use it for everything from hardening and securing servers to deploying Dockerised applications, and it forms the backbone of a self-hosted platform I run for deploying and managing my own projects.
Infisical
A self-hosted, open-source secrets manager I run for centralising application and infrastructure secrets across my projects, with GitHub Actions authenticating to it via OIDC rather than long-lived credentials.
DigitalOcean
DigitalOcean has been my main cloud provider for a long time. I use it for virtual machines, managed databases, object storage, Kubernetes, and the infrastructure behind various personal and client projects.
Cloudflare
I run a lot of my domains through Cloudflare for DNS, proxying, caching, TLS, and general protection before traffic ever reaches my servers.
Nginx
Still my usual choice for sitting in front of web applications, handling reverse proxying, TLS termination, static assets, and the other jobs that inevitably appear around a production deployment.
AI tools
Claude
One of the AI tools I use regularly, both in chat form for architecture discussions and problem-solving, and as a coding agent working directly in a codebase for implementation, debugging, and infrastructure work.
ChatGPT
I also use ChatGPT as part of my normal workflow, particularly for research and talking through unfamiliar technologies or ideas.
OpenAI Codex
Codex is particularly useful when I want an AI agent working directly with a codebase rather than just discussing snippets in a chat window, for implementation work, refactoring, debugging, and repetitive development tasks.
GitHub Copilot
Copilot lives directly inside my editor and is useful for the more incremental side of AI-assisted development — autocomplete, generating repetitive code, and quickly iterating while I'm already writing code.
How I actually use them
Which tool I reach for tends to depend on the project and on usage limits day to day, and I'll sometimes deliberately use two of them against each other, for example having one review or critique work another has produced, rather than treating any single tool's output as final.
