Roast & Resolve: Building a GPT-4o Critique Funnel
A free, brutally honest AI roast of your resume, website, or dating profile — then a paid resolve report. The architecture behind a low-friction B2C content loop.
Roast & Resolve is deployed. Upload a resume, a website screenshot, or a dating profile and get a free, unflinching GPT-4o roast. Then unlock a paid resolve report — rewrites, ATS keyword fixes, structural improvements, before/after comparisons.
It's a B2C viral product, so the whole thing is built around one idea: make the free critique shareable and emotionally resonant, and put the smallest possible amount of friction between "upload" and "reveal."
The two-phase loop
- Roast — free, humorous, score-driven AI critique. Designed to be screenshot-and-share material.
- Resolve — the paid transformation: rewrites, keyword fixes, industry-specific recommendations.
No account is required to receive the free roast. Email is captured after processing as a soft gate — a non-dismissable modal that sits between the processing screen and the roast reveal. That ordering matters: the user has already paid attention and seen the loading payoff, so the email ask converts before any payment is requested, and it enables session linking + remarketing.
What gets analyzed
| Type | Inputs | Analyzed |
|---|---|---|
| Resume | PDF, DOCX | Layout, bullet language, ATS keywords, summary quality |
| Website | URL, PNG, JPG, WEBP | Visual hierarchy, CTA clarity, load indicators, design choices |
| Dating profile | PNG, JPG, WEBP | Bio hooks, photo selection, prompt quality, overall impression |
Data flow
User uploads file
│
▼
Next.js client → POST /api/roast/file (or /api/roast/url)
│
▼
FastAPI backend
├── PDF/DOCX → pdf2image → JPEG render → Cloudflare R2
└── Image/URL → direct → GPT-4o Vision
│
▼
GPT-4o generates roast + resolve content
│
▼
FastAPI persists lead + roast result to Supabase Postgres
│
▼
Processing screen → non-dismissable email capture modal
│
▼
Email submitted → roast unlocked
│
▼
User picks a tier → Stripe Checkout → webhook → payment row in Supabase
│
▼
Paid resolve content un-blurs
PDFs and DOCX files are rendered to a JPEG of the first page via pdf2image before going to GPT-4o Vision — the model sees the document the way a human reviewer would, layout included, not just extracted text.
Stack
| Layer | Technology |
|---|---|
| Frontend | Next.js 15, React 19, TypeScript, Tailwind CSS, Framer Motion |
| Backend API | Python 3.12, FastAPI, Uvicorn |
| AI engine | OpenAI GPT-4o (Vision + Text) |
| Database | Supabase (PostgreSQL) |
| File storage | Cloudflare R2 (temporary uploads + generated Roast Cards) |
| Payments | Stripe (Embedded Checkout) |
| Hosting | AWS EC2 (single-server Docker Compose) |
| Reverse proxy | Nginx — SSL termination, /api/* routing |
| DNS & edge | Cloudflare (A-record to EC2 Elastic IP, Full Strict SSL) |
All database writes flow through FastAPI endpoints — no browser-side database client, and DATABASE_URL is server-side only. Stripe webhooks are signature-verified with stripe.webhooks.constructEvent before any row is written.
Pricing
| Tier | Price | |
|---|---|---|
| Quick Fix | $1.99 one-time | Top 5 critical fixes + rewrites, ATS keyword report |
| Resolve Pro | $9.99 one-time | Full rewrite, before/after, industry optimization, cover-letter template |
| Unlimited | $29.99/mo | Everything in Pro, unlimited roasts + resolves, LinkedIn optimization, AI chat |
Why single-server Docker Compose
The cost driver here is GPT-4o calls, not infrastructure. A B2C funnel like this doesn't justify a Kubernetes bill — one EC2 instance behind Nginx, with Cloudflare absorbing edge load and terminating TLS at strict origin, keeps the operational surface tiny. The roads still open: first-class auth (Clerk) is planned, and the dashboard's mock data is being swapped out as the backend gets wired end to end.