Ship a Weekend MVP
Go from idea to live product in a single weekend
What You'll Build
A deployed MVP with one core feature, user auth, payment processing, and a live URL you can share with early users.
- One focused core feature, fully functional
- User signup and login via Supabase Auth
- Stripe checkout for one-time or subscription payments
- Live on Vercel with a shareable URL
Prerequisites
- Node.js 18+ installed
- Cursor IDE installed (or VS Code)
- Accounts on Supabase, Stripe, and Vercel (all have free tiers)
- Basic React and JavaScript knowledge
- A clear product idea - one problem, one solution
Architecture
Cursor accelerates development with AI code generation. Next.js provides the full-stack framework with App Router. Supabase handles the Postgres database and authentication. Stripe processes payments via a checkout session. Vercel deploys the entire app from a git push.
Plan scope & set up the Next.js project with Cursor
~30 minDefine your MVP scope ruthlessly, then scaffold a Next.js project using Cursor to generate boilerplate fast.
- Write down your one core feature - the single thing users will pay for. Cut everything else.
- Open Cursor and create a new Next.js project with TypeScript and Tailwind CSS
- Use Cursor's AI chat to scaffold your project structure: pages, components, and lib folders
- Set up your environment variables file and install core dependencies
- Create a basic landing page with a hero section and CTA - ship the marketing page first
npx create-next-app@latest my-mvp --typescript --tailwind --eslint --app --src-dir
cd my-mvp
npm install @supabase/supabase-js @supabase/ssr stripe
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
STRIPE_SECRET_KEY=sk_test_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
NEXT_PUBLIC_URL=http://localhost:3000
Build the core feature with Supabase database
~2 hoursCreate your Supabase project, design the database schema for your one core feature, and build the UI to interact with it.
- Create a new Supabase project at supabase.com and copy your API credentials
- Design your schema in Supabase's Table Editor - keep it minimal (1-3 tables max for an MVP)
- Enable Row Level Security on all tables and add basic policies
- Create a Supabase client helper in your project for browser-side queries
- Build the core UI: a form to create data, a list to display it, and basic CRUD operations
import { createBrowserClient } from '@supabase/ssr'
export function createClient() {
return createBrowserClient(
process.env.NEXT_PUBLIC_SUPABASE_URL! process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
}
import { createClient } from '@/lib/supabase'
export default function Dashboard() {
const supabase = createClient()
async function loadItems() {
const { data, error } = await supabase
.from('items')
.select('*')
.order('created_at', { ascending: false })
return data
}
// Build your UI around this data
}
Add authentication with Supabase Auth
~45 minAdd user signup and login so people can create accounts and access their own data.
- Enable email/password auth in Supabase Dashboard → Authentication → Providers
- Create a simple signup page with email and password fields
- Create a login page that redirects to the dashboard on success
- Add an auth callback route to handle email confirmations
- Add middleware to protect the dashboard route - redirect unauthenticated users to login
'use client'
import { createClient } from '@/lib/supabase'
import { useState } from 'react'
import { useRouter } from 'next/navigation'
export default function Login() {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
const router = useRouter()
const supabase = createClient()
async function handleLogin() {
const { error } = await supabase.auth.signInWithPassword({
email, password
})
if (!error) router.push('/dashboard')
}
return (
<form onSubmit={(e) => { e.preventDefault(); handleLogin() }}>
<input type="email" value={email}
onChange={(e) => setEmail(e.target.value)}
placeholder="Email" />
<input type="password" value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="Password" />
<button type="submit">Log in</button>
</form>
)
}
Wire up Stripe payments
~1 hourAdd a payment flow so users can pay for your product. Use Stripe Checkout for the fastest integration.
- Create a Stripe account and grab your test API keys from the Stripe Dashboard
- Create a product and price in Stripe Dashboard (use a simple $X/month subscription or one-time price)
- Build an API route that creates a Stripe Checkout session and redirects the user
- Add a pricing section or upgrade button on your dashboard that triggers checkout
- Test the full flow with Stripe's test card number: 4242 4242 4242 4242
import Stripe from 'stripe'
import { NextResponse } from 'next/server'
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)
export async function POST(req: Request) {
const { priceId, userId } = await req.json()
const session = await stripe.checkout.sessions.create({
mode: 'subscription',
payment_method_types: ['card'],
line_items: [{ price: priceId, quantity: 1 }],
success_url: `${process.env.NEXT_PUBLIC_URL}/dashboard?upgraded=true`,
cancel_url: `${process.env.NEXT_PUBLIC_URL}/pricing`,
metadata: { userId }
})
return NextResponse.json({ url: session.url })
}
.env.local until you are ready to accept real payments.Deploy to Vercel & ship
~20 minPush to GitHub, deploy to Vercel, and share your MVP with the world.
- Initialize a git repo, commit your code, and push to GitHub
- Go to vercel.com, import your repository, and add all environment variables
- Deploy - Vercel auto-detects Next.js and handles the build
- Test the full user flow on production: land → signup → use feature → pay
- Share the link on Twitter, Reddit, Indie Hackers, or wherever your audience hangs out
git init
git add .
git commit -m "Ship MVP"
git remote add origin https://github.com/you/my-mvp.git
git push -u origin main
# Or deploy directly with Vercel CLI
npx vercel --prod
🎉 You're Done!
A deployed MVP with one core feature, user auth, payment processing, and a live URL you can share with early users.
Want this built for you?
Get a step-by-step checklist, setup order, and the exact config for every tool in this guide. Or let me build it for you.
Get the checklist → Want this built for you?