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 (check current access, allowance and required features in the linked profile)
- 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 checks and sources
Plan-specific access matters more than a tool’s “free” label. Read the dated profile linked above, then confirm your seat count, usage, billing basis and required export or publishing feature.
No new vendor price or free-plan allowance is asserted in this edit. Linked profiles retain their own source dates and unknowns.
Before launch: use a synthetic record, verify permissions and output, test a failed action, and document how to reverse it. A successful checkout preview or API response does not prove a paid order, delivery or confirmed subscription.
Plan scope & set up the Next.js project with Cursor
Define 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
Illustrative code, not executed in this review. Check current SDK documentation, authentication, input validation and error handling before use.
npx create-next-app@latest my-mvp --typescript --tailwind --eslint --app --src-dir
cd my-mvp
npm install @supabase/supabase-js @supabase/ssr stripe
Illustrative code, not executed in this review. Check current SDK documentation, authentication, input validation and error handling before use.
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
Create 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
Illustrative code, not executed in this review. Check current SDK documentation, authentication, input validation and error handling before use.
import { createBrowserClient } from '@supabase/ssr'
export function createClient() {
return createBrowserClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
}
Illustrative code, not executed in this review. Check current SDK documentation, authentication, input validation and error handling before use.
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
Add 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
Illustrative code, not executed in this review. Check current SDK documentation, authentication, input validation and error handling before use.
'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
Add 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
Illustrative code, not executed in this review. Check current SDK documentation, authentication, input validation and error handling before use.
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
Push 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
Illustrative code, not executed in this review. Check current SDK documentation, authentication, input validation and error handling before use.
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
Validate before launch
Target outcome: A deployed MVP with one core feature, user auth, payment processing, and a live URL you can share with early users. Check the actual workflow, failure and recovery paths before publishing.
Need help building?
I help founders set up, connect, and launch their tool stacks. Skip the guesswork.
Work with me →