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.