All projects
Mobile

BirdDex

Snap a photo of a bird to get an instant AI species ID, field-guide details and its real call, then collect it in a Pokédex-style BirdDex.
Overview

BirdDex turns bird-watching into a collection game. Take a photo of a bird and get an instant species ID with field-guide details and its real call, then collect it in your own BirdDex. It combines a vision-capable LLM with public biodiversity data (Wikipedia and Xeno-canto) and on-device storage, on Android and iOS.

Home: identify from camera or gallery, or open the BirdDex
Home: identify from camera or gallery, or open the BirdDex
Species detail: AI confidence, size, weight, conservation status and bird call
Species detail: AI confidence, size, weight, conservation status and bird call
BirdDex collection with search, filters and sorting
BirdDex collection with search, filters and sorting

How it works

  1. 1Capture

    Take a photo with the camera or pick one from the gallery.

  2. 2Identify

    The image is sent to GPT-4o mini with a prompt that forces a strict JSON response, so the output can be parsed reliably.

  3. 3Validate

    The JSON is parsed and checked; malformed or partial replies become typed errors or safe defaults instead of crashes.

  4. 4Enrich

    A reference photo comes from the Wikipedia API and a real bird call from Xeno-canto, both best-effort.

  5. 5Collect

    The sighting is saved to Hive on the device and added to the BirdDex collection grid.

Identification & species detail
  • Common and scientific name, confidence score, description, habitat, diet, IUCN status, size and weight
  • Animated, colour-coded confidence bar and a conservation-status badge
  • Bird call player with play/pause and a seekable progress slider
  • Favorites and personal notes per species, stored offline
BirdDex collection
  • Seed catalogue of species (including Portuguese names); unfound species show as “???”
  • Progress bar of collected species
  • Search by common or scientific name
  • Filter by collected, uncollected, favorites and size; sort by name, date or weight

Design decisions

Structured LLM output

The prompt pins the model to a fixed JSON schema, and the client defends against bad replies, so the UI never crashes on model output.

Graceful degradation

Wikipedia images and Xeno-canto audio are optional enrichments; if they fail, the UI shows a placeholder instead of blocking the identification.

Smart audio fallback

If there is no recording for the exact species, the app retries by genus before giving up.

Offline-first personal data

Collection, favorites and notes live in separate Hive boxes, so they work without a connection and stay independent.

Layered structure

Screens, services that own every network call, and a persistence layer, so each concern can be changed or tested in isolation.

Secrets out of source control

API keys are read from a git-ignored .env file.

Stack
FlutterDartOpenAI GPT-4o mini (vision)HiveWikipedia APIXeno-canto APIjust_audio
What’s next
  • Move the OpenAI call behind a small backend proxy so no key ships with the app
  • On-device identification with a TensorFlow Lite model, for offline use and lower cost
  • Riverpod or Bloc state management and wider test coverage
  • Location tagging and a sightings map
  • In-app language switching using the Portuguese names already in the catalogue

© 2026 Daniel Paulino • Built with Nuxt • Updated October 2026