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.
## 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
## 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.
## 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
// 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'"
// 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)
## 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