Cat'aloge
AI-powered mobile app that finds and organizes all your pet photos: entirely on-device, no cloud, no privacy trade-offs.
An AI-powered mobile app that automatically scans your phone gallery and organizes pet photos using TensorFlow Lite inference running fully on-device.
Cat'aloge is a cross-platform AI-powered mobile application that automatically detects and organizes pet photos directly on-device using TensorFlow Lite. No photo is ever uploaded to a server: the entire ML inference pipeline runs locally on the device.
The app uses EfficientDet Lite2, a lightweight object detection model optimized for mobile, to scan through a user's gallery image by image and identify photos containing pets. Detected photos are displayed with their confidence score, and users can favorite, preview, and share them.
The engineering challenge was making this performant across thousands of photos without freezing the UI or draining the battery. This required building a custom Dart isolate worker pool so ML inference runs in parallel background threads, a two-tier caching system (in-memory LRU + Hive disk persistence), and a batched scanning pipeline with backpressure control for low-end devices.
The architecture follows Clean Architecture with Riverpod async notifiers streaming results to the UI as inference completes: giving a live, progressively-revealing gallery experience.
Key Features
On-device ML: Zero Cloud
EfficientDet Lite2 runs directly on the device. No internet connection required. No photos ever leave your phone.
Parallel Isolate Worker Pool
A custom pool of Dart isolates processes photos in parallel background threads, keeping the UI thread completely free.
Two-tier Caching System
Detection results are cached in memory during the session and persisted to disk via Hive, so reopening the app is instant with no re-scanning.
Confidence Score Display
Every detected pet photo is shown with its ML confidence score, letting users see and trust what the model found.
Privacy by Design
The ML model is bundled with the app at build time. Zero network requests for inference. Your gallery never touches a server.
Tech Stack
Architecture
The detection pipeline is entirely on-device. Photos are fetched from the device gallery in batches and dispatched to a custom isolate worker pool. Each isolate runs its own EfficientDet Lite2 interpreter instance independently: isolates in Dart don't share memory, so each one lazily initializes its own model on first use to avoid spiking memory at startup.
Results flow back to the main isolate via SendPort and are written to a two-tier cache: an in-memory LRU cache for the current session and a Hive disk cache for persistence across launches. Riverpod async notifiers stream cache updates directly to the gallery UI as each batch completes.
Challenges & Solutions
The hard problems, and how I solved them.
Running ML inference without freezing the UI
Scanning thousands of photos on low-end devices
Cache invalidation between app launches
More Projects
Interested in working together?
I'm always open to discussing new projects and opportunities.