I'm a solo founder, and I build boring software for a living. My latest product is Hey AI Headshot — upload one selfie, get studio-quality professional headshots in minutes. No waitlist, no app install, no $300 studio session.
I want to share what the pipeline actually looks like, because the hard part of this product surprised me. It's not the model. It's likeness.
The pipeline
The flow is intentionally short:
- Upload. The user drops a single selfie. I enforce almost nothing at this step — no cropping UI, no "stand against a white wall" wizard. Every bit of friction here costs you a conversion, and I've learned users will not read instructions.
- Preprocessing. The image gets validated (face detection, minimum resolution) and normalized. If there's no detectable face, we say so immediately instead of burning a generation.
- Generation. The selfie goes to an image model with outfit, background, and style parameters the user picked. We generate multiple looks per run, not one — this matters more than any prompt trick (more on that below).
- Selection. The user picks the ones that look like them and downloads. Files never expire.
That's it. The whole thing is a thin, opinionated wrapper around a model. Solo-founder products live or die on the opinions, not the wrapper.
Likeness is the product
Here's the thing nobody tells you before building in this space: generating a good-looking headshot is easy. Generating one that looks like the user is the entire game.
Early on, my outputs were gorgeous and useless — smooth-skinned strangers in suits. The failure mode of every AI headshot tool is the same: plastic skin, warped ears, glasses that melt into the face, and a person who is "almost but not quite" you. At LinkedIn thumbnail size, almost-quite-you is worse than no photo at all, because it reads as dishonest.
Three lessons from months of iterating:
1. Input quality decides everything. This is the single biggest lever and it's not even close. Even window light, no beauty filters, no sunglasses, a recent photo with the user's normal hairstyle — this input produces dramatically better likeness than a filtered, dim bathroom selfie through the best model in the world. Filters destroy exactly the facial detail the model needs. I now tell users this upfront instead of pretending the AI can fix anything.
2. Likeness is a selection problem, not a one-shot problem. I stopped trying to make every generation perfect. Instead, generate several looks and let the user discard the ones that don't look like them. This one design decision did more for perceived quality than any model upgrade. My practical advice to anyone evaluating these tools: if a product doesn't let you judge likeness before paying, walk away. That's why I give 3 free HD previews with no credit card — you should see your own face in the output before money changes hands.
3. Style match beats photorealism. A hyperreal headshot in a finance suit on someone who works in a warehouse looks wrong to anyone who meets them. Letting users pick outfits and backgrounds close to how they actually dress does more for "this looks real" than extra resolution. I also built a background changer so people can refresh an older photo with a clean studio or plain-white backdrop instead of generating from scratch.
The unsexy parts that ate most of my time
Nobody writes about these, so I will. The model integration took a weekend. These took months:
- Pre-generation validation. Detecting "no usable face" before spending money on a generation call. Blurry, multi-face, and pet photos are all real inputs. Failing fast with a clear message ("we couldn't find a clear face — try a photo facing a window") saved more support tickets than any FAQ.
- Job idempotency. Users double-click. Networks retry. If your generation endpoint isn't idempotent, you will charge people twice for the same headshot and they will be furious. Idempotency keys on every generation request, full stop.
-
Stripe webhooks, done boringly. Verify signatures, handle
checkout.session.completed, make fulfillment retry-safe. I didn't get clever here and I'm glad. - The download experience. Sounds trivial. It isn't. Users want the files on their phone, in high resolution, without re-compressing them into mush. Test the actual bytes the user receives, not just the preview.
None of this is AI. All of it is the product.
Pricing and privacy as product decisions
I chose one-time pricing — $9 for 10 headshots up to $99 for 400 with 4K downloads — deliberately. Subscriptions make sense for tools people use weekly. A headshot is something you need twice a year. Charging monthly for that felt extractive, so I don't. Files never expire, commercial use is included on all plans, checkout is Stripe.
Privacy was the other non-negotiable: the uploaded selfie is sent to the model for generation and then discarded. Never stored, never used for training. This isn't just ethics theater — it's a conversion feature. People are (rightly) paranoid about uploading their face to a random website. "We delete it" outperforms every trust badge I tested.
What I'd do differently
If I were starting over, I'd spend the first month on the selection UX instead of generation quality. The model was good enough on day one; the thing users actually needed was a fast way to compare ten outputs side by side and spot the three that genuinely look like them. Everything else — backgrounds, outfits, 4K — is garnish.
I'm still iterating on likeness. If you've built anything in the image-generation space, I'd genuinely love to hear how you handle it — drop a comment.
And if you're curious what the output looks like on a real face (mine), I put the whole thing up at best ai headshot generator — 3 free previews, no card, judge the likeness yourself. That's the only pitch I'll make; the thumbnails speak louder than I can.











