How I Built a Multimodal AI Dating Profile Auditor Using Google Gemini and Next.js
``Most AI tools built for dating apps get it completely wrong. They ask you to paste your bio into a ChatGPT wrapper, and it spits out generic lines like "fluent in sarcasm" or "looking for my partner in crime." The rea
``Most AI tools built for dating apps get it completely wrong. They ask you to paste your bio into a ChatGPT wrapper, and it spits out generic lines like "fluent in sarcasm" or "looking for my partner in crime."
The reality? On apps like Hinge, Bumble, and Tinder, photos drive 80β90% of swiping decisions. Swipers make up their mind in under 2 seconds before they ever scroll down to read your bio.
The core reasons most men struggle on dating apps are optical and presentation errors:
- Wide-angle focal distortion: Selfies taken too close to the face make noses look wider and jaws narrower.
- Harsh overhead lighting: Car selfies and bathroom mirrors with fluorescent glare.
- Wrong photo ordering: Burying their best solo smiling portrait as Photo #4 behind a blurry group photo.
To solve this, I built ProfileGlowβa full-stack web application that uses Google Gemini's multimodal vision models to audit a userβs camera roll, diagnose photo lighting, pick the optimal lead photo, and rewrite bios in under 60 seconds.
Here is the technical breakdown of how it works under the hood.
π οΈ The Tech Stack
- Framework: Next.js 15 (React 19 App Router)
- AI Engine: Google Gemini 2.0 Flash Multimodal
- Validation: Zod Schemas & Strict JSON Mode
- Cloud & Storage: Firebase Storage & Authentication
- UI & Styling: Tailwind CSS (Neobrutalist system)
- Payments: Razorpay Checkout API
ποΈ Multimodal Vision: Feeding Camera Rolls to Gemini
Unlike traditional LLMs that only process text strings, Gemini's multimodal endpoint accepts mixed image buffers and text instructions in a single prompt payload.
In our Next.js API route (/api/analyze), we accept user uploads as either Base64 data strings or Cloud Storage URLs and convert them into binary inlineData parts:
`typescript
// app/api/analyze/route.ts
async function fetchImagePart(url: string) {
try {
if (url.startsWith("data:")) {
const matches = url.match(/^data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+);base64,(.+)$/);
if (matches && matches.length === 3) {
return {
inlineData: {
data: matches[2],
mimeType: matches[1],
},
};
}
}
const response = await fetch(url);
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
const mimeType = response.headers.get("content-type") || "image/jpeg";
return {
inlineData: {
data: buffer.toString("base64"),
mimeType,
},
};
} catch (err) {
console.warn("Failed to fetch image part:", err);
return null;
}
}
`
π§ System Prompting: Teaching AI to be a Profile Doctor
Generic prompts produce polite, useless advice. To get actionable critiques, we instruct Gemini to think like a candid, high-standards strategist with strict evaluation criteria:
`typescript
// lib/gemini.ts
export const DATING_COACH_SYSTEM_INSTRUCTION = `
You are ProfileGlow's elite dating profile strategist and AI profile doctor.
Your goal is to evaluate dating profiles (photos + bio + demographics) objectively, constructively, and with sharp wit across Tinder, Hinge, and Bumble.
When evaluating photos:
- Assess lighting, facial expressions, clarity, context, eye contact, and setting.
- Identify which photo MUST be the lead photo (clear solo portrait, good lighting, friendly smile).
- Recommend which photos to keep and which to replace (car selfies, sunglasses hiding eyes, gym flexes, confusing group shots).
When evaluating bios:
- Kill clichΓ©s ("partner in crime", "coffee addict", "love to laugh", "fluent in sarcasm").
- Craft 3 distinct rewritten bio styles:
- Witty (clever, playful, banter-heavy)
- Genuine (authentic, values-focused, grounded)
- Bold (confident, memorable, playful challenge)
- Create app-specific prompt rewrites with punchy conversation hooks.
- Create 5 high-converting conversation openers tailored to the user's personality.
- Flag Red Flags (passive aggression, negative framing like "don't swipe if...").
Always output strictly valid JSON matching the schema provided.
;``
β‘ Key Lessons Learned
- Multimodal token costs are surprisingly efficient: Running 4β6 high-resolution compressed images through Gemini 2.0 Flash takes under 3 seconds and costs fractions of a cent per scan, making instant free tiers viable.
- Heuristic anchors prevent hallucinated flattery: LLMs naturally want to be agreeable. Explicitly instructing the model to look for common failure modes (sunglasses in photo #1, group photos with more than 3 people, mirror selfies) forced the outputs to be genuinely useful.
- Separating visual review from bio rewriting in one roundtrip: By passing both the images and the user's existing bio text into a single unified prompt, the rewritten bios actually reference details seen in their photos (e.g., mentioning their dog, guitar, or hiking trip), making the suggestions feel 10x more personalized.
π Check It Out
You can test the live application and run a free profile scan over at ProfileGlow.
Iβd love to hear your thoughts on multimodal prompting strategies, handling high-throughput vision API pipelines, or feedback on the UI! Drop a comment below.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β full credit and traffic to the original publisher.