The stack I reach for, and why.

People ask what I build with, so here it is. Nothing here is a recommendation in the abstract — it’s just what has held up across payment services, a Flutter app in production, and a handful of side projects.

Languages

  • TypeScript

    My default for anything with more than one contributor or more than a month of life ahead of it. Most of the bugs I used to find in code review are now found by the compiler, which frees the review to be about design.

  • Dart

    The language I write the most day to day, because the mobile app is where our users actually are. Sound null safety is doing quiet work in a codebase that handles money.

  • Python

    What I use for scripts, data wrangling, and anything involving LLM APIs. The ecosystem is unbeatable for the throwaway 40-line tool.

  • C++

    Mostly for competitive programming and data structures practice. Not what I ship, but it keeps me honest about what the machine is actually doing.

Web and mobile

  • Next.js

    App Router and Server Actions have collapsed most of the API layer I used to hand-write. For content-heavy commerce sites, server rendering is also the cheapest performance win available.

  • Flutter

    One codebase, iOS and Android, and enough control over the render pipeline to actually fix a janky list instead of shrugging at it.

  • React and React Native

    Still where I start for anything web-first. React Native shows up when a project already has a JavaScript team behind it.

  • Tailwind CSS

    I stopped naming things that didn’t need names. The constraint of a fixed scale is most of the value.

Backend and infrastructure

  • Node.js and Express

    What our payment and transaction services run on. Boring, well understood, and easy to reason about under load.

  • PostgreSQL

    My default database. Transactions and constraints are the cheapest correctness tools you will ever buy — a unique index has prevented more bugs for me than any amount of application logic.

  • Redis

    Caching, rate limits, and idempotency keys. Anywhere the answer is “we need to remember this for the next thirty seconds”.

  • Docker and CI/CD

    Because “works on my machine” is not a deployment strategy, and because replaying webhook sequences in staging needs an environment that matches production.

  • AWS

    Where things run. I try to keep the footprint small enough that I can hold the whole architecture in my head during an incident.

AI tooling

  • LLM APIs and RAG

    Used carefully, retrieval-augmented generation is a genuinely good fit for product discovery and recommendations. Used carelessly, it’s an expensive way to be confidently wrong, so I keep the retrieval layer inspectable.

  • Vector search

    The unglamorous half of every RAG system, and the half that decides whether the output is any good.