Skip to content

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.