This release is built around a reworked model gallery. It now recommends the best model for your specific hardware, and, when your location resolves to a supported region, recommends a region-specific model that keeps only the species that actually occur there. On a Raspberry Pi class device those regional models cut peak memory use by roughly two thirds and inference latency by 15-30% while staying numerically identical on the species they keep. This release also adds the BirdNET v3.0 acoustic classifier as a developer preview, a new "Infrequent" species tracking category, pure-Go Opus clip export as the default (no FFmpeg required), and optional FFmpeg-free HLS live streaming. Several security fixes are included, along with a large batch of dashboard, analytics, and audio bug fixes.
New Features
Region-Aware, Hardware-Aware Model Gallery
The model gallery has been rebuilt around choosing the right model for your machine and your location. It detects your host hardware capabilities (CPU architecture, available RAM, Intel or NVIDIA GPU, OpenVINO) and recommends the best-fitting model variant, preselecting it in the install dialog with a short explanation of why, while always allowing a manual override. Variants are labelled in plain language (AMD64 CPU, ARM64 CPU, GPU (Intel), GPU (NVIDIA), Built-in) instead of raw precision codes, with a compatibility badge that explains, rather than silently hides, any build that cannot run on your hardware.
When your configured coordinates resolve to a supported region, the gallery recommends a region-specific model that includes only the species found in that region. These regional slices cut peak memory use by around 67% and latency by 15-30% on a Pi-class device while producing identical scores on the species they keep. You can also pick a region manually from coverage-map cards, and the gallery notifies you when your coordinates change enough that a different regional model would fit better. Installing, switching, uninstalling, and reinstalling a variant is handled safely with a download-before-delete lifecycle, so the running model is never removed until its replacement is verified, and a disk-space preflight runs before any download. Model downloads gain automatic failover to a Hugging Face mirror when the primary source is unreachable (#4034, #4037, #4076, #4077, #4078, #4079, #4081, #4099, #4111, #4123, #4124, #4125, #4126, #4127, #4129, #4132, #4133, #4134, #4141, #4153, #4158, #4160).
BirdNET v3.0 Acoustic Classifier (Developer Preview)
This release adds a working inference path for the BirdNET v3.0 acoustic classifier (EfficientNetV2-S backbone, 11,560 species, 32 kHz / 5 s window). It is a developer preview: BirdNET v2.4 remains the default, and v3.0 is clearly flagged as not the final GA release in the gallery. It is provided for testing and early evaluation, not for production use. Regional v3.0 variants are available in the catalog alongside the global model (#4028, #4126, #4132, #4160).
Infrequent Species Tracking
A new "Infrequent" species-novelty category joins the existing lifetime, new-this-year, and new-this-season highlights. It flags a species the moment it is detected again after an absence longer than a configurable threshold (default 14 days, absenceDays), and surfaces it the same way the other categories do: a dashboard badge, a highlight card entry, a dedicated alert event, and a notification template variable (#3791 by @alexbelgium).
Native Opus Clip Export by Default
This is part of a longer-term effort to make BirdNET-Go independent of FFmpeg by encoding advanced audio codecs in native Go. The pure-Go Opus encoder is now the default for .opus clip export, joining the native FLAC and WAV paths, so FFmpeg is no longer required to export those formats. The old opt-in BIRDNET_OPUS_ENCODER environment variable is gone; Opus now works out of the box, with FFmpeg kept only as a fallback for rare unsupported clip shapes. Native AAC and MP3 encoders, and fully Go-native audio streaming, are planned to follow (#4163, #4164).
FFmpeg-Free HLS Live Streaming (Opt-In)
As part of the same move toward FFmpeg independence, live stream playback can now run through a pure-Go, in-memory HLS muxer instead of FFmpeg, enabled with BIRDNET_HLS_ENCODER. The FFmpeg-based HLS path remains the default and is unchanged (#4004, #4012).
Per-Stream RTSP Media Mode
RTSP sources gain a per-stream media mode, defaulting to full-stream, giving finer control over how each stream is captured and served (#3963).
Security
- CSRF token now enforced regardless of Sec-Fetch-Site. State-changing API requests are validated against the CSRF token even when the browser sends a same-origin
Sec-Fetch-Siteheader, closing a gap where that header could be relied upon in place of the token (GHSA-9fhj-f35q-w532). Reported by @sec-reex (#4142). - Detection media endpoints require authentication in Private Mode. Audio and spectrogram media endpoints for detections now require authentication when Private Mode is enabled, so clips are not reachable without a session (GHSA-c7jx-552f-94hh). Reported by @ejhnsn (#4083).
- pprof moved off the unauthenticated telemetry listener. The profiling endpoints are no longer exposed on the unauthenticated telemetry port, and block and mutex sampling are decoupled from
debug: trueso enabling debug logging does not silently start profiling (#4031, #4033). - Widget editor hidden from unauthenticated guests. The dashboard widget editor is no longer shown to visitors who are not logged in (#4113).
- Blocked-field map enforced on settings PATCH.
PATCH /api/v2/settings/:sectionnow enforces the same blocked-field protections as the full settings update, so protected fields cannot be changed through the section endpoint (#4036).
Bug Fixes
Models & Detection
- OpenVINO backend compiled into the Linux release binaries. The shipped Linux binaries now include the OpenVINO backend, so OpenVINO acceleration works without a custom build (#3961).
- Species rarity lookup uses the active geomodel taxonomy. Rarity now resolves against the taxonomy of the active geomodel instead of a mismatched one (#3978, fixes #3973).
- Dynamic thresholds tracked per species, not per model. Adaptive confidence thresholds are now keyed per species so one species no longer inherits another's threshold state (#4173).
- Legacy Intel OpenVINO offload devices supported. Older Intel OpenVINO offload devices are now recognized (#4066 by @xitation).
- Partial common-name search matches. Species search now matches partial common names instead of requiring a near-exact string (#4040 by @ejhnsn).
Dashboard & Analytics
- Analytics species summary no longer aborts on NULL confidence. A species group whose detections all have NULL confidence no longer fails the scan and aborts the entire species summary (#4170).
- False positives excluded from new-species detections. New-species highlights no longer count detections marked as false positives (#3981 by @Kerakis).
- Patterns charts honor the species selection. All patterns charts now respect the selected species (#3915 by @Kerakis).
- Time-of-day pattern covers the whole selected range. The time-of-day pattern chart now reflects the entire selected date range (#3969 by @Kerakis).
- Species colors stay consistent across patterns charts. Species keep the same color across the patterns charts (#3910 by @Kerakis).
- Analytics charts stop clipping labels and series. Chart labels and series near the plot edges are no longer cut off (#3911 by @Kerakis).
- Hour axis no longer stretches past the last hour. (#3970 by @Kerakis)
- Species selector fixes. The species selector now shows its checked state correctly (#3909 by @Kerakis), hides the toggle where species filtering does not apply (#3912 by @Kerakis), and no longer overlaps charts when the maximum number of species is selected (#3982 by @Kerakis).
- Species thumbnails shown in the summary table by default. (#4047)
- Custom config and manual inclusion badges resolve correctly. (#3980, fixes #3974)
Media & Images
- Species image caching corrected. The image provider no longer caches the wrong species image or the wrong licence (#4048), sends a Wikimedia-compliant User-Agent and stops retrying past a refusal (#4045), and fetches species images off the request path so page loads are not blocked (#4046).
- Download detection audio by ID. Detection audio downloads now resolve by detection ID (#4092 by @ejhnsn).
- Request timeout errors preserved. Media request timeouts are no longer masked by a generic error (#4093 by @w3lld1).
- Misleading UTC marker removed from downloaded filenames. (#4030 by @ejhnsn)
Audio & Streaming
- RTSP restart backoff resets after stable recovery. A stream that recovers and runs stably no longer keeps a long restart backoff from an earlier failure (#4167).
- Flapping RTSP liveness notifications coalesced. Rapidly flapping RTSP source liveness changes no longer spam notifications (#3966).
- Corrupt BirdWeather soundscape FLAC repaired. (#3967)
- MQTT reconnects after a failed initial connection. MQTT now retries the connection when the first attempt fails instead of giving up (#4065 by @Kerakis).
Database & Storage
- v2 datastore promoted to primary once the legacy tail is reconciled. (#4169)
- SQLite falls back to the default path when the configured path is blank. (#3987 by @dk1)
- db-doctor recognizes precipitation columns. The database doctor no longer flags the precipitation columns on
hourly_weathersas unexpected (#4053). - Retention cleanup is observable and hot-reloadable. Disk retention cleanup now reports what it freed and takes configuration changes without a restart (#4168).
Settings & Config
- PUT settings merges instead of zeroing omitted fields. A full settings update no longer clears fields that were omitted from the request body (#4106).
- eBird settings hot-reload. Changing eBird settings now takes effect without a server restart (#4104).
- Half-configured settings no longer fatal. Inert, half-configured settings sections no longer abort startup (#4029).
- Backup keys loaded and model/profiling settings validated. (#4165)
System & Platform
- Process CPU usage normalized so it never exceeds 100%. (#3899 by @Kerakis)
- Rootless Podman sound card access. The shipped artifacts enable rootless sound card access and no longer emit
/dev/sndchmod errors under rootless Podman (#4121, fixes #724; #4122). - Unsupported locale no longer blocks startup. A configured locale the classifier does not support no longer prevents the app from starting (#3898).
- Cross-host migration reports which step failed.
install.sh --migratenow names the step that failed instead of a generic error (#3952). - Four Sentry-triaged crash fixes. Includes label-loader crashes on overlong lines and model ID alias handling, alongside the analytics NULL fix above (#4170).
Internationalization
- UI translations completed across 15 locales. All user-facing strings are now translated in the 15 supported locales, enforced by a 100% CI gate going forward (#4042).
Diagnostics
- Durable boot and event journal. A filesystem-backed boot/event journal helps diagnose reports of a vanished database that leave nothing in the normal logs (#3964).
- Better logs for hard-to-reproduce storage, DB, and analytics bugs. Failed database queries now record the SQL dialect and parsed operation, and retention runs explain what they did, so several classes of hard-to-reproduce reports become diagnosable from default logs and support dumps (#4171).
🛡️ VirusTotal Results: