stack
My vibe coding stack
Every product I ship — games, apps and SaaS — runs on the same deliberately small toolchain. Here it is, layer by layer, with the honest reason for each choice.
The principle behind all of it: one stack, repeated. Every new product reuses the same tools, so both I and the AI start every project already knowing the conventions. A stack the model has seen ten thousand times is a stack it generates correctly — exotic choices are where hallucinations live. And when code gets cheap, consistency becomes the expensive, valuable thing.
Editor & agents
Cursor, AI agents, multiple frontier models
The core of the workflow. Agents that read the repo before proposing changes are the difference between vibe coding and copy-pasting from a chat window.
Frontend
React, TypeScript, Vite, Tailwind CSS
One mental model for every product. TypeScript is non-negotiable — types are the contract the AI keeps having to honour.
Mobile
Capacitor (iOS & Android)
The same React codebase ships to the App Store and Play Store. Three platforms, one set of bugs — ideally.
Backend
Firebase — Auth, Firestore, Cloud Functions, Hosting
Solo developers do not want to run servers. Firestore rules, callable functions and hosting cover 90% of what my products need.
Games
Three.js, React Three Fiber, Rapier, Zustand
Physics arcade games in the browser and on iOS — Dolphin Beyond runs on exactly this. AI is surprisingly good at R3F scenes, and surprisingly bad at game feel.
Content sites
Astro (static, zero JS)
Sites like this one. Pre-rendered HTML, perfect Lighthouse scores, nothing for a browser to execute — which is also exactly what search engines prefer.
AI in production
OpenAI APIs, content pipelines
Not just AI for building — AI in the products: 500,000+ generated quiz questions in Quiz Fight, lead detection in LostLead, the news ranking pipeline in Nuze.
Services
Mapbox, API-Football, App Store / Play Store, Simply.com
Runish draws real GPS runs on Mapbox; HeadToHead pulls fixtures from API-Football; static sites deploy to a plain Danish webhotel over rsync. Boring is a feature.
What I deliberately don't use
No Kubernetes, no microservices, no self-hosted databases, no CSS framework of the month. Not because they're bad — because every piece of infrastructure is something a solo developer has to maintain at 23:41 when a Firebase rule isn't doing what it was asked. The boring stack is what makes the ambitious products possible.
See the loop this stack powers in how to vibe code, or the results on the products page. For the mobile side specifically, there's a guide on shipping one React codebase to web, iOS and Android.