Inspiration

Meetup and event photos are fun to share, but not everyone wants their face online. The usual fix — blurring every face — makes the photo meaningless: you can no longer tell who was there. I wanted to hide the face but keep the "who".

I had built this idea before as a small Rails web app that swapped faces for icons on a server. For Shipaton I rebuilt it from scratch as my first mobile app, moving everything onto the device so photos never have to be uploaded.

What it does

FaceSeal replaces each face in a photo with that person's own icon.

  1. Pick a photo. Faces are detected automatically, on-device.
  2. Tap a face and choose how to show it:
    • SNS icon — enter a handle on X, Instagram, Threads, TikTok or GitHub and the public profile icon covers the face
    • Text icon — a round icon made from a name or nickname, with your choice of font and colors
    • Emoji, Mosaic, or Keep as is for people who are fine being shown
  3. Tap a face in the photo to adjust its frame. Missed a face? Place a box over it to hide it too.
  4. Save or share.

The app is available in English and Japanese, with dark mode.

It's used for fan meetups (everyone's avatar on their face) and family photos (kids' faces covered with emoji).

The app is free. A one-time purchase, powered by RevenueCat, removes the ads and the small logo watermark.

How we built it

  • Flutter + Riverpod for the app, Google ML Kit for on-device face detection, dart:ui for compositing
  • A small Cloud Functions proxy to resolve SNS handles to public icons (with App Check)
  • RevenueCat (purchases_flutter) for the one-time purchase: purchase, restore and entitlement all go through RevenueCat
  • AdMob banner, interstitial and rewarded ads on the free plan

Challenges we ran into

  • It was my first mobile app. Store accounts, signing, privacy manifests, ATT, in-app purchase setup and App Review were all new to me.
  • Testing on real devices was hard. The iOS Simulator on my Apple Silicon Mac couldn't run the app because of ML Kit's architecture limits, and I don't own an iPhone, so I verified on an Android phone and an iPad, asked friends to try it on their own iPhones, and used TestFlight to check purchases.
  • Making icons sit naturally on faces: size, position and tilt are derived from the detected face, and every frame can be adjusted by tapping the face.
  • iOS-specific issues found only on real devices: small images returned no faces on iOS, and emoji rendered smaller than on Android.
  • Getting the privacy manifest, ATT and App Store privacy answers consistent for an ad-supported app that promises photos never leave the device.

Accomplishments that we're proud of

  • Privacy by design: face detection, editing and compositing all run on the device. Photos, face images and face features are never uploaded; the only data that leaves the device is the SNS handle you type, relayed through our server to fetch the public icon.
  • A result that still tells the story of the photo — you can see who was there without seeing anyone's face.
  • Shipping my first mobile app — complete with in-app purchase — to the App Store within the Shipaton period.

What we learned

Building with AI makes adding features almost effortless — and that turned out to be the trap. It was easy to keep piling on features, and the app started to lose its focus. I learned to keep asking what I actually wanted from the app and which features that value really needed, and to keep everything else out. Keeping it simple mattered more than adding more.

How much of shipping a mobile app happens outside the code: store listings, privacy declarations, review notes and device testing took as much care as the features themselves.

Monetization is part of the product design: I kept every core feature free and made the paid option simply remove ads and the watermark, so the app stays useful for everyone.

What's next for FaceSeal

  • Android release — currently in closed testing on Google Play
  • A personal library of text icons you can save and reuse across photos, plus more icon styles
  • A subscription plan (with RevenueCat) for heavier use, including video support: hide faces in videos, not just photos

Built With

Share this project:

Updates

Submission history