Blog Article
My Vibe Coding Stack: Build a Full CRM in 13 Minutes
The four-tool vibe coding stack Marcelo uses to ship working apps quickly: Next.js, Tailwind and Shadcn, Convex, and Claude Code.
Most people spend weeks researching which vibe coding stack to use. I spent 13 minutes building a working freelancer CRM with mine.
Client list. Invoice creation with fixed and hourly line items. Light and dark mode toggle. Mock payment portal. All functional. All from a single prompt.
Here's the thing I wish somebody told me when I started vibe coding: the stack barely matters. What matters is you pick one and you start building. You only develop an eye for what you actually like after you've shipped a few things. Not before.
That said, if you want to skip the decision fatigue and use the stack that works for me today, here it is.
The Four-Layer Vibe Coding Stack
Every stack has four jobs to do: render the UI, style it, store data and handle auth, and ship the code. Here's how I cover each one.
1. UI Layer: Next.js (React)
Next.js renders the interface. Pages, layouts, components, buttons - all front-facing functionality lives here.
I use it because every major AI coding assistant has seen more Next.js code than any other framework. That means your first prompt lands closer to working code, and debugging is easier when you're stuck. There are faster frameworks. There are lighter frameworks. Use those when you have a specific reason. Otherwise, Next.js is the right default for vibe coding.
2. Design Layer: Tailwind CSS + Shadcn
Tailwind gives you utility classes. Shadcn gives you the components. Together they give you 80% of your app's visual identity for free.
Shadcn components are what make your vibe-coded app look like a real product instead of a hackathon demo. Buttons with proper focus states. Dialogs that handle keyboard navigation. Tables that don't fall apart on mobile. You could build these from scratch, but you'd spend three days doing it.
3. Data + Auth Layer: Convex
This is where I break from most vibe coding tutorials. The typical pairing is Clerk for auth plus Supabase for data - two services, two dashboards, two sets of API keys, two billing pages.
Convex handles both. One service. One login. One documentation site to search when something breaks.
This is the single biggest productivity hack most vibe coders miss: colocate your services whenever you can. Every tool you add is a tool you have to babysit. Every third-party integration is another status page to check when something goes down.
I prefer Convex over Supabase in general. The reactive queries are incredible. The TypeScript support is native. And the fact that auth is built in means I'm not duct-taping two services together every time I start a project.
4. Ship Layer: Claude Code + Vercel + GitHub
Claude Code with Opus 4.7 does the actual building. Vercel handles deployment. GitHub handles code.
These three integrate tightly. Push to GitHub, Vercel deploys. Claude Code commits directly. No manual copy-paste between tools.
Use whatever LLM you prefer. Codex and Gemini both work well. I happen to like Opus 4.7 for vibe coding because it handles long context well and pushes back when you ask it to. Which brings me to the most important point in this entire post.
The One Prompt Upgrade That Changed Everything
The biggest upgrade to my vibe coding isn't the stack. It's four words I add to every major prompt: "Push back if wrong."
Here's what happened during the CRM build. Claude finished the main build and wanted to initialize Convex, wire up auth, and run live migrations. Completely reasonable default behavior.
But I was recording a video and needed Part 1 to stay on mock data. So I told Claude my constraint and added: "push back if you think we should initialize Convex now."
Claude considered it, then agreed with my plan and explained why: "The dramatic beat of 'now we wire up Convex plus Stripe plus GitHub plus Vercel' lands harder in part two if part one already looks like a finished product."
That's the unlock.
Most people accept the first plan their AI gives them. That's how you get code that technically works but misses what you actually needed. Or worse - code that does exactly what you asked for, but what you asked for was wrong.
Invite disagreement. Make your AI defend its choices. Let it propose alternatives. Claude, Codex, Gemini - all three produce better output when you build pushback into the prompt.
Master Prompts Beat Vibe Prompts for Real Builds
I gave Claude a comprehensive master prompt for this CRM. Tech stack specified. Design specs included. Use cases laid out. Edge cases flagged. That's why it one-shotted a working app in 13 minutes.
A one-line vibe prompt ("build me a CRM") would have produced something demo-able at best. A master prompt with context produced something I could actually navigate and use.
You don't need a master prompt to start vibe coding today. But if you want to stop rebuilding the same app 10 times, invest in writing better prompts. The time you spend upfront is time you don't spend debugging at 2am.
If you want the master prompt template I used, it's free at clearmud.ai/resources.
What to Do This Week
Your first vibe-coded app won't stick. Neither will your fourth. Your tenth might be the one you actually keep. The only way to get there is to build the next one.
This week:
- Pick a stack. Not the perfect one - the one you can start with today.
- Write a real prompt. Include your constraints and your "why."
- Add "push back if wrong" to the end of it.
- Ship whatever comes out. Even if it's ugly. Even if it's broken. Ship it.
Next week, do it again. That's the whole job.
Watch the Full Build
The full 13-minute CRM walkthrough is on YouTube, including the master prompt I used and the exact back-and-forth with Claude:
Part 2, where we actually wire Convex, Stripe, GitHub, and Vercel together for a real deploy, drops later this week. Subscribe to the newsletter so you don't miss it.
I'm not an AI expert. I'm building in public and sharing what actually works. If there's a specific stack, tool, or workflow you want me to test next, drop a comment on the video.
Let's build.
- Marcelo
*Word count: ~1,150 words | Reading time: ~5 min*