Part of an open wildlife toolkit. Not sure this is the project you need? See which project to use.
BirdEcho is a free, open-source Android companion app for existing BirdNET-Pi, BirdNET-Go, and BirdWeather audio detection stations. If you already have a station running, BirdEcho lets you follow it from your phone — no new hardware, no cloud account required.
BirdEcho is not a bird-identification app. It does not listen to audio or identify birds itself. It surfaces what your station has already detected, puts the data in your pocket, and notifies you when a species you care about shows up.
| Feed | Species | Near you on WildNetwork |
|---|---|---|
![]() |
![]() |
![]() |
| Feed (dark) | Sighting | Stats (dark) |
![]() |
![]() |
![]() |
Captured with the built-in demo station (bird photos are CC0 from iNaturalist). Earlier screenshots were contributed by @HWittingen, thank you.
More screens (Species, Stats, Favorites) coming soon — if you're running BirdEcho against your station, we'd love your help! See docs/media/README.md for the capture checklist and how to submit a PR.
- Live detection feed — auto-refreshed every 60 seconds, infinite scroll, pull-to-refresh
- Offline cache — last 24 hours of detections persisted locally; feed is readable with no network, stale data shown instantly while a background refresh runs
- Sighting detail — tap any detection to play the audio recording and share a PNG card
- Detection times shown in your station's local timezone
- Species browser — every species your station has ever detected, with images
- Species detail — detection count, recent sightings list, star/unstar
- Headline stats — detections today, this week, unique species all-time
- 14-day detection bar chart
- Top 10 species by detection count
- CSV export — export the current feed as a
.csvfile from the Stats tab
- Multi-station support — monitor any number of BirdWeather, BirdNET-Go, and BirdNET-Pi stations from one app; switch with a tap from Settings
- Station map — all your BirdWeather stations on an interactive map; tap a marker to switch stations or open in Apple/Google Maps
- Direct BirdNET-Go support — connect over your home network; no BirdWeather account needed
- Direct BirdNET-Pi support — connect to a local BirdNET-Pi instance (both mcguirepr89 and Nachtzuster forks supported)
- Favourites — star any species and get a local notification the first time it's detected each day
- Rare-species alerts — opt-in local notification when a species rarely seen at your station is detected
- Android home-screen widget — today's detection count and last detected species, glanceable without opening the app
- Light / Dark / System theme
- Secure token storage via iOS Keychain / Android Keystore
Android-first. iOS distribution is on hold while the Android app matures (the code stays cross-platform, so local iOS builds remain possible).
Recently shipped
- ⌚ Wear OS glance (tile + watch app) — v0.10.0
- 🔔 Rare-species detection alerts — v0.7.0
- 🏷️ Species rarity badge — v0.6.0
- 📊 Detection CSV export & 🗺️ station map — v0.5.0
- 📡 Multi-station support — v0.4.0
- 🐦 Direct BirdNET-Pi & BirdNET-Go, 📴 offline cache, 🔲 home-screen widget — v0.3.x
Planned (Android)
- 🎵 Spectrogram view on the sighting detail screen
- 📦 F-Droid listing
On hold
- 🍎 iOS App Store / TestFlight, Apple Watch — paused to focus on Android
See ROADMAP.md for the full, living roadmap.
Android: get it on Google Play. This is the recommended way to install BirdEcho and get automatic updates.
Prefer to sideload? Grab the latest signed APK from GitHub Releases. No Play account needed: enable "Install from unknown sources" in Android Settings, download the APK, and install.
Staying up to date: the Google Play build updates automatically through Play. GitHub builds instead self-update from v0.8.0 onward, showing an in-app banner when a newer version is on GitHub Releases (tap Download & install and confirm the Android install prompt).
BirdEcho has a Wear OS companion: a tile and a small watch app that show your station's latest detection, when it happened, and today's count.
- Works on its own. The watch fetches from your station about every 15 minutes (and when you open the tile or tap Refresh), so it keeps updating with the phone app closed.
- No typing on the watch. BirdEcho on your phone sends the active station to the watch whenever you add or switch stations.
- Stations: BirdWeather, BirdNET-Go and BirdNET-Pi, plus the demo station.
- Try it without a station: tap Try demo on the watch, or pick the demo station on your phone.
- Requires: Wear OS 3 or newer, and BirdEcho v0.10.0 or newer on the phone.
Install: download birdecho-wear.apk from GitHub Releases and sideload it onto the watch (for example with adb install over wireless debugging). Use it together with the GitHub phone APK: the phone and watch apps must be signed with the same key to talk to each other, so the watch app cannot yet receive a station from the Google Play or F-Droid builds. The watch app is also on Google Play: install BirdEcho on the phone from Play, then open the Play Store on the watch and install BirdEcho there. Play signs both with the same key, so they pair with each other. The GitHub APKs pair only with each other, not with the Play build.
Good to know: a BirdNET-Go station on your home network only updates while the watch can reach that network. This is a first release and has been tested on the Wear OS emulator, not yet on a wide range of watches, so bug reports are very welcome.
iOS — App Store / TestFlight distribution is currently on hold while development focuses on Android. The codebase stays cross-platform, so community builds are welcome — see CONTRIBUTING.md for how to build locally with EAS.
F-Droid submission is in review: fdroiddata!50346.
- Make sure your BirdNET-Pi is reachable from your phone — same Wi-Fi network or VPN.
- Open BirdEcho → Connect your station → choose BirdNET-Pi.
- Enter the host URL, e.g.
http://birdnetpi.localorhttp://192.168.1.50. BirdEcho will probe the station before saving.
Both the original mcguirepr89/BirdNET-Pi and the Nachtzuster fork are supported.
- Make sure your BirdNET-Go instance is reachable from your phone — same Wi-Fi network or VPN.
- Open BirdEcho → Connect your station → choose BirdNET-Go.
- Enter the host URL, e.g.
http://192.168.1.100:8080. BirdEcho will ping the station to verify the connection before saving.
No token or account needed. BirdNET-Go's /api/v2 endpoints are public by default.
- Log in to app.birdweather.com and copy your API token from account settings.
- Find your Station ID on the station dashboard URL:
.../stations/12345. - Open BirdEcho → Connect your station → choose BirdWeather → paste both values → tap Connect.
Your token is stored in the device's secure enclave (iOS Keychain / Android Keystore). It is sent only to the BirdWeather API, never logged or cached in plain text.
Which connection mode should I use? If your BirdNET-Pi or BirdNET-Go instance is on your home network (or reachable via VPN), use the direct mode — no third-party account needed. Use BirdWeather if you share detections publicly or only have a BirdWeather account.
Where do I find my BirdWeather API token and Station ID?
Log in to app.birdweather.com. Your API token is under account settings (top-right menu → Account). Your Station ID is the number at the end of your station's URL — e.g. app.birdweather.com/stations/12345 → Station ID is 12345.
BirdEcho says "No detections found" but my station is running.
- BirdNET-Pi: try opening
http://birdnetpi.localin your phone's browser — if the web UI loads, BirdEcho should connect. Make sure you're on the same Wi-Fi network. - BirdNET-Go: check that
/api/v2/pingis reachable. BirdNET-Go v2.x is required. - BirdWeather: check that BirdWeather integration is enabled on your station. Pull down to refresh after enabling.
The app says "Invalid token or station" on connect. Double-check both values — the token is case-sensitive and the Station ID must be a number, not the station name. Try copying the token fresh from BirdWeather; some browsers add a trailing space.
I connected successfully but the feed is empty. Your station may not have any detections yet. Pull down to refresh. If your station has detections on the BirdWeather website but not in BirdEcho, please open an issue.
Notifications aren't arriving. Check that you granted notification permission when prompted. On Android, also check that battery optimisation isn't killing the app in the background. Note: alerts are local-only (no server-side push yet) and fire while the app polls — when a favourited species is detected, or, if you enable Rare species alerts in Settings, when a species rarely seen at your station shows up.
The Android Map tab says "Map not available in this build."
The Android map needs a Google Maps API key set at build time (EXPO_PUBLIC_GOOGLE_MAPS_API_KEY). Builds compiled without one — including F-Droid/IzzyOnDroid builds — show a station list with "Open in Maps" links instead of the map, because mounting the native map without a key crashes the app. iOS uses Apple Maps and needs no key.
Is my token stored securely?
Yes. BirdEcho uses expo-secure-store, which maps to iOS Keychain and Android Keystore. Your token is never logged, cached to disk in plain text, or sent anywhere other than the BirdWeather API.
Can I monitor multiple stations? Yes — add as many stations as you like (any mix of BirdWeather, BirdNET-Go, and BirdNET-Pi) and switch between them with a tap from the Settings tab.
# clone
git clone https://github.com/arunrajiah/birdecho.git
cd birdecho
# install (project uses pnpm)
pnpm install
# start dev server
npx expo startPress i for iOS simulator, a for Android emulator, or scan the QR code with Expo Go.
| Variable | Default | Description |
|---|---|---|
EXPO_PUBLIC_SENTRY_DSN |
(unset) | Optional. Enables Sentry error and performance tracking when set. |
EXPO_PUBLIC_SENTRY_TRACES_SAMPLE_RATE |
0.2 |
Optional. Sentry performance traces sample rate (0.0–1.0). |
EXPO_PUBLIC_GOOGLE_MAPS_API_KEY |
(unset) | Optional. Google Maps API key for Android map tiles. |
Copy .env.example to .env.local at the project root and fill in the values you need. .env.local is git-ignored and never committed.
Eight open source projects for listening to, identifying and mapping wildlife. They work together, but you rarely need more than one or two. Start from what you want to do:
| I want to | Use | What it is |
|---|---|---|
| See where birds and wildlife are moving, or download the data | WildNetwork | The live map and open data: wildnetwork.arunrajiah.com |
| Build a monitoring station from open hardware | WildNetwork Base | Software and a ready-to-flash SD card image (beta) for the open WildNetwork station (Raspberry Pi, microphone, solar) |
| Share detections from a BirdNET-Pi, BirdNET-Go, camera trap or bat detector you already have | wdx-agent | One small program that sends your station's detections. BirdWeather stations are already included and need nothing |
| Follow your own station on your phone | BirdEcho (this project) | Android app for BirdNET-Pi, BirdNET-Go and BirdWeather stations |
| Identify a sound you just heard | WildEcho | Phone app: record a clip, get ranked species |
| Run your own sound identification server | wildecho-api | Self-hosted species identification from audio, on CPU, no API keys |
| Check camera trap predictions before you use them | SpeciesNet Studio | Self-hosted review of SpeciesNet results |
| Make your own software or device produce or read detections in a common format | WDX | The open format for one AI wildlife detection; maps to Darwin Core |
How this one fits. BirdEcho is the phone app for your own station. Setting up a WildNetwork Base from the app is planned.
How they connect: stations (a WildNetwork Base, BirdNET-Pi, BirdNET-Go, camera traps) produce detections; wdx-agent sends them in the WDX format; WildNetwork maps them. Connected today: wdx-agent and the WildNetwork Base send to WildNetwork, and WildEcho uses wildecho-api. Planned: Base setup in BirdEcho, and WDX export from wildecho-api and SpeciesNet Studio.
Pull requests are welcome. Please read CONTRIBUTING.md before opening one.
Bug reports and feature requests go in Issues — use the provided templates.
If BirdEcho is useful to you, consider sponsoring continued development:
github.com/sponsors/arunrajiah
- BirdWeather — the API and hosted platform
- BirdNET-Pi by @mcguirepr89
- BirdNET-Pi (Nachtzuster fork) by @Nachtzuster
- BirdNET-Go by @tphakala
- Cornell Lab of Ornithology for the BirdNET research and model
- The Expo and React Native communities
MIT © 2026 Arun Rajiah





