This release brings hardware-accelerated inference through a new OpenVINO backend that runs BirdNET v2.4 and Perch v2 roughly twice as fast on a Raspberry Pi 5 and on Intel iGPUs, paired with a new AI Models & Inference page that shows what each model is doing in real time. It also adds an experimental BirdNET-Pi import so you can bring your detection history over from a Pi, a redesigned Analytics section with a batch of new pattern and exploration charts, and per-stream audio gain for RTSP sources. On the reliability side, USB sound cards now survive a reboot without losing capture, RTSP streams open correctly on FFmpeg 4.x (Debian 12), and the "Ignore this species" checkbox on a False Positive review finally works. Security hardening rounds it out: the public detection stream no longer leaks internal source details to anonymous clients, and HLS stream tokens are scrubbed from logs.
New Features
AI Models & Inference
BirdNET-Go now includes a native OpenVINO inference backend as an opt-in alternative to the ONNX Runtime CPU path. On ARMv8.2 CPUs with native half-precision (Cortex-A76, for example the Raspberry Pi 5) it runs the BirdNET v2.4 classifier at f16 roughly twice as fast as the CPU path, and it can also offload Perch v2 and the bat embedding extractor onto an Intel iGPU. A new hot-reloadable birdnet.backend preference (auto, onnx, openvino) selects it, the OpenVINO runtime is bundled in the container images, and any failure (missing library, unsupported CPU or model) falls back cleanly to ONNX Runtime, so default behavior is unchanged where OpenVINO does not apply (#3547, #3549, #3551, #3609, #3812).
A new AI Models & Inference page under System shows the detected hardware, the active inference backends and versions, and a card per loaded model with its identity, backend, quantization, species count, live latency and real-time-factor sparklines, approximate RAM use, and a "last heard" diagnostic feed. The page updates live and refreshes automatically when models are added, removed, or reloaded (#3563, #3566, #3571, #3577, #3585, #3603).
arm64 container images now ship a faster INT8 ONNX model by default instead of TensorFlow Lite; existing arm64 configs keep working with no migration, and custom .tflite models still load (#3544, #3864).
BirdNET-Pi Import (Experimental)
A new Import/Export page under System can import your detection history from an existing BirdNET-Pi birds.db. A guided wizard walks through selecting the source, choosing database-only or database-plus-audio mode, and then shows live progress with running, complete, cancelled, and failed states, plus a link to the imported detections when it finishes. Imports are idempotent, so re-running never creates duplicates. For containers, a new external-media mount lets you plug in a USB drive, SD card, or file share and have it appear inside the container without a restart (#3655, #3657, #3660, #3663, #3665, #3737, #3868).
This feature is marked Experimental in the UI. Native (non-container) import uses a permission-elevation flow for protected source files, and audio import is still being finalized. Please report problems on GitHub.
Redesigned Analytics (Preview)
The Analytics area has been reorganized into task-grouped Explore and Patterns sections with a batch of new visualizations: a seasonal density heatmap (date against time of day), a who-sings-when species ridgeline, a dawn-chorus onset tracker, a nocturnal activity clock, a per-species confidence distribution, a species accumulation curve, arrival and departure phenology, an acoustic succession streamgraph, and a year-over-year tracker (#3589, #3608, #3610, #3611, #3618, #3622, #3626, #3629, #3634, #3638, #3648, #3741, #3742, #3744).
Some of this is still in progress: the Weather, Soundscape, and Review analytics views and the source/microphone filter are hidden in this release and will return once they are finished (#3867).
Per-Stream Audio Gain
RTSP and network audio streams now have their own input-gain control in stream settings, mirroring the sound-card gain slider, and it takes effect without a restart. This release also fixes the case where a stream URL accidentally configured as a local sound card produced a live-audio failure with no explanation; such entries are now moved to the correct place automatically and the error message is actionable (#3779).
Cleaner UI When Clip Export Is Off
When clip export is disabled, no audio is saved, so the audio players and spectrograms that used to render empty or broken are now hidden across the dashboard, detections list, detail view, search, and the review modal, and cards collapse to a compact layout. Historical clips stay playable if you later turn export back on (#3760 by @fophillips, #3765).
Installer Reconfiguration
install.sh is now re-runnable: a new "Reconfigure settings" option lets you change the web port, TLS and access mode (direct, Let's Encrypt, or behind a reverse proxy), metrics exposure, audio device, timezone, and locale on an existing install, then regenerates the service and restarts with a config backup and rollback on failure. Fresh installs no longer bind ports 80, 443, and 8090 by default (they are now opt-in), so they stop colliding with an existing web server, and updates preserve your existing bindings (#3675, #3685, #3879).
Restart-Required Notifications
Settings that cannot take effect until a restart (web server and TLS, database, logging, and TLS certificate operations) now show a clear restart banner with the specific reason, instead of saving silently with no indication (#3531).
Smaller Extras
- User-editable model catalog. The model catalog is now a JSON file in your config directory that you can edit; it is seeded on first run and, if you leave it untouched, refreshes automatically on upgrade (#3605).
- Native FLAC normalization (opt-in preview). With the experimental native encoder enabled (
BIRDNET_FLAC_ENCODER=native), detection-clip saves with loudness normalization now normalize entirely in Go with no FFmpeg dependency. The default FFmpeg path is unchanged (#3777). - Low-memory runtime detection (foundation). BirdNET-Go now detects a constrained memory limit at startup (including container cgroup caps) and applies conservative heap and allocator backstops, controlled by a new
lowmemory.modesetting (auto,on,off). On systems with ample memory it is inactive and changes nothing (#3533).
Security
- Anonymous clients no longer see internal source details. The public detection SSE stream was sending the raw audio-source display name (which can embed an RTSP host or credentials) to unauthenticated subscribers; they now receive only a stable source id, while authenticated clients are unchanged (#3726).
- HLS tokens and secrets scrubbed from logs. Request and error logging in the v2 API recorded raw URL paths and query strings, which meant live HLS stream tokens were being written to logs; these are now redacted (#3727).
- Session cookie Secure flag follows real TLS state. The session cookie's Secure flag is now derived from whether TLS is actually in effect (#3783).
Bug Fixes
Audio & Streaming
- USB sound cards survive a reboot. Capture is now matched to a stable USB hardware id instead of the ALSA card index the kernel reassigns at boot, so a sound card no longer stops working after a reboot until you re-select it in Settings. This was the most-reported audio issue (#3688, #3697).
- RTSP streams open on FFmpeg 4.x (Debian 12). The FFmpeg connection-timeout flag is now selected per FFmpeg version, fixing RTSP capture that failed to start on FFmpeg 4.x (#3560 by @mvanhorn, #3658).
- Sample-rate dropdown populates when adding a new audio source (#3680).
- Clip exports no longer collide thanks to a unique temp file per export (#3556).
Spectrograms
- Bat spectrograms show the ultrasonic range again. The bat frequency profile was disabled by a malformed filter argument, so bat clips rendered in the 0-12 kHz bird view; it is fixed and re-enabled (#3529 by @alexbelgium).
- Fallback spectrograms render in color. When clip generation falls back to FFmpeg (for example MP3 clips on native Windows), the default style now renders colorful instead of black and white (#3847 by @pelazas).
Detections & Review
- "Ignore this species" on a False Positive now works. The checkbox silently did nothing because of a field-name mismatch; ticking it now actually adds the species to the exclude list (#3815 by @iamrans0m00).
- Review saves no longer duplicate comments, and you can now unlock a detection from the review form (#3859).
- Detection cards no longer overlap or get clipped on mobile (#3719 by @alexbelgium, #3729 by @alexbelgium).
- Missing dashboard thumbnails fall back to an alternate image provider instead of showing nothing (#3816).
- Banner descriptions preserve line breaks (#3814 by @iamrans0m00).
- Top-species ordering is stable for species with equal detection counts, so the dashboard list no longer reshuffles between refreshes (#3830).
- Species rarity uses your local calendar day, so "new species today" and rarity status are correct across time zones (#3820).
Species & Multi-Model
- No more duplicate species when running multiple models. Detections are now collapsed to a canonical scientific name at ingestion, so BirdNET and Perch reporting the same bird under different names no longer show up twice or fire a spurious "new species" alert. Range-filter and inclusion matching are alias-aware as well (#3728, #3725).
- Perch v2 non-bird classes are recognized by the privacy and dog-bark filters and by image lookups (#3584).
- Settings species exclude list is canonicalized to scientific names so exclusions match reliably (#3692).
Integrations & Weather
- MQTT accepts scheme-less broker addresses in the TLS and DNS paths (#3530).
- BirdWeather soundscape uploads report correct clip durations and no longer amplify silent clips (#3764 by @kivster, #3870 by @Kerakis).
Database & Settings
- MySQL detection search no longer errors on the
LIKEescape character (fixes a MySQL 1064 error) (#3528). - Unsaved Security settings survive TLS certificate operations instead of being discarded (#3532).
- Connection tests use your saved secrets again after the redaction placeholder is restored (#3677).
- Faster species filtering on SQLite: analytics species queries use a subquery instead of a join (#3842).
System, Diagnostics & Platform
- System Health page stops intermittently failing to load when a diagnostic metric produces a non-finite number (#3869 by @Kerakis).
- Support dump submission no longer times out on large logs (#3769).
- Faster startup on large databases (#3594, #3598).
- Containers start under an arbitrary user id without a HOME override (#3516 by @bo0tzz), and model label and data files are now readable in the image so custom models load (#3673).
- AutoTLS binds HTTPS to the configured TLS port and starts the ACME HTTP listener correctly for Let's Encrypt (#3612 by @anyasabo).
- Live updates work behind a reverse proxy. SSE responses now send
X-Accel-Buffering: no, so nginx and similar proxies stop buffering the detection stream (#3863). - Faster analytics API when species names are not requested (
names=false): name resolution is skipped on species scores (#3834 by @Bruick).
Internationalization
- Corrected the Barn Owl name and added missing German bat names (#3539).
- Localized analytics chart date-axis labels and time-of-day period labels to the active language (#3607 by @LeoColman, #3654 by @LeoColman).
- Fully translated the Import/Export page across all locales (#3868).
🛡️ VirusTotal Results: