The stack I build with.
Everything here is something I use in production right now. I’ve left off the tools I’ve only tried once — a stack list is more useful when it’s honest about what you actually reach for by default.
Frontend
React & Next.js
The default for everything I build. Next.js gives me server rendering, routing, and a sane build pipeline without assembling it myself, which matters when a team has to stay productive in the same codebase for years.
TypeScript & JavaScript (ES6+)
Typed end to end, from the API contract down to the form field. The compiler catches the class of bug that would otherwise surface in production data, which is the only kind that really hurts on financial systems.
HTML5 & CSS3
Worth naming explicitly. Semantic markup and modern layout do most of the accessibility and responsiveness work before any framework gets involved.
Tailwind CSS, Shadcn UI, Radix UI & Material-UI
Tailwind for styling velocity, Radix for primitives that get keyboard and screen reader behaviour right, and Shadcn UI as the layer between them. Owning the component code rather than importing a black box makes per-tenant theming far easier; Material-UI where a project already standardised on it.
React Hook Form & Zod
One schema defines validation on the client and the server. On data-entry-heavy products that’s the difference between a trustworthy database and a slow-moving mess.
TanStack Query & TanStack Table
Query handles caching, refetching, and server state so I’m not hand-rolling it. Table handles sorting, filtering, and pagination over the large datasets enterprise dashboards are actually made of.
Zustand & Redux
For the genuinely client-side state that’s left once server state is handled properly. Zustand by preference — small, unopinionated, easy to reason about in review — and Redux on codebases already built around it.
Backend
Node.js, Express.js & Nest.js
The same language across the stack, which keeps types and validation shared rather than duplicated. Express when I want to stay out of the way, Nest.js when a larger team benefits from structure being enforced rather than agreed.
Python & FastAPI
Where the AI work lives. FastAPI gives me typed request models and async handling without ceremony, which suits services that spend most of their time waiting on a model.
REST APIs
Predictable, well-versioned endpoints with contracts the frontend can rely on. Boring on purpose — it’s the interface the whole team works against.
JWT authentication
Stateless auth that works cleanly with role-based access and multi-tenant request scoping, where every query needs to know who is asking and on whose behalf.
AI engineering
LLMs & prompt engineering
Building with language models as components in a system rather than as a demo — which mostly means being disciplined about what you feed them and strict about what you accept back.
RAG & vector databases
Retrieval over a vector store is what keeps generated content grounded in real source material instead of confidently invented. It’s the difference between a usable product and a liability.
LangChain & LangGraph
LangGraph for adaptive, branching flows where the next step depends on what happened in the last one — the structure behind the personalized learning paths in Galileo AI.
Hugging Face, FastMCP & fine-tuning
For the cases where a hosted general model isn’t the right answer and a smaller, tuned one is.
Database
PostgreSQL
My default. Constraints, transactions, and relational integrity enforced by the database rather than hoped for in application code — essential for anything touching money.
MongoDB
Where the document model genuinely fits the domain and schemas evolve quickly, as with the varied record shapes in an ERP.
Redis
Caching, sessions, and queues. On Interview Pro it also backs the real-time layer alongside WebSockets.
DevOps & cloud
Docker
So the thing that runs on my machine is the thing that runs in production. Especially useful once Python services and Node services have to coexist.
Vercel & Netlify
Where the Next.js frontends live. Preview deployments per pull request make review conversations concrete instead of theoretical.
AWS, Cloudflare & DigitalOcean
AWS for enterprise workloads and the scheduled jobs behind NAV processing and import pipelines; Cloudflare for DNS, caching, and edge protection; DigitalOcean for services better off on a predictable box than a managed platform.
Git, GitHub & GitLab
Branch, review, merge. Pull requests are where most of the mentoring actually happens on a team.
ESLint, Prettier, Webpack, Babel & pnpm
The unglamorous layer that keeps a shared codebase consistent. Formatting and lint rules settled once in config are arguments nobody has to have in review again.