DEV Community

Cover image for I Built an Offline Face Finder So My Friends Can Stop Scrolling the Group Chat.
Ankita
Ankita

Posted on

I Built an Offline Face Finder So My Friends Can Stop Scrolling the Group Chat.

Hacktoberfest Weekend Challenge: Build for a Friend Submission 🤝

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 four steps of FaceGotcha: pick up to 5 photos of you, add a photo folder, press Find my photos, then swipe the maybes and download a zip

The whole thing in five steps:

  1. Pick up to 5 clear photos of yourself.
  2. Throw in the photo pile: a folder, like an unzipped WhatsApp export.
  3. Press Find my photos (the app cheerfully announces that it's "ignoring photos of food...").
  4. 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.
  5. 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

The FaceGotcha start screen with a progress tracker along the top and cards for adding your photos and the photo pile

The numbers after a search: a colour bar showing how every photo was sorted

Code

GitHub logo 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.

FaceGotcha: a polaroid seen through a smiling magnifying glass

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

The start screen The numbers after a search

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)