Back
03 · MobileBirdex Sverige
2024

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

Birdex Sverige collection and identification screens

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

React Native (Expo SDK 52)TypeScriptReact NavigationContext + custom hooksAnimated

On-device ML

react-native-fast-tfliteBirdNet (audio, 6,522 classes)Separate vision model for photosAsync inference, single-flight scheduling

Native

Custom Android Kotlin audio module (AudioPeakMonitor)Low-latency PCM captureConfigurable gain, sample rate, peak events

Data & sync

AsyncStorage with file-system backup chainOptional Supabase backendXenoCanto API (cached + offline fallback)Sentry for crash reporting

Design system

Themed colour tokens with onPrimary/contrast pairsSeasonal palette overridesWCAG-aware componentsshadcn-inspired primitives adapted for React Native

Active development. Android beta via debug builds; iOS build configured but not yet released.