Stack
What I build with
Tools are a means, so this page gives the reasoning rather than a wall of logos. The short version: use the platform's own frameworks, keep the number of moving parts low, and make the boring parts boring.
Apple platforms
Swift and SwiftUI for everything native. SwiftUI moves fast enough to justify itself once a layout stops fighting it, and dropping to AppKit or UIKit for the parts it handles badly is cheaper than adopting a cross-platform framework and losing the platform's own behaviour.
- Swift 6
- SwiftUI
- AppKit
- Vision
- PDFKit
- Core Location
- Foundation Models
Web
Next.js on the App Router with TypeScript in strict mode. Most of these sites are static exports or mostly-static pages, because a personal-scale product should not need a server running to show someone a page. Tailwind handles styling; a small token layer in CSS custom properties handles theming, so light and dark are one system rather than two stylesheets.
- TypeScript
- Next.js
- React
- Tailwind CSS
- Zustand
- Vite
Data and backend
Postgres when relations matter, SQLite at the edge when they do not. Prisma where the schema is the source of truth. FastAPI when the work is genuinely Python-shaped — numerical models and hazard engines — rather than reaching for one language everywhere.
- Postgres
- Supabase
- Prisma
- Turso
- SQLite
- FastAPI
- Python
Models
Model access sits behind a provider abstraction in every project that uses it, so a model can be swapped without touching feature code. On Apple platforms the preference is on-device inference through Apple's own frameworks: no key to manage, no network round trip, and nothing to explain in a privacy policy.
- Anthropic Claude
- Groq
- Apple Foundation Models
Shipping
Vercel for the web, App Store Connect for native, GitHub for everything. Deployment is boring on purpose — the interesting problems should be in the product, not in getting it in front of people.
- Vercel
- App Store Connect
- GitHub
- Xcode
What actually recurs
Counted from the shipped catalog on this site, not from memory. Anything used in more than one product appears here, most-used first.
- Swift8
- Next.js7
- SwiftUI7
- TypeScript5
- Groq3
- JavaScript2
- React2
- React Three Fiber2
- Vision2
- Vite2
- Zustand2