Terminal.skills
Use Cases/Ship a SaaS MVP in a Weekend with AI Coding Tools

Ship a SaaS MVP in a Weekend with AI Coding Tools

Build and launch a complete SaaS product in 48 hours using Bolt.new for rapid prototyping, Lovable for Supabase-backed features, Cursor for production refinement, and Vercel for deployment — going from idea to paying customers for an AI-powered meeting notes tool.

Developer Tools#ai-coding#full-stack#prototyping#web-app#browser-ide
Works with:claude-codeopenai-codexgemini-clicursor
$

Aisha is a product manager who's been talking about building a meeting notes tool for months. The idea: record meetings, transcribe with AI, extract action items, and sync them to Linear/Asana. She's validated the idea with 20 PMs who all said "I'd pay for this." But she's not a full-stack developer, and hiring one would take months and cost $15K minimum for an MVP.

On Friday evening, Aisha decides to build it herself using AI coding tools. Her timeline: prototype Friday night, core features Saturday, polish and deploy Sunday, launch on Monday.

Friday Night: Prototype in Bolt.new (3 hours)

Aisha starts in Bolt.new because she can go from zero to a working app without any local setup — everything runs in the browser.

markdown
## Initial Bolt Prompt (9:00 PM)

"Build a meeting notes SaaS app with these pages:

1. Landing page with headline 'AI Meeting Notes That Actually Work',
   feature list, pricing section (Free/Pro/$19mo), and waitlist signup
2. Dashboard showing list of past meetings with date, title,
   duration, and action item count
3. Meeting detail page with transcript on the left, AI-extracted
   action items on the right, and a summary at the top
4. Settings page with profile, connected integrations, and billing

Use React, TypeScript, Tailwind, and shadcn/ui.
Use a modern purple/indigo color scheme.
Make it responsive for mobile."

## Result: Working prototype in 8 minutes
- 4 pages with navigation
- Responsive layout
- Mock data for meetings and action items
- Clean, professional design
markdown
## Follow-Up Prompts (9:30 PM - 12:00 AM)

"Add a recording button on the dashboard that shows a timer
and audio waveform visualization while recording"

"Add a file upload zone on the dashboard for importing
existing meeting recordings (MP3, M4A, WAV)"

"Create a pricing page with a toggle between monthly and annual
billing. Annual should show 20% discount with a crossed-out price."

"Add an onboarding flow: after signup, show 3 steps —
connect calendar, set default language, invite team members"

By midnight, Aisha has a polished prototype with 6 pages, responsive design, and realistic UI interactions. She exports the code to GitHub.

Saturday: Core Features with Lovable + Cursor (10 hours)

The prototype looks great but has no backend. Aisha switches to Lovable for Supabase integration (auth, database, storage) and Cursor for custom AI logic.

markdown
## Lovable: Add Backend (Saturday 9 AM - 1 PM)

"Take this meeting notes app and add:
- Supabase authentication with Google and email login
- Database tables: users, meetings, transcripts, action_items
- File storage for audio uploads (Supabase Storage)
- Row Level Security so users only see their own meetings
- Real-time updates: when a transcript is processing,
  show progress in the dashboard"

Lovable generates:
- Auth flow with Google OAuth
- 4 database tables with proper relationships
- RLS policies
- File upload to Supabase Storage
- React hooks for data fetching
- Real-time subscription for processing status
typescript
// Saturday 2 PM - 8 PM: AI features in Cursor
// Aisha opens the exported code in Cursor with .cursor/rules

// .cursor/rules/backend.mdc
// ---
// description: Backend rules for meeting notes app
// globs: ["src/lib/**", "supabase/functions/**"]
// ---
// Use Supabase Edge Functions for server-side logic.
// Use Deepgram for transcription (fast, accurate).
// Use OpenAI GPT-4o-mini for extraction (cheap, fast).
// Store transcripts as JSONB with word-level timestamps.
// Action items must have: text, assignee (optional), due_date (optional), status.

// Cursor Composer prompt:
// "Create a Supabase Edge Function that:
// 1. Takes an audio file URL from Storage
// 2. Sends it to Deepgram for transcription
// 3. Sends the transcript to GPT-4o-mini to extract:
//    - Meeting summary (3-5 sentences)
//    - Action items with assignee and due date
//    - Key decisions made
//    - Follow-up questions
// 4. Saves everything to the database
// 5. Updates the meeting status to 'completed'"
typescript
// supabase/functions/process-meeting/index.ts
// Generated by Cursor, refined by Aisha

import { createClient } from "@supabase/supabase-js";
import { OpenAI } from "openai";

const supabase = createClient(
  Deno.env.get("SUPABASE_URL")!,
  Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!,
);
const openai = new OpenAI({ apiKey: Deno.env.get("OPENAI_API_KEY")! });

Deno.serve(async (req) => {
  const { meetingId } = await req.json();

  // 1. Get audio URL from storage
  const { data: meeting } = await supabase
    .from("meetings")
    .select("audio_path")
    .eq("id", meetingId)
    .single();

  const { data: audioUrl } = supabase.storage
    .from("recordings")
    .createSignedUrl(meeting.audio_path, 3600);

  // 2. Transcribe with Deepgram
  const dgResponse = await fetch("https://api.deepgram.com/v1/listen?model=nova-2&smart_format=true&diarize=true", {
    method: "POST",
    headers: {
      "Authorization": `Token ${Deno.env.get("DEEPGRAM_API_KEY")}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ url: audioUrl.signedUrl }),
  });
  const transcript = await dgResponse.json();
  const fullText = transcript.results.channels[0].alternatives[0].transcript;

  // 3. Extract insights with GPT-4o-mini
  const extraction = await openai.chat.completions.create({
    model: "gpt-4o-mini",
    response_format: { type: "json_object" },
    messages: [{
      role: "system",
      content: `Extract from this meeting transcript: summary (3-5 sentences), action_items (array with text, assignee, due_date), decisions (array of strings), follow_ups (array of strings). Return JSON.`,
    }, {
      role: "user",
      content: fullText,
    }],
  });
  const insights = JSON.parse(extraction.choices[0].message.content!);

  // 4. Save to database
  await supabase.from("meetings").update({
    transcript: fullText,
    summary: insights.summary,
    status: "completed",
    duration_seconds: transcript.metadata.duration,
  }).eq("id", meetingId);

  await supabase.from("action_items").insert(
    insights.action_items.map((item: any) => ({
      meeting_id: meetingId,
      text: item.text,
      assignee: item.assignee,
      due_date: item.due_date,
      status: "pending",
    }))
  );

  return new Response(JSON.stringify({ ok: true }));
});

Sunday: Polish and Deploy (6 hours)

markdown
## Sunday Morning: Polish in Cursor

- "Add error states to all forms — show toast notifications on failure"
- "Add a loading skeleton for the dashboard while meetings load"
- "Add keyboard shortcuts: Cmd+N for new meeting, Cmd+K for search"
- "Make the action items draggable to reorder priority"

## Sunday Afternoon: Deploy

1. Push to GitHub
2. Connect to Vercel: `vercel --prod`
3. Set environment variables (Supabase, Deepgram, OpenAI keys)
4. Configure custom domain: meetingnotes.ai
5. Set up Stripe for billing (Cursor generates the webhook handler)
6. Test the full flow: upload → transcribe → extract → display

Monday: Launch

Aisha posts on LinkedIn and Product Hunt. By end of day, 47 users signed up, 12 uploaded meetings, and 3 converted to the Pro plan ($19/month each).

  • Total build time: 19 hours across a weekend
  • Tools cost: Bolt Pro $20 + Lovable Pro $20 + Cursor Pro $20 = $60 one-time
  • Infrastructure cost: Supabase free tier + Vercel free tier + Deepgram ($0.0043/min) + OpenAI ($0.15/1M tokens) = ~$5/month at early scale
  • Lines of code written manually: ~200 (Supabase Edge Function + tweaks)
  • Lines generated by AI: ~4,500
  • Time to first paying customer: 72 hours from idea