The stack
I trust to ship.
Opinionated defaults for speed, typed foundations for safety, and selective reach-fors for edge cases. Nothing trendy for its own sake. Everything here earns its place in production.
Philosophy
Boring is a feature.
I reach for established tools with deep ecosystems, not whatever topped HN last week. Boring technology ships faster, hires easier, and fails less.
Types are documentation.
TypeScript end-to-end means the shape of your data is a first-class citizen. No runtime surprises. No stale wikis. The types are the spec.
Observability is not optional.
Error tracking, analytics, and logging go in on day one. You can't improve what you can't see. Production is where assumptions meet reality.
AI is leverage, not a shortcut.
AI accelerates the scaffolding, drafting, and repetitive decisions. Every line that ships is shaped by deliberate review. Speed ≠ carelessness.
Everything the user touches. Performance, accessibility, and type-safety aren't negotiable — they're load-bearing.
Next.js
CoreApp Router + RSC for zero-waste loading. The default for anything server-rendered.
React
CoreThe component model that everything else is built on. Nothing else comes close for complex interactive UIs.
TypeScript
CoreTypes are documentation that can't drift. Non-negotiable on anything that ships.
Tailwind CSS
CoreUtility-first means the design system lives in tokens, not in a sprawling CSS file nobody wants to touch.
Framer Motion
Reach forThe animation primitive that plays well with React's rendering model. Used selectively.
shadcn/ui
Reach forCopy-paste components with full ownership. No vendor lock-in on UI primitives.
Radix UI
Reach forUnstyled, accessible headless components for anything custom.
Zod
Reach forSchema validation at system edges. Pairs with tRPC and form libraries naturally.
Full list
- Next.jsCore
- ReactCore
- TypeScriptCore
- Tailwind CSSCore
- Framer MotionReach for
- shadcn/uiReach for
- Radix UIReach for
- ZodReach for
- Node / BunCore
- tRPCCore
- Drizzle ORMCore
- PostgreSQLCore
- RedisReach for
- StripeReach for
- Clerk / Auth.jsReach for
- ResendReach for
- VercelCore
- GitHub ActionsCore
- CloudflareCore
- SentryCore
- PostHogReach for
- Neon / SupabaseReach for
- UpstashReach for
- PlanetScaleSituational
- CursorCore
- ClaudeCore
- OpenAI SDKReach for
- Vercel AI SDKReach for
- Pinecone / pgvectorReach for
- LangChain / LlamaIndexSituational
- EvalsReach for
- ReplicateSituational