Every founder goes through this phase where you stare at a blank terminal and have to decide: what do we build this with?
The wrong choice doesn’t kill you immediately. It kills you in six months when you’re trying to scale and everything is held together with duct tape. So we spent a lot of time on this.
Next.js for the frontend (and backend).
We needed server-side rendering for SEO. That was non-negotiable. If someone searches "best bars in the East Village," we need Google to find our page. A fully client-side React app won’t cut it.
Next.js gives us the best of both worlds. Server-rendered pages that Google loves. Client-side interactivity for the quiz experience. API routes built in so we don’t need a separate backend server. App Router with React Server Components means we can fetch data on the server and ship minimal JavaScript to the browser.
We looked at Remix. We looked at Astro. Next.js won because of the ecosystem, the deployment story, and the fact that we’ve shipped with it before. When you’re building alone, familiarity matters more than novelty.
Supabase for the database.
We need to store 25,000+ venues with rich metadata. Mood tags, vibe scores, neighborhood data, hours, tips, pricing — the data model is complex. Supabase gives us Postgres under the hood, which means real relational data, real queries, real joins. Not some NoSQL mess where we’re duplicating data everywhere.
The auth is built in (for when we need it later). The real-time subscriptions are there (for future features). The API is auto-generated from the schema. And the pricing is sane — free tier for development, predictable costs after that.
We almost went with PlanetScale. It’s great. But Supabase’s combination of database + auth + storage + edge functions in one platform meant fewer moving pieces. Fewer moving pieces means fewer things break at 2am.
Vercel for deployment.
This one was almost automatic. Vercel made Next.js. The deployment is literally git push and it’s live. Preview deployments for every branch. Edge functions. Image optimization. Analytics. It’s the smoothest deployment experience we’ve ever used.
We considered self-hosting on AWS. That thought lasted about 30 seconds. We’re a small team building a product. We don’t want to manage infrastructure. We want to ship features.
The glue: TypeScript everywhere. No JavaScript. Types catch bugs before users do. Tailwind CSS for styling because we’re not designers and utility classes let us move fast without creating a CSS architecture. React Server Components for data fetching. Incremental Static Regeneration for pages that need to be fast but also fresh.
The stack isn’t fancy. It’s boring. And boring is exactly what we want.
Boring means the internet is full of answers when something breaks. Boring means we can hire someone later and they’ll understand the codebase in a day. Boring means we spend our time on the product — the matching engine, the data, the user experience — not fighting our tools.
First commit is in. Let’s build.
— The Moodap™ Team

