Realtime BirdNET soundscape analyzer
  • Go 72%
  • TypeScript 14.3%
  • Svelte 10.6%
  • Shell 2.2%
  • Python 0.4%
  • Other 0.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Tomi P. Hakala bc5cdf880e
test(imports): table-drive the elevate fallback and disk preflight tests (#5017)
* test(api): merge elevate fallback and disk preflight tests into tables

* test(api): pin that the elevate fallback table rows take or skip staging

The staged-source row now asserts the staging path ran (the disk probe is called once) and the valid-database rows assert it did not. Add a staged source row with in-app elevation on and no password.

* test(api): word the elevate staging assertion for what it pins

* test(api): name the elevate password row for the supplied password
2026-11-02 22:10:40 +02:00
.agents/skills/preflight refactor: drop dead error handling behind crypto/rand.Read (#4732) 2026-10-22 17:03:15 +03:00
.claude/skills chore: stop tracking .claude/scheduled_tasks.lock (#3396) 2026-06-06 18:49:27 +03:00
.devcontainer refactor(spectrogram): render spectrograms natively only and drop SoX (#4715) 2026-10-21 17:20:44 +03:00
.github build(onnx): update ONNX Runtime to 1.31.1 and onnxruntime_go to v1.36.0 (#4631) 2026-10-31 13:08:16 +02:00
.husky build(lint): bump golangci-lint to v2.15.0 2026-10-19 21:50:44 +03:00
cmd fix(startup): name the recovery step for v2-shaped table refusals and stop printing usage on runtime errors (#4914) 2026-10-27 17:48:41 +02:00
data feat: add latest.json file containing data for various ostrich and cassowary species, enhancing biodiversity information 2025-04-25 13:05:44 +03:00
dist build(onnx): update ONNX Runtime to 1.31.1 and onnxruntime_go to v1.36.0 (#4631) 2026-10-31 13:08:16 +02:00
doc fix(api): limit IPv6 clients per /64 in the api/v2 rate limiters (#5005) 2026-11-02 19:29:57 +02:00
Docker fix(install): stop mounting an unused HLS tmpfs and unmount stacked leftovers (#4652) 2026-10-18 11:34:11 +03:00
docs fix(manifest): classify date release tags and fail on unclassified releases (#4464) 2026-10-02 16:56:28 +03:00
examples docs: add example script for testing secure MQTT connections 2025-07-02 19:17:45 +03:00
frontend feat(imports): run the migration prerequisite checks in the background with progress (#5006) 2026-11-02 21:59:30 +02:00
internal test(imports): table-drive the elevate fallback and disk preflight tests (#5017) 2026-11-02 22:10:40 +02:00
Podman fix(install): stop mounting an unused HLS tmpfs and unmount stacked leftovers (#4652) 2026-10-18 11:34:11 +03:00
rules chore(lint): report wall-clock arithmetic outside internal/wallclock (#4880) 2026-10-27 02:11:14 +02:00
scripts fix(install): stop mounting an unused HLS tmpfs and unmount stacked leftovers (#4652) 2026-10-18 11:34:11 +03:00
tools fix(migration): record the auxiliary data outcome in the migration state (#4850) 2026-10-26 12:47:51 +02:00
ui feat: implement modern Svelte 5 desktop UI with comprehensive component library 2025-07-19 10:04:27 +03:00
Unraid fix(install): stop mounting an unused HLS tmpfs and unmount stacked leftovers (#4652) 2026-10-18 11:34:11 +03:00
vm-images Minor typos in the documentation (#1327) 2025-09-27 11:31:38 +03:00
.air.toml fix(build): derive the version string from the built commit, not the nearest matching tag (#4461) 2026-10-02 15:40:45 +03:00
.dockerignore fix(ci): resolve date-fns import failure in Docker and CI builds (#2887) 2026-04-28 13:05:22 +03:00
.gitattributes fix(build): derive the version string from the built commit, not the nearest matching tag (#4461) 2026-10-02 15:40:45 +03:00
.gitignore chore: stop tracking binaries built in the repository root 2026-10-04 21:44:22 +03:00
.golangci.yaml chore(lint): allow parallel golangci-lint runners 2026-10-07 14:01:31 +03:00
.mockery.yaml fix(migration): wait for the worker to exit before rollback, cancel and shutdown (#4912) 2026-10-27 17:08:22 +02:00
AGENTS.md docs: support the tested MySQL and MariaDB LTS releases, no end of life dates in code 2026-10-29 09:44:48 +02:00
ARCHITECTURE.md refactor(labels): rename nonbird package to soundevent (#4966) 2026-10-31 17:45:43 +02:00
AUTHORS docs: update AUTHORS file with current contributors (#4972) 2026-11-01 00:25:19 +00:00
cliff.toml fix: correct comment formatting in cliff.toml 2025-07-28 22:06:43 +03:00
config.schema.json feat(analysis): add model consensus false positive filter (#4974) 2026-11-01 15:20:46 +02:00
CONTRIBUTING.md ci: check that fork pull requests follow the PR template (#4508) 2026-10-06 11:33:52 +03:00
Dockerfile build(onnx): update ONNX Runtime to 1.31.1 and onnxruntime_go to v1.36.0 (#4631) 2026-10-31 13:08:16 +02:00
go.mod build(onnx): update ONNX Runtime to 1.31.1 and onnxruntime_go to v1.36.0 (#4631) 2026-10-31 13:08:16 +02:00
go.sum build(onnx): update ONNX Runtime to 1.31.1 and onnxruntime_go to v1.36.0 (#4631) 2026-10-31 13:08:16 +02:00
install.sh fix(install): stop mounting an unused HLS tmpfs and unmount stacked leftovers (#4652) 2026-10-18 11:34:11 +03:00
LICENSE initial release 2023-10-20 15:49:08 +00:00
LICENSES.md docs: update dependency licenses (#1756) 2026-01-12 13:54:12 +02:00
main.go fix(startup): name the recovery step for v2-shaped table refusals and stop printing usage on runtime errors (#4914) 2026-10-27 17:48:41 +02:00
podman-install.sh fix(install): stop mounting an unused HLS tmpfs and unmount stacked leftovers (#4652) 2026-10-18 11:34:11 +03:00
PRIVACY.md build(onnx): update ONNX Runtime to 1.31.1 and onnxruntime_go to v1.36.0 (#4631) 2026-10-31 13:08:16 +02:00
README.md feat(datastore): support MySQL 9.7 LTS and drop end of life dates from the supported release check (#4939) 2026-10-29 11:04:25 +02:00
reset_auth.sh fix: cleanup, adding more security fixes 2024-11-07 21:31:46 +02:00
SECURITY.md docs: add SECURITY.md with private vulnerability reporting policy (#4295) 2026-09-07 18:13:07 +03:00
soundscape.wav initial release 2023-10-20 15:49:08 +00:00
support.sh feat: add log collection for BirdNET-Go application 2025-04-30 17:33:03 +03:00
Taskfile.yml build(onnx): update ONNX Runtime to 1.31.1 and onnxruntime_go to v1.36.0 (#4631) 2026-10-31 13:08:16 +02:00
tawnyowl.wav initial release 2023-10-20 15:49:08 +00:00
TESTING.md ci(database): test MySQL 8.4 LTS instead of end-of-life 8.0 (#4909) 2026-10-27 16:19:01 +02:00

BirdNET-Go



Realtime soundscape analyser for birds, wildlife, and bats.

Self-hosted, 24/7, local AI inference. BirdNET-Go ingests soundcard input or network audio streams, runs multi-model classification, and presents detections in a fast web UI. Runs on a Raspberry Pi.

Highlights

  • Multi-model AI gallery: install BirdNET v2.4, Google Perch v2, BattyBirdNET regional bat classifiers, and the BirdNET Geomodel v3.0 from inside the app, no rebuild needed.
  • Run multiple models in parallel against separate audio sources and let cross-model agreement boost confidence on shared detections.
  • Live spectrogram streaming and detection heatmaps rendered straight in the browser.
  • Alert rules engine that routes detections to Discord, Slack, Telegram, ntfy, Pushover, Gotify, Matrix, webhooks, browser push, MQTT (with Home Assistant discovery), shell scripts, and BirdWeather.
  • Production-ready ops: onboarding wizard, OIDC/SSO, TLS certificate management, hot-reload settings, system health page, database doctor, and one-click support dumps.
  • Installable as a PWA, with a multilingual UI and species names in 40+ languages.
  • Local-only by default. Optional Sentry telemetry is strictly opt-in.

Quick install

Debian, Ubuntu, and Raspberry Pi OS:

curl -fsSL https://github.com/tphakala/birdnet-go/raw/main/install.sh -o install.sh
bash ./install.sh

Docker Compose, Portainer, Unraid and plain docker run users should start from the host-network configurations described in the installation guide (Portainer: the BirdNET-Go (host network, recommended) template or the stack file Docker/docker-compose.host.yml, see the Docker Compose guide; Unraid: the Unraid README); the bridge configurations remain supported. The Unraid host template is untested on real Unraid.

Docker images are published for linux/amd64 and linux/arm64. Pre-built binaries for Linux, Windows, and macOS ship with each release. See the installation guide, hardware recommendations, and security guide for details.

Web Dashboard

Features

Detection

  • BirdNET v2.4 (default, embedded, 6,500+ bird species)
  • Google Perch v2 via ONNX (14,795 species across birds, insects, amphibians, and mammals) with taxonomy-based species names
  • BattyBirdNET bat classifiers, 11 regional models covering Africa, the Americas, East Asia, Europe, the Middle East, South Asia, Southeast Asia, and the USA (Linux + ultrasonic-capable device)
  • BirdNET Geomodel v3.0 for location-based range filtering (12,012 species)
  • Cross-model detection consensus: agreement between models strengthens confidence and flags disagreements for review
  • Custom classifiers: bring your own TFLite model and label set
  • Configurable false-positive filtering for accurate results: Deep Detection (repeat-confirmation within a 15-second window), per-species dynamic thresholds, location-based range filter, privacy and dog-bark filters, and per-classifier bat false-positive levels (guide)
  • Per-model and per-source confidence thresholds

Audio inputs

  • Soundcard capture and RTSP / RTSPS streams, including multiple sources in parallel with independent model assignment
  • Sample rates up to 256 kHz for ultrasonic bat detection
  • Audio liveness watchdog with tiered recovery for flaky streams
  • Stream sample-rate probing and per-model recommendation banners in the UI
  • Audio equalizer, per-source quiet hours, daylight filter, and extended capture mode
  • Offline analysis of audio files

Interface

  • Svelte 5 + TypeScript single-page app
  • Installable as a Progressive Web App (PWA)
  • Onboarding wizard for first-run setup
  • Live spectrogram visualization for active streams (live audio streaming)
  • Detection heatmaps with ONNX-accelerated rendering
  • Customizable dashboard layout, color schemes, and a "Currently Hearing" card
  • Multiselect and bulk actions on the detections list
  • Browser terminal (xterm.js over WebSocket PTY) for in-app administration
  • UI languages: English, German, French, Spanish, Portuguese, Dutch, Polish, Italian, Czech, Slovak, Hungarian, Finnish, Swedish, Danish, Norwegian (Bokmål), Latvian
  • Species names in 40+ languages

Alerts and integrations

  • Configurable alert rules engine with per-rule conditions, schedules, and delivery targets
  • Multi-target delivery via shoutrrr: Discord, Slack, Telegram, ntfy, Pushover, Gotify, Matrix, Bark, IFTTT, and more
  • Webhooks with custom templates, shell-script hooks, and browser push notifications
  • MQTT publishing with Home Assistant auto-discovery
  • BirdWeather.com API integration
  • Prometheus metrics endpoint
  • Live spectrogram and realtime log output for OBS overlays on bird-feeder streams

Storage and data

  • SQLite (default) or MySQL/MariaDB with retry-aware write paths for contention; only the tested LTS releases are supported (MySQL 8.4 and 9.7; MariaDB 10.11, 11.4, 11.8 or 12.3), and MySQL Innovation releases are not supported
  • Automatic backups with real-time status polling
  • Format-aware audio clip export
  • Embedded eBird/Clements taxonomy (2,374 genera, 254 families, 11,145 species) for fast offline lookups

Operations

  • System Health diagnostics page covering audio pipeline, models and inference, network, and the datastore
  • Database doctor for diagnosis and schema repair
  • Help & Support page with guided bug reporting and one-click support dumps
  • OIDC / SSO with Google, GitHub, and generic providers, including RP-Initiated Logout
  • TLS certificate management UI with transactional writes and backup/restore
  • Hot-reload for settings, model installs, and per-source model assignments (no restart)
  • Optional, opt-in Sentry telemetry with strict privacy filtering

Platform

  • Linux, Windows, and macOS
  • Single static binary with the BirdNET TFLite model embedded
  • Optional ONNX Runtime for Perch, BattyBirdNET, and BirdNET Geomodel v3.0 (install guide)
  • Multi-arch Docker images
  • Runs comfortably on a Raspberry Pi 4 or equivalent 64-bit single-board computer

Documentation

Development setup

See CONTRIBUTING.md for the full guide.

git clone https://github.com/tphakala/birdnet-go.git
cd birdnet-go

# Install Task (if not already installed)
# Linux: sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b /usr/local/bin
# macOS: brew install go-task

task setup-dev    # installs Go 1.25, Node LTS, build tools, linters, Playwright
task              # build
task dev_server   # hot-reload dev server (or: air realtime)

Community

Join the Discord server for support, discussions, and updates.

Core and extensions

Companion tools

  • birda: fast CLI for offline bird species detection on existing audio files, using BirdNET and Perch AI models
  • birda-gui: desktop GUI for birda (Electron + Svelte 5) for audio analysis, detection browsing, and species visualization

System integration

Migration tools

  • BirdNET-Pi2Go: database converter for migrating from BirdNET-Pi (deprecated, not compatible with the current BirdNET-Go database schema; a native import is planned)

Hardware solutions

Mobile apps

  • Perch: open-source Android/iOS companion app. Connects to BirdNET-Go via the BirdWeather API. Live detection feed, audio playback, species browser, 14-day chart, and notifications for favourite species. MIT licensed.
  • BirdFeeder: open-source Android streaming app. Publishes real-time RTSP audio for consumption as a BirdNET-GO stream.

Contributing

Contributions are welcome.

For setup, workflow, and quality gates, see CONTRIBUTING.md:

All contributions must follow privacy-by-design principles, the automated code-quality gates, and the CC BY-NC-SA 4.0 license terms.

Data sources

Taxonomy data

BirdNET-Go embeds taxonomy data derived from the eBird/Clements Checklist:

  • Source: eBird API v2
  • Copyright: (c) Cornell Lab of Ornithology
  • License: used under eBird API Terms of Use for non-commercial purposes
  • Attribution: taxonomy data powered by eBird.org
  • Coverage: 2,374 genera, 254 families, 11,145 species

For more information, see the eBird Taxonomy.

License

Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International.

Authors and acknowledgements

Created and maintained by Tomi P. Hakala.

A growing list of community contributors keeps the project moving forward. The current list lives on the GitHub contributors page.

The BirdNET AI model is by the K. Lisa Yang Center for Conservation Bioacoustics at the Cornell Lab of Ornithology in collaboration with Chemnitz University of Technology (Stefan Kahl, Connor Wood, Maximilian Eibl, Holger Klinck).

Google Perch v2 ONNX conversion by Justin Chuby. BattyBirdNET bat classifier models by R.D. Zinck. BirdNET label translations by Patrick Levin for the BirdNET-Pi project by Patrick McGuire.