BirdNET-Go – Backyard Bird Identification

BirdNET-Go is an open-source app that listens through a microphone and identifies birds by their songs and calls, day and night. Here it runs as two independent listening nodes, both on the same Windows PC.

The nodes

Node 1 (home). The original setup, running since early March 2026. BirdNET-Go runs in Docker Desktop using the official image and listens through a USB microphone. Detections, recordings, and settings live in a folder on the PC that’s mounted into the container, so the container can be updated or rebuilt without losing any data.

Node 2 (about 5 miles away). Added in late March 2026. It’s a second, fully separate container created from the same BirdNET-Go image and running on the same PC, with its own data folder, its own port, and its own settings, so the two nodes never touch each other’s data. Its microphone is at the remote site, and the audio travels over the internet as a network stream (RTSP). The remote site’s internet address can change, so Dynamic DNS gives it a hostname that always points to the current address.

The remote audio stream

Node 2’s audio comes from a Raspberry Pi 3B+ running Raspberry Pi OS Lite, with a USB microphone:

  • Capture: FFmpeg records from the USB mic in mono at 48 kHz, adds 10 dB of gain, and encodes it as Opus at 64 kbps.
  • Serving: MediaMTX serves the audio as an RTSP stream for BirdNET-Go, plus a browser (WebRTC) stream for listening in live.
  • Reliability: both run as system services that start at boot. A scheduled health check restarts them if the stream drops, and reboots the Pi after three failures in ten minutes.
  • Updates: a deploy script pushes configuration changes to the Pi over SSH, and a test script detects the mic and records a short sample clip.

Where the detections go

  • Home Assistant sensors: Home Assistant pulls from BirdNET-Go’s built-in API every five minutes. Those sensors drive dashboard cards for the 10 most recent species (duplicates removed), the latest detections, and the last new species heard.
  • Phone notifications: each node has its own notifications, pushed through the Home Assistant Companion app. They go out only for a species that node hasn’t heard before, and only within five minutes of the detection. Tapping one opens the bird dashboard.
  • Discord: each node posts its detections to its own Discord channel, with a link to the recording.
  • Rare birds: a Python script pulls county rare bird alerts from eBird. A saved list of already-alerted species keeps the same bird from alerting twice.

Quirks worked out along the way

  • Frozen dashboard cards: Home Assistant ignores updates when a value hasn’t changed, so cards tracking a detection count stopped refreshing. They now track each detection’s unique ID.
  • Duplicate blocks: two copies of the same sensor configuration silently overrode each other until they were merged into one file per source.
  • Wrong port: the second node looked broken on day one. The browser was pointed at the wrong port.

Next up

BirdNET-Go’s dashboard works, but its look doesn’t match the rest of the setup. The plan is a fork with custom styling that still picks up new releases from the original project. The dashboard is compiled into the app itself, so styling happens against a local development server and gets built into a fresh container once it’s finished.

Back to Projects