This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend
What I Built
We took a one-day trip to Mangalore, and the moment we got back, the photos started flooding the group chat. My friend let's name her Poo wanted to post a few on Instagram, but first she had to scroll through all of our pictures to find the ones she was in. It took about two hours.
That's when I thought: what if something could do this for us? Finding "the photos with my face in them" is a job a computer is good at. But it would mean handing my friends' faces to someone else's server, and I wasn't willing to do that. So I built FaceGotcha for Poo and the rest of our group: a version that runs entirely on your own laptop and finds your photos for you.
FaceGotcha is a "where am I in all these photos?" machine. You give it a few photos of your face and a giant pile of group photos, and it hands back only the ones you're in. Nothing is uploaded anywhere.
The whole thing in five steps:
- Pick up to 5 clear photos of yourself.
- Throw in the photo pile: a folder, like an unzipped WhatsApp export.
- Press Find my photos (the app cheerfully announces that it's "ignoring photos of food...").
- Swipe through only the uncertain ones. Swipe right for "that's me" (cue the GOTCHA! stamp) and left for "nope". It's like a dating app, except every match is you.
- Download a zip of your photos.
In my test of 55 WhatsApp photos, 26 were matched automatically, 9 needed my opinion, and 20 were ignored. Your original photos are never touched.
Faces are biometric data, and these are my friends' faces. So the one rule was: nothing leaves the laptop. No accounts, no cloud, no API keys.
Demo
Code
Ankita562
/
facegotcha
Find the photos you're in from a group-chat photo dump. Fully local face matching with open models (OpenCV YuNet + SFace). No cloud, no uploads.
Find the photos you're in, from a group-chat photo dump, fully offline
Drop in a few photos of your face and a folder of group photos. FaceGotcha finds the ones you appear in, lets you swipe through the uncertain ones, and gives you a zip. It runs on your own computer with open-source face models, so nobody's face data is ever uploaded anywhere.
Built for the Hacktoberfest Weekend Challenge: Build for a Friend.
Contents
- Demo
- Why I built it
- The flow
- How it works under the hood
- Open-source pieces
- Why open and local matters here
- Setup on your computer
- How to use it
- Settings
- How well does it work?
- Limitations
- Privacy
- Looking ahead
- Project structure
- Built with
- License and contact
Demo
- Video: Watch the demo video
Why I built it
One friend in my group has the phone with the best camera…
How I Built It
Two small open models do the heavy lifting. Both come from the OpenCV Zoo and run on the CPU, so no GPU is needed:
- YuNet finds every face in a photo.
- SFace turns each face into a fingerprint of 128 numbers. Faces of the same person land close together, and faces of different people land far apart.
-
OpenCV runs them, and Flask serves a little web page at
127.0.0.1, so other devices on the network can't open it.
The scoring works like a bouncer at a door. A photo scoring 0.53 or higher walks straight in. Between 0.38 and 0.53, it gets an ID check, which means it comes to you for a swipe. Below 0.38, it's turned away.
I added that middle band because OpenCV's suggested single cut-off (0.363) let the wrong people in during my first test:
| Setting | Auto-matched | Wrong person in it |
|---|---|---|
| OpenCV's default cut-off (0.363) | 35 | 8 |
| My cut-off with a review band (0.53 and 0.38) | 26 | 0 |
The swipe review is where I spent the most design effort. It's one photo and one gesture at a time, with undo on one key (Z). A "nope" doesn't delete anything: the photo moves to a Rejected album you can browse or download. The page also has a progress tracker along the top that ticks off each step, a scrolling reel of your matches, and a stats bar showing how every photo was sorted. Confetti appears when you find your photos, because finding your photos should feel like winning.
I built this with AI assistance (Claude) for writing and explaining the code. I designed the idea, tested it on my own photos, and tuned the cut-offs from the scores.
Honest limits:
- This is a small test on one person's face, not a benchmark, and the cut-offs were tuned on that one sample.
- It missed one photo of me, a group shot that scored 0.176. No cut-off could catch it without flooding the review pile with wrong people.
- Small faces in compressed group shots are the hardest case.
- A photo counts as a match if any face in it matches, which is why the review step matters.
- The stats bar shows how photos were sorted, not an accuracy score. The app has no answer key, so I counted the real accuracy by hand.
What's next: finding photos of two people at once (me and my best friend, together and solo), and collecting every photo of a friend for a birthday post.
Why Does Open Innovation Matter?
A face-sorting app has a problem most apps don't: it has to look at every one of your friends' faces. Sending the whole group chat to a cloud service just to find my face would be like photocopying everyone's face to find mine, including people who never agreed to that.
Open models made a different design possible:
- Privacy: the models run on your own machine, so face data never leaves it.
- Cost: no API keys, rate limits, or per-photo charges. The only download is two small model files, and after that it works offline.
- Control: I could see what the models do, change the cut-offs, and swap in a different open model without asking anyone.
- Reuse: both models are open source (YuNet is MIT-licensed and SFace is Apache 2.0, according to their LICENSE files in OpenCV Zoo), so anyone can run, change, and build on this project.
The honest trade-off: a big cloud service would probably be more accurate out of the box. Mine needs reference photos, a tuned cut-off, and a human to settle the borderline cases, and for photos of my friends, I'll take that deal.






Top comments (0)