Your backyard bird station, on your phone. A companion app for BirdNET-Pi, BirdNET-Go, and BirdWeather stations.
21
stars
97
commits
TypeScript
primary language
Jul 29, 2026
updated
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 | Sighting detail | Settings |
|---|---|---|
![]() | ![]() | ![]() |
Captured on a Samsung Galaxy S24+ against a BirdNET-Go station. Thanks to @HWittingen for contributing these.
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.
.csv file from the Stats tabAndroid-first. iOS distribution is on hold while the Android app matures (the code stays cross-platform, so local iOS builds remain possible).
Recently shipped
Planned (Android)
On hold
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 and F-Droid 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).
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 progress.
http://birdnetpi.local or http://192.168.1.50. BirdEcho will probe the station before saving.Both the original mcguirepr89/BirdNET-Pi and the Nachtzuster fork are supported.
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.
.../stations/12345.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.
http://birdnetpi.local in your phone's browser — if the web UI loads, BirdEcho should connect. Make sure you're on the same Wi-Fi network./api/v2/ping is reachable. BirdNET-Go v2.x is required.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 this fallback 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 start
Press 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.
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
MIT © 2026 Arun Rajiah
97 commits
TypeScript
98.9%
JavaScript
1.1%
Your backyard bird station, on your phone. A companion app for BirdNET-Pi, BirdNET-Go, and BirdWeather stations.
21
stars
97
commits
TypeScript
primary language
Jul 29, 2026
updated
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 | Sighting detail | Settings |
|---|---|---|
![]() | ![]() | ![]() |
Captured on a Samsung Galaxy S24+ against a BirdNET-Go station. Thanks to @HWittingen for contributing these.
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.
.csv file from the Stats tabAndroid-first. iOS distribution is on hold while the Android app matures (the code stays cross-platform, so local iOS builds remain possible).
Recently shipped
Planned (Android)
On hold
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 and F-Droid 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).
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 progress.
http://birdnetpi.local or http://192.168.1.50. BirdEcho will probe the station before saving.Both the original mcguirepr89/BirdNET-Pi and the Nachtzuster fork are supported.
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.
.../stations/12345.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.
http://birdnetpi.local in your phone's browser — if the web UI loads, BirdEcho should connect. Make sure you're on the same Wi-Fi network./api/v2/ping is reachable. BirdNET-Go v2.x is required.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 this fallback 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 start
Press 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.
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
MIT © 2026 Arun Rajiah
97 commits
TypeScript
98.9%
JavaScript
1.1%