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.