All work

Left Right: Photo Cleaner

Allora Foundry

Swipe a camera roll clean.

In reviewIn review on the App Store and Google Play as of Oct 3, 2026.
Platforms
iOS, Android
Period
Aug 2026 – present
Role
Lead mobile engineer
Left Right app icon

An on-device photo cleaner: swipe right to keep, left to delete, then clear out duplicates and screenshots. I took it from first commit to App Store and Google Play review in about six weeks, with about 95% of the commits.

What I built

Native modules in Kotlin and Swift

Three hand-built Expo modules. media-hash computes a perceptual hash of every photo on a cancellable background thread with progress events. media-stats counts the library by month and folder in a single pass. screen-state tells the biometric app lock when the phone itself was locked.

The whole money stack

RevenueCat subscriptions (weekly, annual, and a discounted annual plan, with three-day trials) behind a paywall I built myself. AdMob native, interstitial and rewarded ads behind UMP and App Tracking Transparency consent. AppsFlyer attribution linked to RevenueCat, and Sentry with session replay and PII deliberately switched off.

Built test-first

1,759 tests across 185 suites, with TypeScript clean before every commit. Store builds refuse to compile if a RevenueCat, AppsFlyer or Sentry key is missing, so a misconfigured release cannot ship.

Hard problems, solved

A duplicate group that swallowed 212 photos

On a real device, chained similarity matching pulled 212 unrelated photos into one ‘duplicate’ group. I redesigned grouping around seed photos and filtered out low-information hashes, then re-verified on Android and iOS.

A 17-second freeze after deleting

Bulk deletes stalled the JavaScript thread for 17 seconds. I found the cause and removed it, so the app stays responsive straight after a delete.

4K video crashing Android

ExoPlayer's buffer ran the app out of memory on 4K clips in the swipe deck. Traced and fixed.

A misleading PhotoKit error on iOS

Hashing failed with PhotoKit error 3303, which pointed at the wrong cause. I traced it, then switched iOS to reading asset data and downsampling with ImageIO.

Information

Client
Allora Foundry LLC
Role
Lead engineer, about 95% of 708 commits
Platforms
iOS and Android
Built with
Expo SDK 57, React Native 0.86, TypeScript, Kotlin, Swift, Reanimated
Monetization
RevenueCat, custom paywall, AdMob, AppsFlyer
Monitoring
Sentry errors and traces, source maps from builds and OTA
Privacy
Everything runs on the device. No backend, no account.

Version history

  1. In review on both stores

    Oct 3, 2026

    iOS 1.0 waiting for review. Google Play production release 1.0.0 (9) set for full rollout to 177 countries and regions.

  2. TestFlight build 1.0.0 (2)

    Sep 28, 2026

  3. Real purchase verified

    Sep 23, 2026

    Google Play Billing tested end to end on a real phone through internal testing.

  4. First commit

    Aug 22, 2026

Next: CLPPER