← Back to Blog

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

  1. Roast — free, humorous, score-driven AI critique. Designed to be screenshot-and-share material.
  2. 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.