How I Built an AI-Powered Reverse Hiring Platform with Next.js, Supabase, and OpenAI A developer built an AI-powered reverse hiring platform using Next.js, Supabase, and OpenAI. The platform flips the traditional hiring model by requiring companies to find candidates, disclosing salary upfront, and keeping candidates anonymous until they engage. The system uses OpenAI's GPT-4o-mini for resume parsing and match scoring, with embeddings and cosine similarity to determine compatibility. How I Built an AI-Powered Reverse Hiring Platform with Next.js, Supabase, and OpenAI https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiikm8lf9ycuz7nb85fll.png The hiring process is fundamentally broken. Candidates send hundreds of applications into a void of automated rejections. Companies pay €25,000 per hire to recruiting agencies who copy-paste LinkedIn profiles into emails. Everyone works harder, nobody gets better results. So I asked: what if we flipped the entire model? What if companies had to find candidates — not the other way around? What if salary was disclosed before the first conversation? What if candidates stayed anonymous until they chose to engage? That's what I built. Here's how. | Layer | Technology | |---|---| | Framework | Next.js 15 App Router | | Database + Auth | Supabase PostgreSQL + RLS + Auth | | AI | OpenAI GPT-4o-mini + text-embedding-3-small | | Hosting | Vercel serverless | | Resend | | | PDF Parsing | unpdf WASM-based, works serverless | | Styling | Tailwind CSS + Framer Motion | | State | Zustand | This is the most interesting part technically. Here's how match scoring works: js export async function parseResume text: string { const response = await openai.chat.completions.create { model: 'gpt-4o-mini', temperature: 0.2, response format: { type: 'json object' }, messages: { role: 'system', content: You extract structured profile data from resumes. Return JSON with: headline actual job title from resume, max 80 chars , bio 2-3 sentence summary preserving substance, anonymous , skills array, max 15 , experience years integer , industry, location. Important: Do NOT genericize. A "Senior Engineering Manager" should NOT become "Software Engineer". }, { role: 'user', content: text } , } return JSON.parse response.choices 0 .message.content || '{}' } Key lesson: the prompt must explicitly say "do not genericize." Without that instruction, GPT-4o-mini tends to normalize every title to "Software Engineer" and writes generic bios. export async function generateEmbedding text: string : Promise