Identify Swedish birds by ear or by camera, then collect them.

The phone listens through its mic and identifies birds singing nearby in real time, all on-device. Point the camera at one in a tree and it can name it from a photo too. Every sighting saves with location, weather, and habitat. The collection screen tracks the ~300 species you'll actually meet in Sweden, with rarer birds kept in their own list so the main goal stays achievable. The UI is in Swedish, the theme shifts with the season, and it all works offline.
Problem
The hard part is fitting a BirdNet-class model with 6,500 species onto a phone, then running 3-second audio classifications back to back without the UI dropping a frame.
Approach
A custom Kotlin audio module on Android emits PCM chunks and timestamps up to JS. The TFLite inference pipeline is async with a single-flight guard, so capture keeps streaming while the model runs on a worker thread. A ring buffer with hop-based windowing (3-second segments, 1-second hop) means detections fire continuously without redoing work. After profiling I moved FFT noise gating and any blocking I/O off the hot path. Photos go through a separate vision model with on-device preprocessing. A label-mapping layer filters BirdNet's global output down to species that actually occur in Sweden and joins it with curated data on distribution, habitat, calls, and conservation status. The product side got the same care: a quiet nature-first aesthetic that shifts across spring, summer, autumn, and winter, light and dark modes tuned for outdoor reading, accessibility labels everywhere, and touch targets sized for gloved hands in February.
Outcomes
On-device BirdNet handles the full 6,522-species label space with continuous audio inference and no UI jank, which was the technical bar I set. Everything else (sighting log, distribution heatmap, daily bird, quiz mode, full offline mode) ships from there. Currently in Android beta via debug builds; the iOS build is configured but not released yet.
Selected features
- Live audio ID with continuous spectrogram analysis
- Photo ID from gallery or camera
- Sighting log: GPS, weather snapshot, habitat tags, plus optional photo and audio
- Collection split into ~300 'core' species you can actually finish, and a separate rarity list
- Regional distribution heatmap of Sweden built on real observation data
- Daily bird, quiz mode, gamified completion tracking
- Seasonal theme: palette and mood shift with the time of year
- Fully offline with a backup and restore chain
- Swedish-first UI, light and dark mode, accessibility labels everywhere
Tech
Frontend
On-device ML
Native
Data & sync
Design system
Active development. Android beta via debug builds; iOS build configured but not yet released.