Every tool I reach for regularly — with honest reasons for each choice. No sponsorships, no trends, just what actually works in production.
I've settled on Next.js App Router as my default. SSR + RSC gives me the performance characteristics I want without sacrificing DX. Tailwind keeps styling co-located with the component — no context switching.
App Router, RSC, and streaming make it the best full-stack React story today.
Concurrent features and the new compiler eliminate most manual memoisation.
Refactoring confidence. I've been bitten by JS runtime errors enough times.
Design tokens in code. Fast to iterate, easy to maintain a consistent system.
Layout animations and gesture handling that would take days to build manually.
Next.js API routes handle most of my backend needs. For heavier workloads I reach for Bun — the single-runtime story (test + run + bundle) is genuinely faster. I avoid spinning up separate services unless the use case demands it.
Co-located with the frontend. No separate deploy, no CORS headaches.
3× faster installs, built-in test runner, and I can run TypeScript natively.
Type-safe SQL without the magic. The schema is the source of truth.
Runtime schema validation that TypeScript alone can't give you at API boundaries.
Postgres is my default — battle-tested, rich type system, and pgvector means I don't need a separate vector DB for smaller workloads. For semantic search at scale I use Qdrant.
ACID, rich JSON support, and pgvector in one deployment.
Semantic search, recommendations, and RAG pipelines. Fast and self-hostable.
TTL-based caching for expensive queries and real-time features.
Type-safe access to both relational and vector columns in one schema.
I build AI features as first-class product functionality, not demos. Claude is my LLM of choice — extended context and tool use make it practical for real tasks. I embed everything: content, visitor signals, guestbook entries.
Best-in-class reasoning, 200K context, and prompt caching cuts costs significantly.
Abstracts streaming boilerplate and works seamlessly with Next.js.
BM25 + cosine hybrid search with RRF fusion for best-of-both retrieval.
I host on Vercel for the frontend — zero-config deploys and edge functions are hard to beat for Next.js. The database tier runs on managed Postgres. For anything that needs to stay on-prem I use Docker Compose on a VPS.
Edge network, instant deploys, and first-class Next.js support.
Serverless connection pooling and branch-per-PR database previews.
Serverless Redis with per-request billing — no idle costs.
S3-compatible, zero egress fees, and global distribution.
Good tooling is invisible. I want fast feedback loops and high confidence when shipping. Most of my tooling choices optimise for iteration speed without sacrificing correctness.
10× faster than ESLint + Prettier combined. One config, one tool.
Browser automation that actually mirrors how users interact.
Close to the code, cheap, and the marketplace covers most use cases.
The only AI coding tool that actually understands large codebases.
TypeScript is my daily driver. Rust for anything that needs to be fast or safe at a systems level — I reach for it when Go would be my second choice.
Type safety across the full stack. The ecosystem is unmatched.
Memory safety without a GC. I use it for CLI tools and WebAssembly.
Drizzle generates it but I read and write it fluently.
Glue for CI pipelines and dev tooling.
This page reflects my current defaults — choices evolve as better tools emerge.
Reproducible environments. My local dev mirrors production exactly.