I built an AI headshot tool that keeps the actual face (flux-pulid instead of pure diffusion)
Most "AI headshot" generators run a text-to-image diffusion model conditioned loosely on your selfie, then hope the result still looks like you. It usually doesn't — noses shift, jawlines change, and the output looks like a sibling of the person who uploaded the photo, not the person themselves.
I built Crisp Headshots to solve that identity-drift problem specifically, using fal.ai's flux-pulid model instead of a standard img2img pipeline.
Why flux-pulid instead of the usual approach
Standard diffusion-based headshot generators (the kind behind most of the "$29 for 40 AI headshots" products) work like this:
- Fine-tune a LoRA on 10-20 uploaded selfies (slow, needs GPU minutes per user)
- Generate new images conditioned on that LoRA
- Accept that identity fidelity degrades the further the requested style is from the training photos
flux-pulid is an identity-preservation model — it takes a single reference photo, extracts a face embedding, and conditions generation directly on that embedding rather than on a fine-tuned LoRA. Practical differences for a small SaaS:
- No per-user training step. One reference photo in, one generation call out. No LoRA training queue, no "come back in 20 minutes."
- Identity fidelity holds up across styles. Corporate headshot, casual outdoor, studio backdrop — the face embedding stays anchored even as background/lighting/outfit change.
- Cost and latency are predictable. A single inference call instead of a training job plus inference.
The pipeline
selfie upload → face embedding extraction (fal flux-pulid)
→ style prompt (corporate / casual / creative presets)
→ generation (multiple variants per style)
→ user picks favorites → download
No account required to try it, no stored face data beyond the session needed to generate the images, and checkout is a flat one-time fee — no auto-renewing subscription pattern, since this is a pay-per-batch tool for people who need a headshot before a Monday interview or a LinkedIn refresh, not a recurring need.
What I'd tell anyone building on fal for identity-preserving generation
- Test with photos that have inconsistent lighting/angles early — that's where embedding-based models separate from LoRA-based ones in quality.
- Budget for variant generation, not single-shot. Users pick their favorite out of 4-6 options, they don't want one roll of the dice.
- Preset prompts (corporate/casual/creative) outperform a free-text prompt box for this use case — most people don't know how to prompt for headshot photography and get better results from constrained choices.
Live tool: https://headshot-studio-5h6.pages.dev/
Happy to go deeper on the fal integration code or the variant-selection UX if useful — drop a comment.
Top comments (0)