{"id":49535136,"url":"https://github.com/arunrajiah/birdecho","last_synced_at":"2026-06-11T07:01:10.606Z","repository":{"id":352589048,"uuid":"1215757160","full_name":"arunrajiah/birdecho","owner":"arunrajiah","description":"Your backyard bird station, on your phone. A companion app for BirdNET-Pi, BirdNET-Go, and BirdWeather stations.","archived":false,"fork":false,"pushed_at":"2026-05-29T14:18:33.000Z","size":895,"stargazers_count":13,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-29T16:10:42.322Z","etag":null,"topics":["birdnet-go","birdnet-pi","birds","birdweather","expo","mobile","react-native","typescript"],"latest_commit_sha":null,"homepage":"https://github.com/arunrajiah/birdecho/releases/latest","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arunrajiah.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":"docs/supporters.md","governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["arunrajiah"]}},"created_at":"2026-04-20T08:18:45.000Z","updated_at":"2026-05-29T14:18:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/arunrajiah/birdecho","commit_stats":null,"previous_names":["arunrajiah/perch","arunrajiah/birdecho"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/arunrajiah/birdecho","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arunrajiah%2Fbirdecho","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arunrajiah%2Fbirdecho/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arunrajiah%2Fbirdecho/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arunrajiah%2Fbirdecho/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arunrajiah","download_url":"https://codeload.github.com/arunrajiah/birdecho/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arunrajiah%2Fbirdecho/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34186385,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["birdnet-go","birdnet-pi","birds","birdweather","expo","mobile","react-native","typescript"],"created_at":"2026-05-02T10:01:51.402Z","updated_at":"2026-06-11T07:01:10.593Z","avatar_url":"https://github.com/arunrajiah.png","language":"TypeScript","funding_links":["https://github.com/sponsors/arunrajiah"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# BirdEcho\n\n**Your backyard bird station, on your phone.**\n\n[![CI](https://github.com/arunrajiah/birdecho/actions/workflows/ci.yml/badge.svg)](https://github.com/arunrajiah/birdecho/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n[![Latest release](https://img.shields.io/github/v/release/arunrajiah/birdecho)](https://github.com/arunrajiah/birdecho/releases)\n[![Sponsors ❤️](https://img.shields.io/badge/Sponsors-%E2%9D%A4%EF%B8%8F-ea4aaa)](https://github.com/sponsors/arunrajiah)\n\n\u003c/div\u003e\n\n---\n\n## What is BirdEcho?\n\nBirdEcho 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.\n\nBirdEcho 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.\n\n---\n\n## Screenshots\n\n\u003e Screenshots coming soon — if you're running BirdEcho against your station, we'd love your help! See [docs/media/README.md](docs/media/README.md) for the capture checklist and how to submit a PR.\n\n---\n\n## Features\n\n### Feeds \u0026 Detections\n- **Live detection feed** — auto-refreshed every 60 seconds, infinite scroll, pull-to-refresh\n- **Offline cache** — last 24 hours of detections persisted locally; feed is readable with no network, stale data shown instantly while a background refresh runs\n- **Sighting detail** — tap any detection to play the audio recording and share a PNG card\n- **Detection times** shown in your station's local timezone\n\n### Species\n- **Species browser** — every species your station has ever detected, with images\n- **Species detail** — detection count, recent sightings list, star/unstar\n\n### Stats \u0026 Export\n- **Headline stats** — detections today, this week, unique species all-time\n- **14-day detection bar chart**\n- **Top 10 species** by detection count\n- **CSV export** — export the current feed as a `.csv` file from the Stats tab\n\n### Stations\n- **Multi-station support** — monitor any number of BirdWeather, BirdNET-Go, and BirdNET-Pi stations from one app; switch with a tap from Settings\n- **Station map** — all your BirdWeather stations on an interactive map; tap a marker to switch stations or open in Apple/Google Maps\n- **Direct BirdNET-Go support** — connect over your home network; no BirdWeather account needed\n- **Direct BirdNET-Pi support** — connect to a local BirdNET-Pi instance (both mcguirepr89 and Nachtzuster forks supported)\n\n### Notifications \u0026 Widget\n- **Favourites** — star any species and get a local notification the first time it's detected each day\n- **Android home-screen widget** — today's detection count and last detected species, glanceable without opening the app\n\n### Customisation\n- Light / Dark / System theme\n- Secure token storage via iOS Keychain / Android Keystore\n\n---\n\n## Download\n\n**Android** — grab the latest signed APK directly from [GitHub Releases](https://github.com/arunrajiah/birdecho/releases/latest).\n\n\u003e No Play Store account needed — enable \"Install from unknown sources\" in Android Settings, download the APK, and install.\n\n**iOS** — community builds are welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for how to build locally with EAS. iOS App Store / TestFlight is planned for a future release.\n\n\u003e F-Droid submission is in progress.\n\n---\n\n## Connecting your station\n\n### BirdNET-Pi (direct, no cloud required)\n\n1. Make sure your BirdNET-Pi is reachable from your phone — same Wi-Fi network or VPN.\n2. Open BirdEcho → **Connect your station** → choose **BirdNET-Pi**.\n3. Enter the host URL, e.g. `http://birdnetpi.local` or `http://192.168.1.50`. BirdEcho will probe the station before saving.\n\nBoth the original [mcguirepr89/BirdNET-Pi](https://github.com/mcguirepr89/BirdNET-Pi) and the [Nachtzuster fork](https://github.com/Nachtzuster/BirdNET-Pi) are supported.\n\n### BirdNET-Go (direct, no cloud required)\n\n1. Make sure your BirdNET-Go instance is reachable from your phone — same Wi-Fi network or VPN.\n2. Open BirdEcho → **Connect your station** → choose **BirdNET-Go**.\n3. Enter the host URL, e.g. `http://192.168.1.100:8080`. BirdEcho will ping the station to verify the connection before saving.\n\nNo token or account needed. BirdNET-Go's `/api/v2` endpoints are public by default.\n\n### BirdWeather (cloud)\n\n1. Log in to [app.birdweather.com](https://app.birdweather.com) and copy your **API token** from account settings.\n2. Find your **Station ID** on the station dashboard URL: `.../stations/12345`.\n3. Open BirdEcho → **Connect your station** → choose **BirdWeather** → paste both values → tap **Connect**.\n\nYour 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.\n\n---\n\n## FAQ \u0026 Troubleshooting\n\n**Which connection mode should I use?**\nIf 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.\n\n**Where do I find my BirdWeather API token and Station ID?**\nLog in to [app.birdweather.com](https://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`.\n\n**BirdEcho says \"No detections found\" but my station is running.**\n- *BirdNET-Pi*: try opening `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.\n- *BirdNET-Go*: check that `/api/v2/ping` is reachable. BirdNET-Go v2.x is required.\n- *BirdWeather*: check that BirdWeather integration is enabled on your station. Pull down to refresh after enabling.\n\n**The app says \"Invalid token or station\" on connect.**\nDouble-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.\n\n**I connected successfully but the feed is empty.**\nYour 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](https://github.com/arunrajiah/birdecho/issues).\n\n**Notifications aren't arriving.**\nCheck that you granted notification permission when prompted. On Android, also check that battery optimisation isn't killing the app in the background. Note: server-side push alerts are a future feature; today's alerts are local-only and fire when a favourited species is detected.\n\n**The Android map shows blank tiles.**\nMarkers and interactions work without a key. For full tile rendering, the app needs a Google Maps API key set at build time (`EXPO_PUBLIC_GOOGLE_MAPS_API_KEY`). iOS uses Apple Maps and always shows tiles.\n\n**Is my token stored securely?**\nYes. 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.\n\n**Can I monitor multiple stations?**\nYes — 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.\n\n---\n\n## Quickstart (development)\n\n```bash\n# clone\ngit clone https://github.com/arunrajiah/birdecho.git\ncd birdecho\n\n# install (project uses pnpm)\npnpm install\n\n# start dev server\nnpx expo start\n```\n\nPress `i` for iOS simulator, `a` for Android emulator, or scan the QR code with [Expo Go](https://expo.dev/go).\n\n### Environment variables\n\n| Variable | Default | Description |\n|---|---|---|\n| `EXPO_PUBLIC_SENTRY_DSN` | _(unset)_ | Optional. Enables Sentry error and performance tracking when set. |\n| `EXPO_PUBLIC_SENTRY_TRACES_SAMPLE_RATE` | `0.2` | Optional. Sentry performance traces sample rate (0.0–1.0). |\n| `EXPO_PUBLIC_GOOGLE_MAPS_API_KEY` | _(unset)_ | Optional. Google Maps API key for Android map tiles. |\n\nCopy `.env.example` to `.env.local` at the project root and fill in the values you need. `.env.local` is git-ignored and never committed.\n\n---\n\n## Contributing\n\nPull requests are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening one.\n\nBug reports and feature requests go in [Issues](https://github.com/arunrajiah/birdecho/issues) — use the provided templates.\n\n---\n\n## Sponsors\n\nIf BirdEcho is useful to you, consider sponsoring continued development:\n\n**[github.com/sponsors/arunrajiah](https://github.com/sponsors/arunrajiah)**\n\n---\n\n## Acknowledgments\n\n- [BirdWeather](https://www.birdweather.com) — the API and hosted platform\n- [BirdNET-Pi](https://github.com/mcguirepr89/BirdNET-Pi) by @mcguirepr89\n- [BirdNET-Pi (Nachtzuster fork)](https://github.com/Nachtzuster/BirdNET-Pi) by @Nachtzuster\n- [BirdNET-Go](https://github.com/tphakala/birdnet-go) by @tphakala\n- [Cornell Lab of Ornithology](https://www.birds.cornell.edu) for the BirdNET research and model\n- The [Expo](https://expo.dev) and [React Native](https://reactnative.dev) communities\n\n---\n\n## License\n\n[MIT](LICENSE) © 2026 Arun Rajiah\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farunrajiah%2Fbirdecho","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farunrajiah%2Fbirdecho","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farunrajiah%2Fbirdecho/lists"}