Recent Releases of BirdNET-Go

BirdNET-Go - Nightly Build nightly-20260601

This release fixes stereo RTSP streams that stopped detecting birds after nightly-20260524, and adds per-stream audio channel selection so you can pick which microphone channel (left, right, or both) each stream uses for detection. Support dump submission from Settings > Support works again (the previous timeout was too short for Raspberry Pi and slow connections). Alert rules can now match against species lists and trigger on new or returning species. A round of multi-model stability fixes makes running BirdNET alongside Perch much more reliable.

New Features

Per-Stream Audio Channel Mode Selection

You can now choose which audio channel each stream uses for bird detection: left, right, or downmix (both channels mixed together). This matters because many IP cameras send stereo audio where only one channel carries the actual microphone signal. Mixing both channels together can reduce detection accuracy due to phase interference between the left and right signals.

A new dropdown in stream settings (both when adding and editing streams) lets you pick the mode. An "Analyze Channels" button captures a few seconds of audio and shows a visual comparison of the energy levels on each channel, with a recommendation for which one to use. If a stereo source is still set to downmix, an orange warning banner appears on the stream card suggesting you select a single channel instead (#3286, #3287, #3300).

Alert Rule Enhancements

Alert rules now support "in list" and "not in list" matching, so you can create a single rule like "notify me only if the species is NOT in my common-bird list" instead of creating dozens of separate rules. A new species novelty system also tracks when each species was last seen, letting you create rules that trigger on genuinely new species (never detected before) or returning species (back after a period of absence) (#3267, #3275 by @keithkml).

Smarter Health Diagnostics

The System Health page is now better at distinguishing a brief glitch from a real problem. Instead of simple error counters, health checks evaluate whether issues are transient or sustained, whether they are getting worse or improving, and how many hours in the evaluation window were affected. The detail panel shows these signals visually with trend indicators and pattern badges, making it easier to decide whether something needs attention (#3289, #3290, #3293).

Lower Memory Usage from Audio Resampling

The audio resampler now reuses memory buffers instead of allocating new ones for every audio frame. In practice, this noticeably reduces BirdNET-Go's total memory consumption and garbage collection overhead, especially on low-powered devices like Raspberry Pi where memory is limited (#3285 by @anyasabo).

Bug Fixes

Audio & Streaming

  • Stereo RTSP streams stopped detecting birds - a regression in nightly-20260524 caused stereo RTSP streams to skip the mono downmix step when the source sample rate already matched the target (both 48 kHz). The audio pipeline received interleaved stereo samples but treated them as mono, effectively halving the sample rate. Visible symptoms: audio sounds slowed down, upper third of the spectrogram is black, and detection rates drop to zero. Fixes #3278, #3277 (#3283).
  • RTSP streams had no connection timeout - the FFmpeg flag for RTSP socket timeouts was incorrect (-timeout instead of -stimeout), so streams had no protection against hanging connections during the TCP connect phase (#3287).
  • HLS live stream played back at quarter speed for high sample rate sources - when capturing at 192 kHz (bat detection), the HLS pipeline skipped an internal downsampling step, causing the browser audio player to play back at roughly 4x slower than real time (#3347).

Range Filter & Multi-Model

  • Perch detections bypassed geographic range filter - with the default range filter setting, Perch species were not filtered by location, allowing out-of-range species to appear in detections and notifications (#3276 by @keithkml).
  • Active Species table empty after uninstalling a model - removing Perch v2 or BirdNET v3.0 could leave behind stale config that silently disabled the range filter entirely, causing detections to run unfiltered with no warning in the UI (#3324).
  • Species count showed ~14,800 species with multi-model - when running BirdNET alongside Perch, the Active Species / Current Species count ignored the range filter threshold for non-primary model species, displaying every species in the database instead of only those in your geographic area (#3326).
  • Stale range filter config persisted after model uninstall - even after the runtime was fixed, the saved config could still show incorrect status in the Species page and heatmap. The config now self-heals on startup (#3327).
  • Duplicate species in analytics with multi-model - insights pages (new arrivals, dawn chorus, phantom species, expected species) showed duplicate entries when both BirdNET and Perch detected the same species (#3294).

Model Reload Stability

  • Crashes and incorrect results during model reload - several race conditions could cause crashes, panics, or stale data when reloading, uninstalling, or reinstalling models while detection was running. Model metadata is now captured atomically during reload, and settings access is synchronized across all concurrent readers (#3329, #3333, #3340, #2933 by @anyasabo).

Health Diagnostics

  • Health status showed "Healthy" when no data was available - the system now correctly reports "Unknown" when diagnostic results are empty, instead of falsely reporting a healthy state (#3308).

Infrastructure & Platform

  • Container startup failed on Kubernetes/OpenShift - running under an arbitrary user ID (common in rootless containers and OpenShift) caused startup failures because the system could not look up user information. Container detection now uses a reliable fallback (#3266 by @bo0tzz).
  • Let's Encrypt certificates lost on every restart - TLS certificates were stored only in memory, so each restart requested a new certificate from Let's Encrypt. This could hit rate limits and cause temporary HTTPS outages (#3319 by @brycesub).
  • Support dump uploads timing out on slow connections - submitting a support dump from Settings > Support could fail on Raspberry Pi or slow networks because the upload exceeded the default 30-second HTTP timeout. The timeout is now 120 seconds (#3301).
  • Unnecessary image lookups wasting API calls - the background image refresh was retrying species that were already confirmed to have no image available, and included species from prediction models that had never actually been detected (#3305 by @keithkml).
  • Noisy error reports from Wikipedia rate limiting - temporary Wikipedia API throttling was generating unnecessary error reports in Sentry; these are now suppressed since they resolve on their own (#3309).
  • "Error opening /proc/self/cgroup" message on macOS - a harmless but confusing error message appeared on non-Linux platforms during container detection (#3193 by @anyasabo).
  • Build setup failed on Raspberry Pi - architecture detection in the Taskfile was incorrect for ARM platforms (#3192 by @anyasabo).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 13 days ago

BirdNET-Go - Nightly Build nightly-20260524

This release fixes a critical regression where RTSP streams with sample rates below 48 kHz (typical IP cameras send 8-16 kHz audio) cut in and out after the bat detection changes in nightly-20260523. All streams are now probed at startup so resampling only happens when needed. This release also adds time-windowed health evaluation with sparkline visualizations, SQLite corruption detection with auto-recovery at startup, and completes settings hot-reload coverage for the remaining 5 settings that previously required a restart.

New Features

Time-Windowed Health Evaluation with Sparkline Visualization

Health diagnostics no longer evaluate lifetime counters. A past burst of errors previously marked the system as Critical forever until restart; checks now evaluate configurable time windows (15m to 7d, default 1h). The System Health page is redesigned to match the System Overview visual language: a status metric strip replaces the old hero card, diagnostics auto-run on page mount, and counter-based checks show inline SVG sparklines (24 hourly bars, colored by status) with expandable detail panels. The window selector persists to localStorage. 22 new i18n keys fully translated across all 15 locales (#3249).

Complete Settings Hot-Reload Coverage

Five settings categories that were saved to disk but required a restart to take effect now hot-reload at runtime: Log Deduplication, RTSP Health monitoring, MQTT HomeAssistant discovery, System Monitoring, and HLS LiveStream. This brings the hot-reload TODO count from 5 to 0: every setting changed through the UI now takes effect immediately (#3254).

SQLite Corruption Detection at Startup with Auto-Recovery

A synchronous PRAGMA quick_check now runs at startup after migration. When index-level corruption is detected (common from power loss on SD cards), BirdNET-Go attempts automatic recovery via REINDEX. If recovery fails, the system continues in degraded mode so headless users keep web UI access. A corruption flag is latched to suppress duplicate Sentry event floods (prevents the 244+ duplicate events seen in production), and a persistent notification with actionable recovery guidance is sent to the user. A new DatabaseIntegrityCheck appears in the health diagnostics system (#3246).

Security

  • Temp file paths hardened against symlink attacks - Predictable temp file paths across datastore, API prerequisites, and log rotation are replaced with os.CreateTemp (random name + O_EXCL). Backup files and archives now use 0600 permissions instead of the os.Create default. Database connection pools are properly closed when post-Open() initialization fails (#3248).

Bug Fixes

Audio & Streaming

  • RTSP streams with sub-48 kHz sample rates cut in and out - The bat detection changes in nightly-20260523 removed FFmpeg's -ar/-ac output resampling flags for all protocol streams, which broke cameras that send 8-16 kHz audio since the pipeline expects 48 kHz. All streams are now probed via ffprobe at startup to discover actual sample rates. Resampling is applied only when the source rate differs from the target: sub-48 kHz sources get resampled up, 48 kHz sources skip resampling, and high-rate bat sources preserve their ultrasonic content. A new SourceSampleRate field carries the probed rate through the full pipeline. Fixes #3255 (#3256).
  • Model reload used stale settings, locale changes required restart - ReloadModel() read from a stale bn.Settings pointer, so changing the locale or thread count via the UI had no effect until a full restart. All sub-methods now see a fresh settings snapshot. Five stale settings reads in HLS streaming are also fixed (#3253).
  • Duplicate ORT notifications on range filter reload - The v3 geomodel path bypassed the early ONNX Runtime availability check, causing repeated Sentry events and bell notifications on every range filter reload when ORT was unavailable. A single check at the top of model initialization now guards both paths (#3245).

Health Diagnostics

  • Health check endpoint could hang indefinitely - runChecks spawned goroutines with 10s per-check contexts and then called wg.Wait() unconditionally. If a check ignored its context (e.g., gopsutil syscalls), the /api/v2/system/diagnostics/run endpoint blocked forever. A channel-based approach now respects an overall timeout with a 100ms grace period, returning StatusUnknown for unfinished checks. Multi-result slices are defensively copied to prevent data races (#3251).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 21 days ago

BirdNET-Go - Nightly Build nightly-20260523

The headline change in this release is that bat detection now works on network audio streams. Previously, bat models only ran against locally attached sound cards because the streaming pipeline forced every stream to 48 kHz, destroying the ultrasonic content bats are recorded at. Streams now discover their actual sample rate at connect time, so a 192 kHz PCM RTSP feed from an AudioMoth or USB ultrasonic mic on a remote Raspberry Pi can drive a bat model directly. Support dumps now bundle a database schema snapshot, application event log, and deployment context for much better remote troubleshooting. A series of database integrity fixes resolves upgrade failures where startup silently fell back to legacy mode, lost detections, or rejected MariaDB authentication. Non-bird species in the Perch v2 label set now show up under the correct genus, family, and taxonomic class in the species tree.

New Features

Bat Detection Over Network Audio Streams

Bat detection previously required a sound card attached directly to the BirdNET-Go host with ALSA exclusive mode; RTSP and other network streams were unusable because the audio pipeline hardcoded streams to 48 kHz, which is far below the 256 kHz capture rate bat models expect and which throws away all ultrasonic content above ~24 kHz.

Streams now probe their actual sample rate, codec, and channel count with ffprobe at connect time, and the buffer pipeline carries that rate end-to-end. A working RTSP feed from a remote AudioMoth or a USB ultrasonic microphone on a separate Raspberry Pi (the community example used a 384 kHz feed) can now drive a bat model directly with no sound card on the BirdNET-Go host.

The settings UI gains a Test Stream button next to the URL field on both the add-stream form and existing stream edit cards. It calls the new POST /api/v2/streams/test endpoint and shows the probed sample rate, codec name, and a bat-compatibility badge inline. When a stream uses a lossy codec (AAC, Opus, MP3) a dedicated warning explains that lossy compression destroys ultrasonic content even when the sample rate is high enough; only raw PCM or FLAC over RTSP can preserve the frequencies bat detection needs. Save and Add are gated on a successful test, with specific localized errors for unsupported URL schemes, blocked destinations (SSRF protection blocks loopback, link-local, metadata, and unspecified IPs), connection failures, and timeouts. The model checkbox list shows a bat-stream-requirements warning whenever a bat model is selected on a stream source so users see the hardware/codec constraints before they save (#3229, #3230, #3236, #3237).

Genus, Family, and Class Metadata for Perch v2 Non-Bird Species

Perch v2's label set has always included insects, amphibians, mammals, reptiles, arachnids, mollusks, and other non-bird taxa, but the embedded genus_taxonomy.json only carried bird taxonomy. Non-bird detections lacked genus, family, and class metadata, so the species tree, classifier metadata, and grouping in the UI fell back to hardcoded Class: "Aves" / Phylum: "Chordata" and produced incorrect hierarchies for everything outside birds. The taxonomy database is now extended via GBIF Backbone Taxonomy (4,110 additional species; 93% match rate), growing from 2,375 to 3,720 genera, 254 to 495 families, and 11,324 to 15,434 catalogued species. GetSpeciesTree() resolves the correct Class and Phylum dynamically (Arthropoda for insects/arachnids, Mollusca for snails/clams/squid, Cnidaria for hydrozoans, Platyhelminthes for trematodes, Chordata for vertebrates) so non-bird Perch v2 detections show up under the right branch of the tree. This is metadata only: Perch v2 itself still identifies the same species it always did, but they now display with correct taxonomic context. README and detection-pipeline docs updated to drop the inaccurate "bird species only" framing of Perch v2 (#3209).

Enhanced Support Dumps

Support dumps now include three new diagnostic artifacts to make remote troubleshooting practical without back-and-forth requests for additional logs:

  • database_info.json captures the complete database schema for SQLite and MySQL: table schemas, column definitions, indexes, row counts, integrity check, foreign key violations, migration state, app metadata, WAL/SHM sizes, and SQLite PRAGMA diagnostics. Each sub-collection has its own timeout (2-30s) so partial failures never kill the dump (#3213).
  • app_events.json contains the last 30 days of application events (max 1,000 entries): startup, shutdown, version changes, hot-reloads, model loads, settings saves with per-key diffs, migration state transitions, range filter updates, schema repair, and notification delivery attempts. Settings save events scrub sensitive values (passwords, tokens, API keys, certs) before persisting. Events are backed by a new persistent app event repository with a 90-day retention cutoff and 10k row cap (#3215, #3216).
  • deployment_info.json captures working directory, systemd service file (with environment variable scrubbing), data directory listing, and /proc/1/mountinfo for container bind mounts. Detects Docker, Podman, LXC, and systemd-nspawn. Useful for diagnosing fresh-install detection issues where a database exists but isn't visible to the new install (#3217).

Database startup also gains structured decision logs at every code path: fresh_install, v2_restart, legacy_mode, stale_sidecar_fallback, v2_corrupted, and migration state outcomes, with a safety scan that warns about nearby .db files when a fresh install is detected.

A new standalone tools/db-doctor/db-doctor.py script (zero dependencies, Python 3) diagnoses and repairs BirdNET-Go SQLite databases offline. The read-only mode runs eight checks (integrity, schema version, schema contamination across ai_models/labels/detections/daily_events, foreign keys, migration state, clip path extensions, and a database fingerprint); --fix recreates contaminated tables, recovers orphaned label references, resets stuck migration states, REINDEXes corrupted indexes, and repairs clip extensions against the filesystem. All repairs run in transactions on top of an atomic SQLite backup; lock detection prevents running while BirdNET-Go is active (#3212, #3223).

Periodic Pipeline Stats Logging

Two always-on info-level log summaries print every 5 minutes to make the detection pipeline diagnosable from regular logs. Pipeline stats report per source/model: inference count, raw classifier results, results that passed filter, max confidence seen, and the effective threshold. Audio level stats report per source: average, minimum, and maximum levels, zero percentage, and clipping percentage. Both suppress zero-activity periods to avoid log spam. Motivated by GitHub Discussion #3220 where users reported zero detections after model changes with no log evidence (#3226).

Model Selection Recommendation Banners

The model checkbox list on audio source configuration (sound cards and streams) shows contextual notification banners. When both BirdNET and Perch are installed but only BirdNET is enabled, an info banner recommends enabling both models for best species coverage. When only Perch is selected, a warning banner advises lowering the confidence threshold to 0.50 for meaningful results. Banners only appear when both model families are available; if only one is installed, no banner is shown. All 15 locales include native translations (#3228).

Automated Root-to-User Installation Migration

Users who previously ran sudo ./install.sh and got blocked by the root guard now get an automated migration path. When a root install is detected, the installer offers a 3-way prompt: migrate (recommended), fresh install, or cancel. The migration stops the existing service, copies data to the user's install location, fixes file ownership, validates the config and SQLite integrity, and cleans up the old systemd files. Pre-flight checks cover source validity, destination emptiness, and disk space with a 10% safety margin. On failure, the partial copy is removed so retry attempts aren't blocked. Silent mode (--silent) auto-migrates without prompting. Triggered by user reports of being unable to update after a Proxmox root install (#3191).

A separate change converts the hard root-check block to a soft block with a --force-root flag for users who understand the tradeoffs (containers, minimal setups). With --force-root, a one-line warning is shown and the install proceeds (#3206).

Health Diagnostics: FFmpeg and Sox Tool Checks

A new tool availability check in the Config category of the System Health page reports whether FFmpeg and Sox binaries are present at runtime, including the FFmpeg version string. The check reads paths from the live audio settings, so it stays accurate across hot-reload (#3203).

Security

  • TLS certificate writes are now transactional with atomic temp-file rename, backup/restore for delete handlers, and cert file cleanup on settings save failure. Prevents partial writes from leaving corrupted certs on disk and orphaned deletions when settings save fails. Delete handlers are serialized under the settings mutex to eliminate the race between backup and remove (#3208).
  • SoxPath validation added before exec at all five Sox call sites in the spectrogram generator, rejecting empty, relative, and proxy-contaminated paths. Mirrors the existing FFmpeg path validation as defense-in-depth against command injection via settings (#3200).

Bug Fixes

Database & Schema Integrity

  • Silent legacy fallback masked missing v2 columns - When GORM AutoMigrate silently failed to add a column, every insert produced "table has no column named X" errors, and the legacy fallback hid the failure. The schema validator now runs a missing-column check after AutoMigrate that returns ErrV2SchemaCorrupted with table and column names; the v2 init path refuses to fall back to legacy mode on schema corruption errors. Closes #3211 (#3233).
  • Schema evolution blocked v2 init on populated tables - V2 entity structs went through several iterations (e.g., LabelCount in AIModel, Sensitivity/Threshold in Detection). GORM never drops the corresponding columns when fields are removed, and the overly strict schema validator treated these harmless leftovers as fatal corruption, triggering the silent legacy fallback and the resulting species_name NOT NULL crash. The validator now warns and continues for extra columns on populated tables while still rejecting missing columns. Telemetry and app events record the evolution event for support dumps (#3222).
  • MySQL had no schema evolution validation - Schema integrity validation was SQLite-only, leaving MySQL deployments to silently carry extra columns. A shared validateSchemaIntegrity() with a columnLister strategy now covers both. The MySQL manager gets a structured logger matching the SQLite manager (#3224).
  • MariaDB and mysql_native_password rejected at startup - MySQL startup-check functions built DSNs with mysql.Config{} literals where AllowNativePasswords defaulted to false. After migration, MariaDB users (and anyone using native password auth) hit auth failures, fell back to legacy mode, and saw "Restart Required" on every restart. A shared buildMySQLStartupDSN() helper now sets AllowNativePasswords: true consistently. Closes #3165 (#3207).
  • SQLite DSN built with wrong separator - Four call sites concatenated + "?mode=ro" to DSNs that might already contain query parameters. The backup package also produced an unparseable DSN when readOnly=false because the first pragma was appended with & instead of ?. New readOnlyDSN() helper centralizes the logic. isV2DatabaseSafeToDelete() and the MySQL manager get the same fix (#3224, #3227).
  • AppEvent repository not wired during fresh install - InitializeFreshInstall() didn't register the AppEvent repository, so fresh installs silently dropped all app events. Now matches the post-migration init path (#3227).

Audio & Streams

  • Spectrogram returned 500 for missing audio files - GenerateFromFile now stat-checks the file before calling FFmpeg/Sox and returns the underlying os.ErrNotExist, which the HTTP error mapper translates to 404 instead of 500. Skips the Sox->FFmpeg fallback when the file genuinely does not exist (#3197).
  • HLS cleanup failed on "directory not empty" race - os.RemoveAll could race with a concurrent HLS writer creating a file between the internal traversal and the final parent unlink. A single 100ms retry handles the race (#3197).
  • FFmpeg rejected RTSPS streams with Option sample_rate not found - -ar/-ac flags are now conditional on source type. Protocol-based streams (RTSP, HTTP, HLS, RTMP, UDP) negotiate audio parameters via SDP/headers; only local sources (audio card, file) need explicit sample rate and channel count (#3197).
  • Species count on settings test endpoint only counted BirdNET species - Multi-model setups now combine range-filtered primary species with the full label sets from additional models (Perch v2, etc.). Follows the existing locking pattern (#3200).
  • Watchdog restart leaked analysis buffer - AddSource now calls DeallocateSource before AllocateAnalysis so watchdog restarts that reuse the same source ID don't accumulate buffers (#3204).
  • Ignored species silently re-appeared after geomodel install - toggleSpeciesInIgnoredList and addSpeciesToIgnoredList mutated a stale settings pointer in place and called SaveSettings(), which reads from the live atomic pointer that already contained the pre-mutation snapshot. The result was a silent discard of every ignore action on both disk and in-memory state. Now follows the clone-mutate-publish pattern used by the main settings save path. GetExcludedSpecies also fixed to read from the live snapshot (#3196 by @ModerateWinGuy).
  • macOS .dylib search paths missing for ONNX Runtime - Added Homebrew paths (/opt/homebrew/lib for Apple Silicon, /usr/local/lib for Intel) and corrected the fallback string to libonnxruntime.dylib (#3200).

TLS & MQTT

  • TLS/MQTT settings save had no rollback or guard - SaveSettings() was called without the isGlobalOwner guard and without rollback on failure, leaving in-memory and on-disk state divergent if persistence failed. A new publishAndSaveSettings() helper consolidates the clone-mutate-publish-save-rollback pattern across 7 call sites in detections, MQTT TLS, and TLS handlers. Persistence failures now return HTTP 500 with the in-memory snapshot rolled back to the pre-save state (#3205).
  • TLS mode change didn't trigger restart prompt - TLSMode is now included in webserverSettingsChanged, so toggling TLS mode produces the "Restart required" toast (#3208).

Notifications, MQTT, and Storage

  • MarkAsRead and Delete returned 404 when notification was already cleaned up - These operations are now idempotent: returning nil when the notification was removed by the cleanup loop prevents Sentry noise from the TOCTOU race between cleanup and user interaction. ~44 events suppressed (#3204).
  • MQTT HA discovery published after disconnect - The OnConnect handler now guards on IsConnected() before publishing Home Assistant discovery, matching the existing guard in the manual trigger endpoint (#3204).
  • Diskmanager looped on empty export path - Statfs and filepath.Walk were called every cleanup tick on containers where the export path was never configured, producing ~340 events. The cleanup loop now skips entirely when the path is empty (#3204).

Frontend & Dashboard

  • ErrorPage TypeError on quick navigation - createFeather() lacked a null guard for the zero element when the component unmounted before the setTimeout callback fired. Initial feather timeout is also tracked and cleared on cleanup to prevent resource leaks (#3198).
  • Detection list and row had hardcoded English ARIA strings - ARIA live region announcements in DetectionsList and thumbnail loading announcements in DetectionRow are now translated. New detections.aria.loadingResults, detections.aria.thumbnailLoading, and detections.aria.thumbnailLoaded keys with translations for all 15 locales (#3198).
  • PlayOverlay got stuck on permanently unsupported audio formats - Retries now skip on MEDIA_ERR_SRC_NOT_SUPPORTED and isLoading is always reset in the catch block. audioElement.src = '' replaced with removeAttribute('src') + .load() to prevent spurious network requests during cleanup (#3199, #3200).
  • Spectrogram canvas could OOM on invalid dimensions - ResizeObserver now uses isFinite checks and the RAF loop enforces a MAX_CANVAS_DIM (8192) bounds check before createImageData (#3199).
  • AudioLevelIndicator was hardcoded English - 22 new media.audio.* i18n keys with translations for all 15 locales cover ARIA announcements, dropdown labels, status messages, media session metadata, and screen reader text (#3199).
  • Empty species name reached the API - BirdThumbnailPopup and DetectionDetail now .trim() scientific names before calling the API, preventing whitespace-only API calls (#3204).
  • New species star disappeared at midnight - The daily summary endpoint compared first-seen against exact dates instead of the configured NewSpeciesWindowDays window. The endpoint now uses the tracker's pre-computed window-based flags (IsNew, IsNewThisYear, IsNewThisSeason), so the star persists for the configured window. Per-detection and SSE endpoints are intentionally unchanged. Fixes #3218 (#3219).

Image Cache

  • NOT NULL constraint violation on image_caches.scientific_name - storeSuccessfulFetch and refreshEntry did not set ScientificName on the fetched BirdImage before saveToDB, triggering constraint violations for providers that returned partial metadata. Fix mirrors the existing pattern in storeNegativeCacheEntry (#3231).
  • Image cache hammered a corrupted SQLite file forever - When the cache file became malformed, every read, save, batch lookup, hourly refresh, and fallback chain kept retrying the dead database, generating thousands of Sentry events with no recovery. The cache now latches a dbCorrupted flag on first corruption error, logs the failure once, and short-circuits all subsequent DB operations until restart. Fresh fetches still served from providers (#3231).
  • Excessive warnings tripped the health diagnostics error signal - Failed to download image to file cache and common name not found in name maps are both expected fallback behavior, not errors. Lowered to info-level so they stop inflating the elevated-error-count signal (#3231).

Health Diagnostics

  • Overall health status showed Skipped even when actionable checks were healthy - WorstStatus() treated skipped/unknown checks as worse than healthy. It now prioritizes actionable results (healthy/warning/critical) and only returns unknown when everything is unknown, or skipped when everything is skipped (#3235).

Install & UX

  • ONNX Runtime errors had no install guide URL - Not-found, version-mismatch, and init-failure errors now include the wiki install guide URL via the {installGuideURL} i18n parameter. A new doc/ONNX-Runtime-Installation.md covers Linux, macOS, and Windows (#3202).

Internationalization

  • 22 new audio player i18n keys across all 15 locales for AudioLevelIndicator ARIA, dropdown labels, status messages, and media session metadata (#3199).
  • Detection list ARIA i18n - new keys for loading announcements and thumbnail lifecycle states with translations for all 15 locales (#3198).
  • ONNX Runtime install guide URL parameterized in error messages with localized "install guide" preambles for all 15 locales (#3202).
  • Model selection recommendation banners translated to 15 locales (#3228).
  • Stream Test button and probe results translated to 15 locales, with renaming from "Probe" to "Test" reflected in i18n keys (#3230, #3236, #3237).

🛡️ VirusTotal Results:

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 22 days ago

BirdNET-Go - Nightly Build nightly-20260519

This release introduces an audio liveness watchdog that automatically recovers from silent audio capture failures, a system health diagnostics page with 31 checks across 8 categories, and multiselect with bulk actions for the detections list. New Help & Support pages guide users through bug reporting with support dump generation. ONNX Runtime availability is now checked across the model gallery, install pipeline, and health system so users get clear feedback when the runtime is missing. A large batch of thread safety, TOCTOU race, and panic safety fixes improves stability across the audio pipeline and API layer.

New Features

Audio Liveness Watchdog with Tiered Recovery

A new per-source watchdog detects when audio capture silently dies (e.g., USB audio hardware failure) and orchestrates automatic recovery through a tiered state machine: single-source restart, full app restart, then terminal failure with notification at every step. Previously, a silent audio thread death could go undetected for hours with no error logged and no alert fired. The watchdog exposes per-source health state via GET /api/v2/health/audio and its check interval and thresholds are configurable through new settings (#3106, #3112).

System Health Diagnostics

A new System Health page under Help runs 31 diagnostic checks across 8 categories (system, audio, analysis, streams, database, network, config, logs) in parallel with per-check timeouts. Results are grouped by category with color-coded status pills. Reports can be copied to clipboard or exported as JSON. Checks that are not yet wired to live data show a "Skipped" status rather than misleading results. The diagnostics backend caches reports by UUID for retrieval (#3132, #3133, #3135, #3137, #3185, #3186, #3187).

Detection List Multiselect and Bulk Actions

The detections list gains a selection mode with per-row checkboxes, shift-click range selection, and a header checkbox for page-level select/deselect. A Gmail-style "select all N matching" banner appears when the entire page is selected. Supported bulk actions include delete, mark correct, mark false positive, lock, and unlock, with a confirmation modal and toast feedback. New batch API endpoints under /api/v2/detections/batch/ handle the backend operations (#3119).

Help & Support Pages with Guided Bug Reporting

A new Help & Support page at /ui/help provides cards for Report Bug, Ask a Question, and Quick Links. The guided Report Bug flow at /ui/help/report-bug walks users through providing system information, describing the issue, generating a support dump, and opening a GitHub issue. The sidebar gains a collapsible Help section and the header settings menu adds Report Bug and Ask a Question links (#3130).

ONNX Runtime Availability Gating

Perch, BattyBirdNET, and geomodel features are now gated behind an ONNX Runtime availability check with five defensive layers: the model gallery grays out incompatible models with a warning banner, the install API rejects ONNX-dependent installs, the orchestrator emits a high-priority bell notification on load failure, already-installed models that lost ORT show a red warning, and a new ort_availability health check reports version and library path. Users no longer see cryptic init errors when ORT is missing (#3153, #3155).

Species Heatmap Grid API (Preview)

A new GET /api/v2/range/heatmap endpoint computes species probability grids across a map viewport for all 48 BirdNET weeks, returning a compact binary payload (BNHM format). The endpoint uses batch geomodel inference to compute thousands of grid points in a single ONNX session call, with an in-memory LRU cache and generation-counter invalidation. A dedicated multi-threaded ONNX session and IoBinding tensor reuse eliminate per-batch allocation overhead. This is the backend foundation for the upcoming Migration Explorer feature; no frontend visualization ships in this release (#3105, #3111).

Security

  • Container entrypoint command injection - replaced unsafe eval echo with safe parameter expansion in both Docker and Podman entrypoints to prevent command injection via crafted model paths. Added .onnx and .csv to model file permission setup. Brought Podman entrypoint to feature parity with Docker: rootless mode detection, pre-flight checks, gosu privilege dropping (#3159).
  • Install script sed injection - added sed_escape_replacement() helper that escapes \, |, and & before interpolation into sed commands, preventing injection via crafted RTSP URLs, coordinates, or password hashes. Added input validation for lat/lon, audio format, locale, and port range. Updated config generation to target the new multi-source format (#3160).

Bug Fixes

Audio Pipeline

  • Panic recovery in audio dispatch and shutdown - drain and stop routes now wrap Close() calls in individual recover blocks, preventing a misbehaving consumer from crashing the caller goroutine. Added serialization mutex for restart, reconfigure, and watchdog escalation to prevent conflicting router states (#3110).
  • Quiet hours not enforcing for RTSP streams - the scheduler was never wired to the stream manager (missing SetStreamManager call), and used raw URLs instead of the runtime-generated hashed source IDs (rtsp_<hex>). Streams were silently never stopped or started (#3127 by @iamrans0m00).
  • Default audio channels not applied consistently - some stream start paths skipped the defaultChannels fallback, causing channel count mismatches (#3143).
  • Default bit depth fallback missing - added defaultBitDepth fallback and fixed a buffer leak in ReconfigureSource (#3146).
  • Model assignment changes not detected during hot-reload - the analysis engine now detects when model-to-source assignments change and logs the new mapping (#3183).

Alerting

  • Notifications always sent to both bell and push - the alert dispatcher ignored the action's target field and dispatched to all channels. Bell-only rules now skip push, push-only rules skip persistent storage, and per-target deduplication prevents duplicate dispatches (#3136).

Thread Safety & Resource Leaks

  • Logger module not registered for classifier - orchestrator and nighttime scheduler logs were silently lost because the "birdnet" module was not in logger defaults. Also fixes unbounded overrun tracker map growth when sources are removed (#3104).
  • Model reload panic could leak mutex - wrapped entry.mu in closure with defer. Fixed uninstall ordering so config updates before range filter reload (#3114).
  • Float32Pool leak on inference panic - deferred pool return so the buffer is reclaimed even if inference panics (#3115).
  • Context.Canceled Sentry noise - filtered context cancellation errors and non-finite duration values from Sentry reporting (#3128).
  • Controller.engine not thread-safe - converted to atomic.Pointer to eliminate data races (#3141).
  • Race in handleSettingsChanges goroutine - eliminated concurrent access to shared state during settings change handling (#3145).
  • controlChan panic on shutdown - guarded channel sends to prevent send-on-closed-channel panics during graceful shutdown (#3149).
  • TOCTOU races in API handlers - snapshot Processor and BirdImageCache at request entry to prevent mid-request pointer swaps. Deduplicated database stats queries with consistent locking (#3154, #3156).

Dashboard & Frontend

  • CSRF token blocking logout - added /api/v2/auth/logout to CSRF skip list so logout works when the token expires on long-lived pages like live stream (#3117).
  • Notification "Illegal constructor" error - use ServiceWorkerRegistration.showNotification() when a Service Worker is active, falling back to the Notification constructor otherwise (#3117).
  • Clipboard error in popup terminal - added catch for unhandled NotAllowedError when the document loses focus (#3117).
  • Empty statusText in dashboard errors - added fallback for browsers that return empty status text (#3125).
  • Fullscreen crash on Safari - added typeof guard with webkitRequestFullscreen fallback (#3129).
  • Pre-renderer shutdown race - removed channel close that could panic on concurrent Submit() (#3129).
  • Hemisphere detection at equator - replaced latitude != 0 proxy with the existing LocationConfigured boolean flag so equator locations work correctly (#3129).
  • crypto.randomUUID on non-HTTPS - centralized with try/catch fallback for insecure contexts (#3152).
  • StatusPill readability - improved contrast and sizing for better readability across themes (#3182).

Query & Sorting

  • Hourly and species queries ignoring sort order - routed these query types through advanced search so user-selected sort columns take effect (#3139).
  • Hourly default sort and cross-type filters dropped - made query routing aware of hourly-specific defaults and filters that span query types (#3142).
  • Silent filter dropping in unified query path - consolidated all query routing into a single path to prevent conditions where filters were silently ignored (#3147).

Database

  • FLOOR() incompatible with SQLite - replaced with CAST(AS INTEGER) for cross-database compatibility (#3107).

Classifier

  • Rarity scores showing "Very Rare 0%" for non-English locales - species comparison used full labels with locale-specific common names, which never matched geomodel labels that use English names. Fixed all three comparison points to match on scientific name only (#3170).

Internationalization

  • Czech locale added (#3124 by @TeTeHacko).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 26 days ago

BirdNET-Go - Nightly Build nightly-20260515

This release delivers a 2.3x inference speedup for Google Perch v2 on default configurations and fixes several range filter issues that could cause incorrect species filtering after geomodel installation. The model gallery gains a standalone BirdNET Geomodel v3.0 card, and the Analysis settings page is reorganized into dedicated bird and bat sections with a new confirmation-based false positive filter for bat detections.

New Features

Perch v2 Inference Performance

Multi-model inference is now serialized so only one model runs at a time, eliminating memory bandwidth contention on resource-constrained hardware. The ONNX Runtime thread default is fixed to use all available CPU cores instead of falling back to single-threaded execution when threads=0. On a Raspberry Pi 5, this cuts default-config Perch v2 inference from 630ms to 270ms, a 2.3x improvement (#3088).

BirdNET Geomodel v3.0 Model Gallery Card

BirdNET Geomodel v3.0 is now available as a standalone entry in the model gallery with proper attribution and license metadata. The gallery Available tab is split into "Acoustic Classifiers" and "Geomodels" sections, making the layout extensible for future model types. Installed geomodel cards show the upstream URL and license badge (#3091).

Analysis Settings: Bird and Bat Sections

The Analysis settings page is reorganized into dedicated Bird Detection and Bat Detection sections with independent change tracking. A reusable false positive filter component uses stepped dot indicators and i18n-ready level names. A warning banner appears when the false positive filter is set to Off, encouraging users to enable filtering (#3097).

Bat Detection: Confirmation-Based False Positive Filter

Bat detection gains its own confirmation-based false positive filter, separate from the bird filter and the ultrasonic validation filter introduced in the previous release. The filter uses three levels (Off, Moderate, Strict) matched to the bat model's fixed 50% overlap. Bat models now correctly use settings.Bat.Threshold instead of falling back to the BirdNET threshold, preventing legitimate bat detections from being filtered when the BirdNET threshold is set higher (#3094).

Bug Fixes

Range Filter

  • Species list not refreshed after geomodel install - installing a geomodel from the model gallery reinitialized the ONNX backend but never rebuilt the species inclusion list. The processor kept using the stale list from startup until the next daily rebuild at midnight (#3086).
  • "Allow species without range data" toggle had no effect - enabling PassUnmappedSpecies did not add unmapped classifier species (~314 for BirdNET V2.4) to the inclusion list. The species count shown in the UI stayed the same and unmapped species were silently blocked (#3099).
  • Geomodel auto-selection overriding user config - an explicit user-configured range filter model (e.g., rangefilter.model: legacy) was silently replaced by auto-selection logic. Now gated on empty model field so explicit config is respected (#3087).
  • Duplicate species in range filter output - species appearing in both range filter results and include/config lists were counted twice. Added deduplication in the legacy path (#3087).

Multi-Model Analysis

  • Buffer overrun monitor using BirdNET-specific calculations for all models - the monitor hardcoded BirdNET v2.4's 3-second clip length and overlap settings, producing false overrun warnings for Perch v2 (5-second clips with 695ms inference, well within its 2.5-second window). Now uses each model's actual buffer interval (#3085).

Thread Safety & Resource Leaks

  • Labels race during model reload - NumSpecies() and Labels() could read label data concurrently with loadLabels() mutations during model reload. Added mutex protection and defensive copy (#3100).
  • Settings clone missing Models.Installed - the Installed slice was shared between cloned and original settings, allowing concurrent modifications to corrupt active config (#3100).
  • SSE progress handler leak on rapid install/reinstall - model install and reinstall handlers now clean up the previous SSE subscription before reassigning, preventing connection leaks (#3100).
  • RebuildRangeFilter missing read lock - added read lock for consistency with all other range filter endpoints (#3100).
  • SaveYAMLConfig file descriptor leak - added deferred close for panic-safe cleanup. On Windows, the leaked descriptor prevented temp file removal (#3100).

Configuration

  • Season date comparison ignoring actual dates - isDefaultSeasonConfiguration only checked season names, silently overwriting user-customized start dates with system defaults. Now compares both names and dates (#3100).

Internationalization

  • 491 untranslated keys translated - translated English fallback values to native translations across all 13 non-English locales, reducing untranslated instances from 1,205 to 714 (remaining are technical terms, brand names, and universal abbreviations) (#3096).

🛡️ VirusTotal Results:

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 1 month ago

BirdNET-Go - Nightly Build nightly-20260514

This release focuses on closing gaps in Google Perch v2 and BattyBirdNET bat model support introduced in the previous release. BirdNET Geomodel v3.0 replaces the embedded v2.4 range filter with a 12,012-species geographic model covering birds, mammals, insects, amphibians, and reptiles. Perch v2 common name coverage jumps from 42% to approximately 85% using taxonomy data from the geomodel. Bat detection gains a nighttime scheduler that pauses inference during daylight hours and a post-detection ultrasonic validation filter that flags likely false positives. The rest is bug fixes across notifications, streaming, timezone handling, and the settings UI.

New Features

BirdNET Geomodel v3.0 Extended Range Filter

The geographic range filter now uses BirdNET Geomodel v3.0, a dedicated ONNX model covering 12,012 species across birds, mammals, insects, amphibians, and reptiles. It replaces the embedded BirdNET v2.4 range filter with broader species coverage and per-classifier mapping, so each installed bird classifier (BirdNET, Perch) gets range filtering matched to its own label set. Bat classifiers are excluded from range filtering since BattyBirdNET already ships as region-specific models. The geomodel downloads automatically from HuggingFace as a shared companion when you install or reinstall Perch v2 from the Model Gallery. If you already have Perch v2 installed, use the reinstall button to get the geomodel files. A redesigned status panel in Analysis settings shows per-classifier coverage and a toggle for passing species that have no geographic range data (#3031, #3032, #3035, #3037, #3075).

Perch v2 Taxonomy-Based Species Names

Google Perch v2 species names now resolve through the BirdNET Geomodel v3.0 taxonomy file (13,361 species, 29 languages) as a fallback when the BirdNET label set has no match. This raises Perch v2 common name coverage from 42% to approximately 85% across all supported locales. The taxonomy file downloads alongside the geomodel and the resolver registers automatically when the file is present on disk (#3042).

Bat Detection: Nighttime Scheduling

Bat detection can now be restricted to nighttime hours using civil dusk and dawn boundaries calculated from your configured location. The scheduler is enabled by default and pauses bat model inference during daylight, resuming at dusk. If location is not configured or sun calculation fails, the scheduler fails open and keeps bat detection active. The hot path is a single atomic boolean load per analysis cycle, so non-bat models pay zero cost (#3069).

Bat Detection: Ultrasonic Validation Filter

A post-detection filter measures temporal variability of ultrasonic energy in the captured audio to distinguish real bat echolocation from false positives caused by audible noise. Detections with low ultrasonic variability (flat spectral content) are tagged as "unlikely" rather than discarded, preserving all data for review. An "unlikely" badge appears on detection cards and detail pages, and a localized explanatory comment is automatically added to flagged detections. The filter is enabled by default with a coefficient of variation threshold of 0.15, validated across 24 audio files and 13 bat species (#3072, #3074, #3082).

Bug Fixes

Configuration

  • Zero-valued settings rejected instead of normalized - when a parent YAML key exists but child sections are absent, Viper drops nested defaults. LiveStream bitrate, segment length, sample rate, weather poll interval, and session duration are now normalized to compile-time defaults before range validation instead of being rejected (#3034).
  • Southern hemisphere season dates wrong - Viper defaults always populated Northern Hemisphere season dates, making the hemisphere detection dead code. Season dates are now corrected based on latitude at both config load and save time (#3063, fixes #3003).

Dashboard & UI

  • Missing save button on Analysis settings page - the tab bar suppressed action controls; now follows default behavior so the save button appears when settings are modified (#3023 by @ModerateWinGuy).
  • Daily activity grid confused by timezone differences - sunrise/sunset icons landed in wrong columns when server and browser timezones differed. The date picker also blocked navigation to the server's current date when the server was in a timezone ahead of the browser. Both now use the server's IANA timezone (#3061, fixes #3005).
  • Weather emoji icons swapped for rain conditions - shower rain and steady rain had their day emojis reversed. Also expanded weather condition translations from 15 to 43 base keys covering all 83 yr.no weather symbols, fixing "Unknown" tooltips for conditions like heavy rain (#3058, fixes #3018).

Audio & Streaming

  • Model list changes not hot-reloaded - adding or removing a classifier on a stream or audio source persisted to disk but the running orchestrator never rebuilt its model bindings until restart. The settings comparator now checks the per-stream/source Models list (#3045 by @jdevalk).
  • Stream health showing "Unknown" status - the stream health API used a credential-stripped copy of the source URL that had an empty connection string. A new registry method returns the raw connection string for health checks, still sanitized at the API boundary (#3049, fixes #3038).
  • Stream health SSE race conditions - added engine nil guard to the SSE endpoint, cached raw URL in health snapshots for stream_removed events, and added read lock to prevent races with hot-reload settings updates (#3060).

Notifications & Alerts

  • Mark All Read not persisting - the button only marked the locally visible notifications while the alert system kept creating new identical unread entries. A new bulk endpoint marks all unread non-toast notifications atomically (#3048, fixes #3046).
  • MQTT Home Assistant sensors stuck on "unknown" - HA autodiscovery value templates used this.state as fallback for non-matching sources, which returns "unknown" at startup and is rejected by numeric sensors. Changed to None so HA skips the update entirely (#3057, fixes #3052).
  • Gotify notifications timing out over HTTP - the Shoutrrr library defaults to HTTPS for Gotify URLs, causing TLS handshakes to hang against plain HTTP instances. Added a protocol selector in the notification provider form that appends ?disabletls=yes when HTTP is selected (#3059, fixes #3050).
  • Push alert action silently ignored - the alert dispatcher only handled the "bell" target. Rules configured with the "push" action (offered in the UI) fell through to a warning log with no notification created or broadcast (#3062, fixes #3021).

Database

  • Hardcoded table names break MySQL v1-to-v2 migration - four raw SQL queries used hardcoded table names without the v2_ prefix required during the migration window. Fixed all four to read the table prefix from the manager (#3054 by @jdevalk).

Thread Safety

  • SunCalc cache stampede and unbounded growth - added double-check locking to reduce redundant calculations under concurrent access and capped the cache at 400 entries. Also fixed a data race in the yr.no weather provider's lastModified field (#3064).
  • Frontend date validation rejecting server's timezone - dates from servers in far-ahead timezones were rejected as "future dates" by the browser. Added a +2 day tolerance covering the UTC+14 to UTC-12 gap (#3064).

Internationalization

  • Missing translation keys - added missing keys to Danish, Hungarian, Italian, Latvian, Slovak, and Swedish locale files (#3076).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 1 month ago

BirdNET-Go - Nightly Build nightly-20260511-414

BirdNET-Go now supports multiple AI models running simultaneously. A new Model Gallery lets you browse, install, and remove classifiers without restarting the server. This release adds Google Perch v2 and 11 BattyBirdNET regional bat classifiers as downloadable models with SHA256 integrity verification. When multiple models are active, a cross-model consensus engine merges their detections so independent agreement strengthens confidence. High sample rate audio capture (up to 384 kHz) on Linux enables bat detection with ultrasonic-capable USB microphones.

New Features

Model Gallery

A new model gallery in the Analysis settings page lets you install additional AI models alongside the default BirdNET v2.4 classifier. Models download from HuggingFace with SHA256 integrity verification (#2982, #2989, #2993, #2994).

Models available for download in this release:

  • Google Perch v2 - multi-taxa wildlife classifier (14,795 species). Species scope is currently limited to BirdNET v2.4 species; Perch scientific names are mapped to common names using BirdNET labels.
  • BattyBirdNET - 11 regional bat classifiers (Africa, Americas, East Asia, Europe Central, Europe North, Europe South, Middle East, South Asia, Southeast Asia, USA-East, USA-West), each sharing BirdNET v2.4 embeddings

Flexible Model-to-Source Assignment

You can assign one or multiple models to a single audio source, or dedicate separate audio sources to different models. For example, a standard microphone can run BirdNET and Perch simultaneously for bird detection, while a separate ultrasonic USB microphone runs BattyBirdNET for bat detection. Sample rate compatibility badges warn when a bat model is assigned to a source below the recommended 192 kHz capture rate (#2991).

Bat Detection Pipeline

Full support for ultrasonic bat detection using BattyBirdNET classifiers. Bat detection requires an ultrasonic-capable audio capture device (e.g., USB bat detector) with a sample rate of 192 kHz or higher recommended. The audio pipeline routes high sample rate audio directly to bat models while resampling the same source down to 48 kHz for BirdNET and 32 kHz for Perch, all running concurrently. A configurable bat confidence threshold filters low-confidence detections. Bat detections are stored with Chiroptera taxonomic class and correct model type for proper label resolution (#2971).

Cross-Model Detection Consensus

When multiple AI models identify the same species on the same audio source, their detections merge into a single pending entry with per-model contribution tracking (hit count, max confidence). The combined hit count across all models is used for false positive threshold checks, so cross-model agreement strengthens confidence. Per-model breakdowns are included in SSE broadcasts for the dashboard (#3007).

High Sample Rate Audio Capture (Linux Only)

Sound card configuration now includes a sample rate dropdown with device capability probing. The system queries each audio device for its supported rates at startup, caching results for the settings UI. Rates above 48 kHz automatically switch to ALSA exclusive mode (direct hardware access), bypassing dsnoop's silent software resampling. A stereo retry fallback handles USB devices that only support stereo on the hw: interface. Validated rates: 48, 96, 192, 256, and 384 kHz. Exclusive sound card mode is currently Linux-only; Windows and macOS support for high sample rates is planned for a future release (#2997, #3001).

Format-Aware Audio Export

Bird detections captured at high sample rates (96 kHz+) are automatically downsampled to 48 kHz before encoding, reducing file sizes 4-8x with no information loss since bird vocalizations top out around 12 kHz. Bat detections export at native rate to preserve ultrasonic content. When bat audio is configured for a format that caps at 48 kHz (MP3, Opus, AAC), the export silently falls back to WAV (#3014).

Per-Model Inference Time Tracking

The system overview card now shows stacked, color-coded sparklines for each active model's inference time. Each model displays its own timing, threshold status, and performance badge. Previously only BirdNET had inference visibility; Perch v2 and bat models now have full observability (#3012).

Consolidated Analysis Settings

All detection-related settings (confidence threshold, locale, false positive filter, range filter, dynamic threshold, processing threads, custom classifier) have moved from the main Settings page into the new Analysis page. The settings UI is still work in progress; feedback on layout and usability is welcome (#2985).

Security

  • SQL injection in backup temp path - the backup export handler now uses parameterized temp path construction instead of string interpolation, and generates unpredictable filenames (#2997).

Bug Fixes

Installer

  • Block root execution and detect cross-user installations - install.sh now refuses to run as root or with sudo, and detects existing installations under a different user (via systemd service, Docker mounts, and filesystem scan) before creating a duplicate (#2969, fixes #2952).

Audio & Streaming

  • Windows live audio and spectrogram streaming broken - FFmpeg was told to read from a Windows named pipe that nothing wrote to; fixed to read from stdin. Switched to MPEG-TS segments on Windows since FFmpeg cannot create fMP4 init segments from non-seekable stdin. Added init.mp4 in-memory cache on Linux/macOS as defense against segment rotation races (#2975, fixes #2973).

Dashboard & UI

  • Species settings crash before config loads - added null guards for species settings that prevented a TypeError when the page rendered before the config API response arrived (#2970).
  • Modal map crash when WebGL unavailable - the location settings modal map now checks DOM connection state before MapLibre initialization, with a cancellation flag to prevent instance leaks on rapid open/close (#2974).

Configuration

  • Home directory resolution fails under systemd - centralized all 6+ independent os.UserHomeDir()/os.Getenv("HOME") calls into a single GetUserHomeDir() helper with proper fallback chain (getpwuid_r -> os.UserHomeDir() -> $HOME env). When $HOME is unset in systemd services, this eliminates 8 separate Sentry errors from a single startup (#2972).

Database

  • Dual-write filter conversion dropped fields - GetBySpecies silently dropped Confidence, Verified, Locked, and Query filters. GetHourly hardcoded a 1-hour window ignoring the duration parameter. DeleteBatch could delete locked entries. Lock had a TOCTOU race. SaveReview had a TOCTOU race. All fixed with proper filter conversion, lock-check subqueries, and atomic upserts (#3009, #3010).

Performance

  • Metrics lock contention on inference hot path - replaced sync.RWMutex with atomic.Pointer for the global metrics singleton, eliminating lock acquisition on every StartSpan, Finish, and Predict call (#3015, fixes #583, #585).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 1 month ago

BirdNET-Go - Nightly Build nightly-20260511

BirdNET-Go now supports multiple AI models running simultaneously. A new Model Gallery lets you browse, install, and remove classifiers without restarting the server. This release adds Google Perch v2 and 11 BattyBirdNET regional bat classifiers as downloadable models with SHA256 integrity verification. When multiple models are active, a cross-model consensus engine merges their detections so independent agreement strengthens confidence. High sample rate audio capture (up to 384 kHz) on Linux enables bat detection with ultrasonic-capable USB microphones.

New Features

Model Gallery

A new model gallery in the Analysis settings page lets you install additional AI models alongside the default BirdNET v2.4 classifier. Models download from HuggingFace with SHA256 integrity verification (#2982, #2989, #2993, #2994).

Models available for download in this release:

  • Google Perch v2 - multi-taxa wildlife classifier (14,795 species). Species scope is currently limited to BirdNET v2.4 species; Perch scientific names are mapped to common names using BirdNET labels.
  • BattyBirdNET - 11 regional bat classifiers (Africa, Americas, East Asia, Europe Central, Europe North, Europe South, Middle East, South Asia, Southeast Asia, USA-East, USA-West), each sharing BirdNET v2.4 embeddings

Flexible Model-to-Source Assignment

You can assign one or multiple models to a single audio source, or dedicate separate audio sources to different models. For example, a standard microphone can run BirdNET and Perch simultaneously for bird detection, while a separate ultrasonic USB microphone runs BattyBirdNET for bat detection. Sample rate compatibility badges warn when a bat model is assigned to a source below the recommended 192 kHz capture rate (#2991).

Bat Detection Pipeline

Full support for ultrasonic bat detection using BattyBirdNET classifiers. Bat detection requires an ultrasonic-capable audio capture device (e.g., USB bat detector) with a sample rate of 192 kHz or higher recommended. The audio pipeline routes high sample rate audio directly to bat models while resampling the same source down to 48 kHz for BirdNET and 32 kHz for Perch, all running concurrently. A configurable bat confidence threshold filters low-confidence detections. Bat detections are stored with Chiroptera taxonomic class and correct model type for proper label resolution (#2971).

Cross-Model Detection Consensus

When multiple AI models identify the same species on the same audio source, their detections merge into a single pending entry with per-model contribution tracking (hit count, max confidence). The combined hit count across all models is used for false positive threshold checks, so cross-model agreement strengthens confidence. Per-model breakdowns are included in SSE broadcasts for the dashboard (#3007).

High Sample Rate Audio Capture (Linux Only)

Sound card configuration now includes a sample rate dropdown with device capability probing. The system queries each audio device for its supported rates at startup, caching results for the settings UI. Rates above 48 kHz automatically switch to ALSA exclusive mode (direct hardware access), bypassing dsnoop's silent software resampling. A stereo retry fallback handles USB devices that only support stereo on the hw: interface. Validated rates: 48, 96, 192, 256, and 384 kHz. Exclusive sound card mode is currently Linux-only; Windows and macOS support for high sample rates is planned for a future release (#2997, #3001).

Format-Aware Audio Export

Bird detections captured at high sample rates (96 kHz+) are automatically downsampled to 48 kHz before encoding, reducing file sizes 4-8x with no information loss since bird vocalizations top out around 12 kHz. Bat detections export at native rate to preserve ultrasonic content. When bat audio is configured for a format that caps at 48 kHz (MP3, Opus, AAC), the export silently falls back to WAV (#3014).

Per-Model Inference Time Tracking

The system overview card now shows stacked, color-coded sparklines for each active model's inference time. Each model displays its own timing, threshold status, and performance badge. Previously only BirdNET had inference visibility; Perch v2 and bat models now have full observability (#3012).

Consolidated Analysis Settings

All detection-related settings (confidence threshold, locale, false positive filter, range filter, dynamic threshold, processing threads, custom classifier) have moved from the main Settings page into the new Analysis page. The settings UI is still work in progress; feedback on layout and usability is welcome (#2985).

Security

  • SQL injection in backup temp path - the backup export handler now uses parameterized temp path construction instead of string interpolation, and generates unpredictable filenames (#2997).

Bug Fixes

Installer

  • Block root execution and detect cross-user installations - install.sh now refuses to run as root or with sudo, and detects existing installations under a different user (via systemd service, Docker mounts, and filesystem scan) before creating a duplicate (#2969, fixes #2952).

Audio & Streaming

  • Windows live audio and spectrogram streaming broken - FFmpeg was told to read from a Windows named pipe that nothing wrote to; fixed to read from stdin. Switched to MPEG-TS segments on Windows since FFmpeg cannot create fMP4 init segments from non-seekable stdin. Added init.mp4 in-memory cache on Linux/macOS as defense against segment rotation races (#2975, fixes #2973).

Dashboard & UI

  • Species settings crash before config loads - added null guards for species settings that prevented a TypeError when the page rendered before the config API response arrived (#2970).
  • Modal map crash when WebGL unavailable - the location settings modal map now checks DOM connection state before MapLibre initialization, with a cancellation flag to prevent instance leaks on rapid open/close (#2974).

Configuration

  • Home directory resolution fails under systemd - centralized all 6+ independent os.UserHomeDir()/os.Getenv("HOME") calls into a single GetUserHomeDir() helper with proper fallback chain (getpwuid_r -> os.UserHomeDir() -> $HOME env). When $HOME is unset in systemd services, this eliminates 8 separate Sentry errors from a single startup (#2972).

Database

  • Dual-write filter conversion dropped fields - GetBySpecies silently dropped Confidence, Verified, Locked, and Query filters. GetHourly hardcoded a 1-hour window ignoring the duration parameter. DeleteBatch could delete locked entries. Lock had a TOCTOU race. SaveReview had a TOCTOU race. All fixed with proper filter conversion, lock-check subqueries, and atomic upserts (#3009, #3010).

Performance

  • Metrics lock contention on inference hot path - replaced sync.RWMutex with atomic.Pointer for the global metrics singleton, eliminating lock acquisition on every StartSpan, Finish, and Predict call (#3015, fixes #583, #585).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 1 month ago

BirdNET-Go - Nightly Build nightly-20260507

Bug fix release focused on Windows reliability, Home Assistant MQTT discovery, and species tracking accuracy. Windows users get fixes for spectrogram hangs, log rotation breakage, and tool path validation ignoring configured paths. The MQTT HA discovery race that left sensors stuck at "Unknown" is resolved, and a timezone mismatch that caused false "first time this year" badges for users west of UTC is corrected. Detection clip positioning is now accurate across all model types.

Security

  • OAuth host misconfiguration warning - the OAuth settings tab now shows a warning banner and disables saving when neither Host Address nor Base URL is configured, preventing redirect URI mismatches that silently break OAuth flows. The redirect URI display shows the actual configured value instead of the browser's window.location (#2961).

Bug Fixes

MQTT & Home Assistant

  • HA discovery race publishes sourceId='default' - when the MQTT broker connected before audio sources registered, discovery templates were published with a hardcoded default source ID that never matched real detection payloads, leaving HA sensors stuck at "Unknown". Discovery now waits for real sources via a debounced event listener, and stale default entries are cleaned up automatically on first real publish (#2949, fixes #2948).

Species Tracking

  • False "first time this year" badges in western timezones - the species tracker compared DB-loaded dates (UTC midnight) against local-timezone cutoffs, so species first detected on the year boundary were incorrectly pruned every sync cycle for users in UTC-5 through UTC-10. Date comparisons now use year/month/day tuples instead of time.Before/time.After (#2956, fixes #2954).

Audio & Detection

  • Detection offset hardcoded to 10 seconds - the analysis buffer used a fixed 10-second offset regardless of model type, placing bird calls too deep into saved clips. The offset now derives from the model's actual clip length (3s for BirdNET v2.4, 5s for v3.0/Perch), so calls appear at the correct position in captures (#2963, fixes #2823).

Windows

  • Spectrogram and file operations hang - SecureFS.RelativePath called filepath.EvalSymlinks through a parent-directory walker that never terminated on Windows because filepath.Dir("C:\") returns "C:\", not / or .. All SecureFS methods that resolve paths (Exists, Open, ReadFile, Stat, WriteFile, Remove, Rename, and more) hung indefinitely. Added a platform-neutral root detection guard (#2958, #2959, #2960).
  • SoX and FFprobe ignore configured paths - six code paths used exec.LookPath() instead of the user's soxpath/ffmpegpath settings. On Windows systems where tools are installed outside the system PATH, this silently disabled spectrogram generation and version detection (#2957, fixes #2845).
  • Log rotation creates .new.new.new... filenames - when os.Rename failed during rotation (common on Windows due to antivirus file locking), the suffix accumulated on each retry until hitting MAX_PATH and breaking logging entirely. Rotation now derives filenames from an immutable base path (#2964, fixes #2942).

Logging

  • Debug messages flooding console output - the multi-writer log handler dispatched to all sub-handlers if any one accepted the log level, so debug-level file handlers caused debug messages to leak to info-level console handlers (#2939, fixes #2938).

Dashboard & UI

  • Map crashes when WebGL is unavailable - the MapLibre map now shows a fallback message with coordinate input fields when WebGL is missing or fails (e.g., Chrome GPU sandbox). Tab switching retries map initialization (#2962).
  • Missing required-field indicators on audio forms - soundcard and RTSP stream add/edit forms now show red asterisk indicators on mandatory fields (source name, audio device, stream name, stream URL) (#2936).

Build & Development

  • Go version drift across CI and Taskfile - go.mod is now the single source of truth for the Go version, eliminating manual sync across Taskfile, CI workflows, devcontainer, and docs. Also fixes TensorFlow sparse checkout on fresh task setup-dev, adds the missing frontend build step so air realtime works immediately after setup, and installs FFmpeg/SoX so audio tests run out of the box (#2930 by @anyasabo).
  • CI workflow fixes - corrected doubled ghcr.io/ prefix in Docker cache references, exported TEST_IMAGE to GITHUB_ENV, fixed .golangci.yml vs .yaml trigger mismatch, added fetch-depth: 0 to release builds for correct git describe versioning, and several other hygiene fixes (#2932 by @anyasabo).
  • CGO environment variables missing in test tasks - test and test-coverage Taskfile targets now set CGO flags, fixing build failures when running tests that link against TensorFlow (#2931 by @anyasabo).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 1 month ago

BirdNET-Go - Nightly Build nightly-20260502

Bug fix release targeting database reliability, search accuracy, and UI edge cases. The v2only datastore gets fixes for duplicate dynamic thresholds, broken partial common name search, and stale DB handles after connection pool recycling. MQTT users gain stable source identifiers that survive restarts, and two new API endpoints expose audio sources over REST. Support dump uploads, which silently broke in the previous build due to an upstream sentry-go regression, are restored.

New Features

Audio Source API Endpoints

Two new REST endpoints expose the active audio sources from the engine registry: GET /api/v2/system/audio/sources (authenticated, all source types) and GET /api/v2/streams/sources (public, streams only). Both return {"sources": [{"id", "name", "type", "state"}]}. Previously the only way to discover sources was via the SSE stream at /api/v2/streams/audio-level (#2913).

Stable MQTT Source Identity

sourceId in MQTT detection payloads is now derived from a SHA-256 hash of the connection string instead of a random UUID. The format stays {type}_{hex8} (e.g., rtsp_a3f1b2c4) but is now deterministic across restarts. A new sourceName field carries the configured stream display name for human-readable filtering in Home Assistant (#2916, fixes #2799).

Note: sourceId values will change once after upgrading. If your Home Assistant automations filter on a specific sourceId, update them to the new value or switch to the new sourceName field, which is always stable.

Bug Fixes

Database & Search

  • Duplicate dynamic thresholds in v2only mode - GetAllDynamicThresholds() returned empty ModelName because the v2 schema stores thresholds by label ID without a model column. The API merge produced different composite keys for the same species, doubling every entry. Thresholds now include the model relationship and use consistent lowercase species names (#2907, fixes #2902).
  • Partial common name search broken in v2only mode - the v2only datastore only matched scientific names via SQL LIKE, so searching "rastas" would not find "räkättirastas". Added in-memory common name scanning with NFC normalization for correct diacritical matching (#2919, fixes #2917).
  • Audio source display name not updating on device swap - GetOrCreate() returned the stale display name when a different USB microphone landed on the same ALSA device path. Now compares and updates the stored name when it differs (#2924, fixes #2921).
  • "Database is closed" errors not retried - the error was not classified as transient, so retry logic never kicked in during connection pool recycling. DB handles are now cleared on close to prevent stale references (#2928).

Audio & Performance

  • Per-frame mutex contention in audio routing - cached buffer pool pointers on route structs using atomic.Pointer, eliminating 3 per-frame mutex acquisitions in the hot path. Adds per-frame timing instrumentation and enriched Sentry diagnostics for frame drop events (#2904).
  • Equalizer crash on plain HTTP - four bare crypto.randomUUID() calls in the equalizer UI threw TypeError when accessed over non-HTTPS connections. Added the established Math.random fallback (#2905).

Dashboard & UI

  • Restart progress replaced by "unexpected error" - the restart store treated all ApiError instances as HTTP rejections, making the recovery polling branch unreachable. Network errors during restart now correctly trigger polling instead of resetting the UI (#2906).
  • Dashboard banner not visible to guest users - the settings store initialized as "loaded" even when loadSettings() was intentionally skipped for guests, causing the layout derivation to treat empty defaults as server state. Added a dataLoaded flag to distinguish the two cases (#2923, fixes #2526).
  • Incorrect placeholder image URL - fixed the fallback thumbnail path returned by the analytics backend (#2922 by @rexxars).

Notifications

  • Alert rule test fires not reaching push providers - the push dispatch loop filtered out test notifications, so clicking "Test" on an alert rule never sent to ntfy, Discord, Telegram, or other providers. The "Test Provider" button on Channels worked because it used a different code path (#2929, fixes #1902).

Telemetry

  • Support dump uploads silently broken - sentry-go v0.46.0 introduced a telemetry processor that drops event attachments. Support dump zip files uploaded from Settings > Support were arriving in Sentry without the attachment. Disabled the new buffer path to restore the legacy transport that handles attachments correctly (#2918).

Internationalization

  • Hungarian locale reverting to English on reload - the hardcoded SUPPORTED_LOCALES array in index.html was missing hu, causing the early-boot script to overwrite the stored preference. Locale list is now derived at build time from the actual translation files. Also added missing Danish, Latvian, and Swedish locales to the backend fallback list (#2915, fixes #2914).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 1 month ago

BirdNET-Go - Nightly Build nightly-20260429-405

Hotfix release for nightly-20260429. The earlier build shipped with a settings validation regression that broke Docker deployments using absolute audio export paths, a wizard that could reappear after dismissal, and several stale-pointer reads that prevented UI settings changes from taking effect at runtime. This build also adds a --silent flag to install.sh for scripted deployments.

New Features

Silent Installation Mode

install.sh now accepts a --silent flag that skips all interactive prompts and reads configuration from environment variables (BIRDNET_RTSP_URL, BIRDNET_LATITUDE, BIRDNET_LONGITUDE, BIRDNET_LOCALE, BIRDNET_PASSWORD, BIRDNET_TELEMETRY, BIRDNET_WEB_PORT). When run against an existing installation, it attempts an upgrade first and falls back to a fresh install. Cockpit installation is skipped in silent mode.

Security

  • OAuth2 server used stale settings on every request - all 8 settings read sites in the OAuth2 server now use fresh atomic snapshots, preventing stale redirect URIs, client secrets, and provider configuration from persisting after UI changes (#2900).

Bug Fixes

  • Audio export path validation rejected absolute paths - the validation hardening in nightly-20260429 rejected filepath.IsAbs() paths, breaking all Docker deployments where install.sh sets the export path to /data/clips/. Absolute paths are now allowed; only path traversal (..) is rejected (#2893).
  • Wizard reappearing after dismissal - the dismiss endpoint is now always public (works pre-auth), existing installs auto-seed last_seen_version using 5 detection signals, and both frontend and backend enforce the skip via a 6-layer defense (#2895).
  • Range filter using stale startup settings - GetProbableSpecies and predictFilter now read from the current published snapshot, so UI changes to coordinates, threshold, and location toggle take effect immediately (#2897).
  • Stale settings pointers across 8 files - currentSettings() helpers added to BirdNET, Controller, and OAuth2Server structs. All runtime reads in classifier, API v2, processor, and analysis packages now use fresh atomic snapshots instead of startup-time pointers (#2899, #2900).
  • Species cache key mismatch on concurrent settings change - getCachedSpeciesScores now uses the same settings snapshot for both cache key computation and score lookup, preventing a theoretical cache miss race.

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 2 months ago

BirdNET-Go - Nightly Build nightly-20260429

This nightly adds per-stream equalizer overrides, an enable/disable toggle for audio streams, and a fix that makes detection.occurred alert rules work for all detections (not just new species). A batch of settings hot-reload and persistence fixes ensures that UI changes take effect immediately and survive restarts, especially in Docker deployments with custom config paths. Audio playback reliability improves with ETag-based cache invalidation that eliminates stale-cache 416 errors.

New Features

Per-Stream Audio Equalizer

Audio streams can now have their own equalizer overrides, mirroring the per-source EQ that was already available for sound cards. Each stream card in the UI exposes an expandable EQ panel. A bug where per-source EQ silently fell back to the global profile (the resolver matched on auto-generated registry IDs instead of the human-readable display name) is also fixed (#2860).

Audio Stream Enable/Disable Toggle

Configured audio streams can now be individually enabled or disabled without removing them from settings. Disabled streams are excluded from capture, monitoring, scheduling, and sound-level reporting. Legacy configs without the field default to enabled. The UI shows a distinct visual state for disabled streams (#2836 by @alexjurkiewicz).

Detection Events for All Detections

detection.occurred alert rules now fire for every detection, not just new species. Previously, ordinary detections returned early before reaching the event bus, making the event type unusable for alerting. New species detections additionally emit detection.new_species so both event types can be used independently. The alert rule editor now shows event descriptions in the dropdown (#2865, fixes #2699).

Security

  • Settings validation hardening - reject zero realtime interval (would suppress all detections), strip HTML tags from site name, reject path traversal (..) in audio export path while allowing absolute paths (Docker volumes, NAS mounts), validate EQ frequency/Q factor ranges, enforce dynamic threshold cross-field constraints, reject negative retention values (#2876, #2893).

Bug Fixes

Configuration & Settings Persistence

  • Settings lost on restart in Docker deployments - FindConfigFile() now checks the --config CLI flag path before searching defaults, fixing a silent data loss bug where the API returned 200 but wrote to the wrong config file (#2874).
  • Settings not persisting to disk after range filter rebuild - the API controller's publish-to-global check used pointer identity, which broke after any out-of-band StoreSettings call. Replaced with a stable ownership flag (#2877, #2884).
  • Processor settings stale after UI changes - detection threshold, false positive filter, dog bark filter, privacy filter, daylight filter, extended capture, and all other processor-level settings now read from the latest published snapshot instead of a cached copy from startup (#2866).
  • Range filter mutations violated immutable-snapshot contract - converted to clone-mutate-publish pattern, fixing a race where concurrent readers could observe torn writes on the species slice (#2869).
  • Hot-reload of coordinates/API key and spectrogram settings - weather service and spectrogram generation now sample fresh config per request (#2841 by @bo0tzz).
  • PATCH support for logging, alerting, backup, output sections - these sections previously returned 400 "unknown settings section" (#2875).
  • PATCH support for perch, models, taxonomySynonyms sections - same issue; taxonomy synonym merges now preserve existing entries (#2886).

Audio & Streaming

  • Extension-less clip paths in database - three validation gaps in the audio export settings flow combined to produce clip_name rows ending in a bare ., causing 404s on download and spectrogram generation. Fixed with defense-in-depth across frontend format switching, backend validation, and path construction (#2817).
  • Stale audio cache producing 416 Range Not Satisfiable - added ETag header (mtime + file size) to SecureFS-served files, invalidating browser cache entries left over from the pre-gzip-fix era (#2858).
  • Source/stream rename not reflected in audio registry - renaming a source or stream in the UI now updates the registry DisplayName and fires a reconfigured event, so EQ overrides resolve against the new name (#2861).

Dashboard, Wizard & Authentication

  • Guest users behind Cloudflare Tunnel redirected on navigation - fetchWithCSRF() no longer treats 401 as "session expired" for guest-mode users; guests get a handled API error instead of a disruptive redirect (#2827, fixes #2779).
  • Pre-auth API calls firing before login - settings load and restart-status check are now guarded behind an auth check, eliminating 4 console errors per unauthenticated page load (#2889).
  • Wizard reappearing after dismissal with auth enabled - localStorage check now runs before the freshInstall branch for all wizard flows (#2889).
  • Notification button accessibility - Edit/Delete icon-only buttons on the notifications settings page now have aria-label attributes (#2889).
  • Missing basepath on images and spectrograms - several asset URLs were not wrapped in buildAppUrl, breaking display behind reverse proxies (#2873 by @rexxars).
  • Dark spectrogram text on live stream page - spectrogram overlay now uses a light foreground color for readability (#2863 by @rexxars).

Notifications

  • User notification templates ignored on alert path - detection notifications dispatched via the alerting engine used hardcoded fallback messages instead of rendering user-configured templates. Shoutrrr providers (Telegram, Pushover, ntfy) now correctly apply custom title/message templates (#2842).

Telemetry & Reliability

  • Diskmanager log flooding - default module log level changed from debug to info, preventing 100+ MB/day log files from per-clip debug entries (#2825).
  • Duplicate Sentry events from unhandled promise rejections - Modal confirm and sidebar logout handlers no longer re-throw errors that are already captured via the structured logging path (#2818).
  • Sentry noise from network errors when backend offline - dashboard API calls now check connection state before fetch, and all three Sentry capture paths filter network-level TypeErrors (#2851, #2854, #2855).
  • Duplicate request guard for detection quick-review - rapid clicks on Correct/Incorrect no longer fire concurrent verification POSTs for the same detection (#2816).

Internationalization

  • Estonian BirdNET labels updated - English common names replaced with official Estonian names from EOÜ (Estonian Ornithological Society) naming sources, matched by Latin taxon (#2822 by @alarmatwork).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 2 months ago

BirdNET-Go - Nightly Build nightly-20260418

This nightly is a stabilization release focused on cutting memory use back to pre-nightly-20260414 levels. Steady-state RAM on a typical single-source deployment drops by roughly half, thanks to reclaiming the job-queue archive, pooling hot-path audio buffers, and releasing timezone polygon data after lookup. It also brings audio source labels to the detection UI, an in-feed quick-review action, a behavioural fix to /api/v2/search that consumers of that endpoint should read, and a batch of search, basepath, notification, and guest-dashboard fixes.

New Features

Audio Source Labels in the Detection UI

Detection views now display the human-readable source name (e.g. "Garden feeder") instead of a raw RTSP URL or device ID. The desktop detections table gains a new Source column at lg and above, mobile detection cards show the source name inline after the timestamp, and the Search view recognises a new source: filter that maps to the existing location API parameter. The API's DetectionResponse.source field is now a structured SourceInfo object (id, type, displayName) instead of a plain string, aligning with the realtime/SSE path that already used the structured form. Detections whose source cannot be resolved from the live AudioSource table now fall back to the configured source name in settings instead of showing an ID (#1681 by @jasonmadigan, #2757, addresses #1494).

Quick Review from the Action Menu

Detection cards and list rows now expose Correct / Incorrect items at the top of the action menu, so verification status can be set without opening the detection. The dashboard CardActionMenu and list ActionMenu have been merged into a single component with a variant prop, and a / badge is shown next to the matching item when the detection is already reviewed. The items are hidden when the detection is locked or the user lacks review permission (#2809, closes #2712).

Memory & Performance

  • Drop completed-job retention in the action queue - the archived-jobs slice was pinning roughly 45-100 SaveAudioAction PCM buffers at about 2.88 MB each. Completed and failed jobs are now discarded on the next cleanup tick, reclaiming about 130 MB of steady-state heap on a single-source deployment (#2787).
  • Release the timezone finder after first resolve - tzf polygon data (~32 MB) was kept for the lifetime of the process despite only being needed once at startup. It's now freed after the initial timezone lookup (#2803).
  • Pool AudioCore hot-path allocations through buffer.Manager - the router, capture path, HLS/stream frame buffers, and AnalysisBuffer.Read windows now draw from pooled, refcounted buffers instead of allocating per frame. Reduces GC pressure and per-source memory churn (#2788, #2793, #2794, #2796).
  • Sound-level monitoring no longer runs when disabled - the sound-level pipeline was always running and consuming CPU and memory even with the feature switched off in settings. It's now skipped entirely when disabled, and starts or stops correctly on hot-reload of the toggle (#2802).

Behavioural Change (API consumers)

  • /api/v2/search now returns "correct" instead of "verified" in the verified response field for reviewed detections, matching the vocabulary already used everywhere else in the API (including /api/v2/detections). External scripts that match the literal string "verified" need to update to "correct" (alongside the existing "false_positive" and "unverified"). The request-side verifiedStatus filter parameter on the same endpoint has changed in the same direction: pass "correct" to select reviewed detections. The previously documented "verified" value was never actually accepted by the validator, so no working client could have been relying on it (#2801, fixes #2769).
  • DetectionResponse.source is now an object, not a string - see the Audio Source Labels section above for the new shape. The old string form was only used in a handful of REST paths; SSE/realtime consumers already received the structured form.

Bug Fixes

Search & Detections

  • Search view no longer shows "Unverified" for already-reviewed detections - both the response field and the filter dropdown now speak the canonical "correct" vocabulary (#2801).
  • Search by common name works against any configured display locale - common-to-scientific resolution now happens server-side, and /api/v2/detections search was extended to match the same way. The earlier client-side shim has been removed (#2805, #2808, supersedes #2782).
  • Sort-dropdown race on rapid search resubmits - the last submitted sort now wins instead of whichever response arrived first (#2807).
  • Taxonomy synonyms UI copy clarified to make clear synonyms affect image lookups only, not detection matching (#2800).

Audio & Streaming

  • HLS frame corruption under contention - hlsConsumer.Write now copies frame data before sending on the channel, preventing readers from racing on the caller's buffer (#2792).
  • Extended Capture clip tails truncated - SaveAudioAction now defers its capture-buffer read until the tail window is actually available, fixing "Failed to read capture buffer for audio export" under Extended Capture (#2798, fixes #2789).

Dashboard, Wizard & Authentication

  • Guest dashboard restored when authentication is enabled - dashboard settings can now be read unauthenticated so the public dashboard renders again without forcing a login (#2763).
  • Notifications and quiet-hours reachable on the guest dashboard - the guest path now unlocks the notification feed and the quiet-hours read endpoints (#2775).
  • Sidebar locale choice preserved on unrelated saves - changing an unrelated setting no longer reverted the UI language (#2764).
  • Wizard now persists UI locale to the backend - the language picked during first-run setup is written through, not just held in browser state (#2765).
  • Defensive guards for missing source.models and duplicate timeline keys - prevents UI crashes on older data or mixed-source configurations (#2761).

Basepath & Reverse Proxy

  • Header-only basepath stripped for proxied callback routes - fixes auth callbacks and similar routes behind reverse proxies that inject X-Forwarded-Prefix (#2780, fixes #2778).
  • Dashboard anchors, RawPath sync, and settings hot-reload race under basepath - several basepath-related inconsistencies ironed out (#2785).

Notifications & Webhooks

  • Unread count no longer includes toast-flagged notifications - InMemoryStore.GetUnreadCount was blindly incrementing on save; it now walks the same filter path List uses, so the counter matches the list endpoint. A typed Count(filter) method replaces the guest pagination loop (#2777).
  • CSRF token now sent on audio POST + opt-out auto-add for synonym form (#2781, fixes #2768, #2767).

Database

  • Reconcile stale unique indexes before AutoMigrate - prevents migration failures when an older schema left a unique index around that conflicts with the new column shape (#2804).

Telemetry & Reliability

  • Suppress context.Canceled noise for database operations - cancellation on shutdown no longer reports as a Sentry error (#2772).
  • Silence MQTT disconnect floods and floor the jobqueue stop timeout (#2774).
  • Circuit breaker for BirdWeather uploads + exponential backoff for suppressor reminders - transient upstream failures no longer cascade into notification storms (#2773).
  • Suppress capture-buffer warmup noise + tag Sentry events with process uptime - cleaner startup logs and easier to tell cold-start events apart from steady-state ones (#2762).

Internationalization

  • Dutch compound nouns corrected in main settings labels (commit d6c76cad).
  • Source column localized across all supported locales (#1681 by @jasonmadigan).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala about 2 months ago

BirdNET-Go - Nightly Build nightly-20260414

This nightly is a large architectural release. Highlights include multi-source audio capture with dynamic device reconfiguration, a new multi-model detection pipeline with Perch v2 and ONNX backend support, a complete rebuild of the audio subsystem, extensive database reliability work, and over 50 fixes across detection, streaming, notifications, and dashboard.

New Features

Multi-Source Audio Capture

BirdNET-Go can now listen to multiple sound cards simultaneously. Each source has its own gain setting and EQ filter configuration. The capture pipeline supports dynamic device reconfiguration — sources can be added, removed, or retargeted from the UI without restarting the server. This is built on the new internal/audiocore package that replaced the monolithic myaudio with a clean, dependency-injected audio architecture (#2612, #2614, #2616, #2737, #2738, #2739).

Multi-Model Detection Groundwork (Preview — BirdNET v2.4 only in this release)

The audio capture pipeline has been rewritten to feed one or multiple AI models in parallel, and a new ONNX inference backend (gated by a build tag) has been added alongside the existing TensorFlow Lite backend. Docker images now ship with ONNX Runtime 1.24.4, and the classifier package has been reorganized into internal/classifier with per-backend sub-packages and a configuration-driven model identity registry.

This is preview plumbing, not a shipping feature yet. This release continues to run BirdNET v2.4 exclusively. Support for Google Perch v2 and the upcoming BirdNET v3.0 is technically wired up but remains untested, no additional models are bundled with the release, and there is no UI for enabling or configuring alternate models. A model catalog UI for easy deployment of additional models — and eventually a bat detection model from the BattyBirdNET-Pi project — is planned for a future release. Expect rough edges as the new pipeline matures. See discussion #2725 for background (#2617, #2619, #2622, #2623, #2624, #2625, #2626, #2628, #2631, #2637, #2639, #2676).

Species Custom Configuration Editor Redesign

The species custom configuration editor has been rebuilt with reusable editor components for a cleaner and more consistent UX, including bidirectional species name resolution between common and scientific names (#2685, #2687).

HTTPS Healthcheck

The container healthcheck now supports HTTPS endpoints, with response validation to correctly handle redirects (#2673 by @mmomjian, #2680).

Consistent UI Transitions

Dropdowns and modals across the UI now share a unified transition style for a more coherent feel (#2563).

Hungarian Locale

New Hungarian (hu) locale added to the UI (#2488 by @cinadr).

GitHub Issue Number in Support Dumps

Support dumps uploaded from Settings > Support can now carry a GitHub issue number that reaches Sentry, making it easier to correlate diagnostic data with reported issues (#2548).

Security

  • Redact secrets from settings API responseGET /api/v2/settings no longer leaks API keys, webhook credentials, or OAuth secrets (#2527)
  • Webhook secret restoration by provider + endpoint — replaces positional index matching to prevent secret cross-contamination when providers are reordered (#2531)
  • CSRF skipper hardened — restricted to safe HTTP methods on media paths, with path traversal protection (#2536)
  • IsSecureRequest trust boundaryX-Forwarded-Proto now only trusted from loopback/private-network IPs (#2536)
  • SSE payload sanitization — explicit struct with camelCase fields, strips filesystem paths and source credentials from live event stream (#2531)
  • Tighter input validation — stricter CIDR parsing, GPS-in-device, and custom command path validation (#2729)
  • X-XSS-Protection disabled — set to 0 per OWASP guidance (deprecated browser feature) (#2531)

Bug Fixes

Detection Pipeline & Species Filtering

  • "Ignore Species" setting now actually filters — species filter is applied during detection processing with case-insensitive matching on common and scientific names (#2542)
  • Species novelty flagsisNewSpecies, isNewThisYear, and isNewThisSeason now compare against first-seen dates instead of always returning true (#2535)
  • Extended capture settings now hot-reload — species filter map rebuilds without restart (#2542)
  • Dynamic threshold goroutines managed on hot-reload — persistence and cleanup goroutines start/stop when the setting toggles (#2542)
  • Dynamic threshold recalculation — all species thresholds recalculate when the base threshold changes (#2536)
  • Cannot delete species from dynamic threshold list — fixed re-insertion race after batch persistence (#2542)
  • Orphaned clip references — disk retention now clears clip_name references when files are deleted (#2660)
  • DST-safe calendar day calculation in species tracking (#2689)
  • Requeue failed pending resets — no longer silently dropped (#2585)

Database Reliability

  • Reduce SQLite write contention — addresses silent data loss under concurrent writes (#2565)
  • RetryOnLock on all write paths — v1 datastore and v2 repository write paths retry on transient lock errors with exponential backoff and cancellation support (#2577, #2578, #2582)
  • MySQL connection pool sizing — aligned v1 and v2 pool constants, prevents resource exhaustion (#2573, #2575)
  • Cancelable WAL checkpoint — no longer blocks past shutdown deadline (#2587)
  • Periodic SQLite WAL checkpointing — 5-minute PASSIVE checkpoints prevent unbounded WAL growth (#2536)
  • v2 database migration robustness — schema validation and self-healing for partially applied migrations (#2683)
  • Alerting history cleanup retry — exponential backoff on transient SQLite lock errors (#2536)
  • Database backup nil guard — prevents panic in VACUUM INTO when gormDB is nil (#2535)

Audio, Streaming & Spectrograms

  • Separate spectrogram gain from audio output mute — the gain slider no longer shares state with the output mute control (#2554)
  • Spectrogram style on FFmpeg fallback — consistent appearance whether sox or FFmpeg generates the spectrogram (#2555)
  • Dark spectrograms from sox — fixed duration query failures on MP3/AAC files (#2684)
  • Decouple audio export from detection broadcast — export no longer blocks the broadcast pipeline (#2567)
  • HLS startup gap reduced — larger playlist size plus independent_segments and flush_packets flags (#2542)
  • Non-S16 audio format conversion — non-16-bit inputs properly converted to 16-bit PCM (#2612)
  • FFmpeg stderr race and audio 404 headers (#2654)
  • Skip gzip for binary media and ranged responses — fixes audio streaming over gzipped transport (#2710)

Notifications & Webhooks

  • ntfy notification delivery failures resolved (#2556)
  • ntfy save button race during protocol check (#2559, #2561)
  • Webhook template function registration — custom templates now have access to the shared function library and case-insensitive field aliases (#2505)
  • Discord webhook no longer returns 400 for warnings — webhook provider skips non-detection notifications when a custom template is configured (#2530)
  • Webhook delivery error suppression — per-provider failure tracking with periodic reminders and recovery reporting (#2536)
  • Webhook error reporting — connection error tracking no longer masks real delivery errors (#2584)
  • MQTT phantom ClipName — cleared when the clip was not actually saved to disk (#2530)
  • MQTT publish suppression during disconnects — aggregate reporting on reconnect instead of flooding Sentry (#2535)
  • Alerting engine v2 schema guard and UX polish (#2510)

Weather

  • Localize Daily Activity weather tooltip temperature (#2681)
  • Always request metric units from Weather Underground API regardless of display preference (#2686)
  • Timezone derived from coordinates instead of system TZ — sunrise/sunset and weather timestamps respect the configured location even when the host timezone differs (#2689, #2735)
  • Sunrise/sunset displayed in local timezone — converted from UTC, populated via suncalc in SaveWeatherData (#2542)
  • Weather API 401 backoff — exponential backoff with retry cap to stop flooding Sentry when credentials are invalid (#2535)
  • Weather "daily events not found" retry — brief delay on transient DB lock instead of hard failure (#2536)

Dashboard & Frontend

  • Safari infinite reload loop resolved — IPv6 zone ID parsing no longer trips Safari (#2621)
  • Mobile drawer closes after tapping a menu item (#2549)
  • Audio settings popup sliders — no longer trigger spectrogram selection when adjusting (#2550)
  • Range filter species count resets when opening the view species popup (#2551)
  • Stale SpeciesDetailModal cache cleared on open — prevents flashes of old data (#2588)
  • Live audio play button, guest dashboard layout, datepicker overflow — multiple UI fixes (#2547)
  • Skeleton loading states in DetectionDetail — prevents layout shift during load (#2635)
  • Inline review buttons in search results — verification status updates immediately (#2542)
  • Gate Search quick-review UI with review permission (#2586)
  • "No audio sources" empty state — replaces infinite loading when no sources are configured (#2733 by @rexxars)

API, CORS & HTTP

  • CORS wildcard with credentials — reflects the request Origin instead of sending literal * when AllowCredentials is true (#2530)
  • HEAD requests return correct status — pre-middleware rewrites HEAD to GET before routing (#2530)
  • Detections query parameters silently ignoredspecies=, search=, and date= now auto-infer query type; limit accepted as alias for numResults (#2530)
  • Detection deletion cleans up filesDELETE /api/v2/detections/:id removes clip and spectrogram files (#2531)
  • Route collision on numeric IDs — audio and spectrogram handlers validate numeric IDs (#2529)
  • Pagination total count correctSearchNotes returns actual total instead of decreasing with offset (#2529)
  • Unlock idempotencyPOST lock returns 200 when no lock exists instead of 500 (#2530)
  • API logger status code — extracts status from echo.HTTPError instead of always logging 200 (#2529)
  • Bidirectional species name resolution in settings UI (#2685)
  • IPv6 zone IDs in client IP parsing (#2708)
  • Basepath consistency — basepath is now applied uniformly across routes and assets (#2731 by @rexxars)
  • Search no longer defaults date to today — cross-date search results work (#2542)

Configuration & Validation

  • Percentage parsing robustness — accepts bare numbers, fractional 0–1 values, and whitespace; eliminates thousands of Sentry events from disk cleanup cycles (#2531, #2564)
  • sqlite_integrity false alarm on fresh v2 installs — legacy-DB-dependent checks skipped in v2-only mode (#2542)
  • API v2 handlers use dependency-injected settings — replaces conf.GetSettings() calls for predictable behavior across tests and hot-reload (#2608)

Telemetry & Reliability

  • Reduce production log noise — quieter logging across 6 modules (#2707)
  • Suppress transient signals from Sentry — operational throttling and transient errors filtered (#2728)
  • Frontend auth errors filtered from Sentry — HTTP 401/403 suppressed at three levels (#2536)
  • Nil slog.Logger guard — prevents silent error loss when inner logger is nil (#2566)
  • AudioCore error reporting improved (#2690)
  • Skip journald reads in containers — avoids failing reads on container filesystems (#2727)
  • Avicommons license variants — image provider handles all license variant strings (#2727)
  • Short-circuit image fallback for exhausted species (#2730)
  • EventTracker cleanup — prevents unbounded memory growth (#2529)
  • Shutdown safety — 500 ms minimum grace for job queue workers, scheduler stopped before channel close (#2535)
  • startup-wrapper.sh SIGTERM handling — signal exits treated as clean shutdown (#2536)
  • CPU cache updater timer leak — replaced time.After with time.NewTicker (#2535)

Internationalization

  • Complete translations across all 13 locales (#2576)
  • Hungarian locale added (#2488 by @cinadr)
  • Dynamic threshold recalculating message translated across all locales (#2536)
  • Detection review UI strings localized across all locales (#2542)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 2 months ago

BirdNET-Go - Nightly Build nightly-20260322

If you're on nightly-20260321, update to this release. It fixes a critical bug that caused the Settings > Integrations page to freeze the entire UI, making all navigation unresponsive. Both Docker and bare-metal installs are affected.

This release includes all features from nightly-20260321: realtime spectrogram with live detection labels, graceful restart, onboarding wizard, OIDC-secured HLS streaming, taxonomy synonym overrides, Discord webhook notifications, and three new locales.


Critical Bug Fix

  • Integrations page freeze (effect_update_depth_exceeded) — an infinite reactive loop in eBird API key validation caused Svelte's runtime to lock up when navigating to Settings > Integrations, freezing all buttons and navigation until the tab was closed (#2475, fixes #2478, #2474)

Telemetry Improvements

  • Frontend Sentry error tracking — client-side errors are now reported to Sentry with privacy filtering, helping catch UI crashes like this one faster (#2476)
  • Telemetry hardening — nil guard, bounded event queue, logger-to-Sentry wiring, and source map support for meaningful frontend stack traces (#2477)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 3 months ago

BirdNET-Go - Nightly Build nightly-20260321-397

If you use Discord notifications, update to this release. Previous nightlies silently suppressed Discord alerts because detections were dispatched with the wrong internal notification type, causing webhook delivery to never trigger.

This release includes all features from the earlier nightly-20260321: realtime spectrogram with live detection labels, graceful restart, onboarding wizard, OIDC-secured HLS streaming, taxonomy synonym overrides, and three new locales.


Discord & Webhook Notification Fixes

  • Fix silent Discord notification suppression — detection alerts were dispatched with an incorrect internal notification type, causing Discord and other webhook notifications to be silently dropped instead of delivered (#2467)
  • Pass detection metadata to webhook templates — webhook templates now receive full detection metadata (species, confidence, location, timestamps), fixing empty or broken Discord rich embeds (#2473)
  • Fix premature species tracker update — species tracker was updated before the detection was fully created, causing stale data in notification context (#2469)

Documentation

  • Discord notification setup guide — step-by-step guide with rich embed webhook template (#2472)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 3 months ago

BirdNET-Go - Nightly Build nightly-20260321

This nightly is a large feature release. Highlights include realtime spectrogram visualization with live BirdNET detection labels, graceful binary and container restart, a first-time onboarding wizard, OIDC-secured HLS streaming, taxonomy synonym overrides, and three new locales.

New Features

Realtime Spectrogram with Live Detection Labels

Live waterfall spectrogram visualization for audio streams with real-time BirdNET detection labels overlaid directly on the spectrogram. Labels sync to the HLS playhead using program_date_time timestamps, with repeat hit indicators for continuously detected species. Includes a compact MiniSpectrogram widget for the dashboard and a new SpectrogramPlayer component that replaces the full AudioPlayer in detection rows (#2391, #2430, #2368).

Graceful Binary and Container Restart

Restart BirdNET-Go from the UI without losing data. Supports both native binary restarts and Docker container restarts with a new RestartCard in the system overview. Background migration continues syncing post-completion detections and includes startup reconciliation to catch anything missed during the restart window (#2443).

Onboarding Wizard

A new wizard dialog system for first-time setup and what's-new flows. Guides new users through initial configuration with step-by-step onboarding dialogs (#2418, #2423).

Taxonomy Synonym Overrides

User-configurable taxonomy synonym mappings for species that have been reclassified. Includes a settings UI for managing overrides, validation, and logging. Ships with built-in mappings for recently reclassified species (Streptopelia → Spilopelia, Bubulcus → Ardea, Cooper's Hawk scientific name) (#2427 by @tariquesani, #2395 by @tariquesani, #2440).

Public Live Audio Access

New option to allow unauthenticated access to live audio streams for public-facing installations. Supports hot-reload — changes take effect immediately without restart (#2356).

Default Audio Gain Setting

Configurable default gain level for audio playback across all views (#2354).

Custom Config File Path

New --config / -c CLI flag to specify a custom configuration file path, useful for running multiple instances or non-standard deployments (#2455).

Alert Rule Validation

EscalationSteps are now validated on alert rule save, preventing misconfigured escalation chains (#2464).

Portainer App Template

Official Portainer app template for one-click deployment with documented UID/GID configuration.

DetectionDetail Hero Redesign

The detection detail page hero section now uses a three-card layout for improved information density.

Settings Forms Redesign

All settings forms redesigned for visual consistency with the system design language (#2336).

New Locales

  • Danish (da) (#2366)
  • Swedish (sv) (#2365)
  • Latvian (lv) (#2364)

Security

  • HLS stream authentication — prevent unauthenticated access to HLS audio streams using per-session stream tokens (#2406)
  • Harden HTTP security headers — stricter CSRF cookie handling and security header configuration (#2421)
  • Respect AllowSubnetBypass.Enabled — subnet bypass was always active regardless of the Enabled flag (#2419)
  • Restrict COOP header to secure contexts — Cross-Origin-Opener-Policy now only applied over HTTPS (#2422)

Bug Fixes

Audio & Analysis

  • Prevent analysis buffer overruns under load — fixes ringbuffer-full conditions during sustained high-load periods (#2282)
  • FFprobe singleflight dedup — eliminates redundant FFprobe subprocess spawns (#2344)
  • Retry audio device validation for USB — handles late USB device enumeration on startup (#2360)
  • Audio clip race condition — grace period wait prevents premature clip access (#2358)
  • Restart analysis monitor after watchdog reset — analysis resumes after stream watchdog triggers (#2388)

Frontend & Dashboard

  • Dashboard layout persistence — widget widths and visibility now persist correctly for guests and authenticated users (#2402)
  • Fix empty species/daily response — SummaryLimit correctly read from layout element (#2362)
  • Push notification dispatcher hot-reload — save button and hot-reload now work for notification settings (#2404)
  • Confidence circle dark mode — no longer renders as a pie chart in dark mode
  • Toast notifications on failed actions — DetectionRow now shows error feedback (#2381)
  • Oklch color values — percentage lightness and degree hue for correct color rendering (#2405)
  • Slovak locale persistence — valid UI locales now derived dynamically (#2353)
  • Italian and Slovak in SUPPORTED_LOCALES — both locales now available in language picker (#2367)
  • Sidebar section labels — shortened across all locales for better fit (#2363)

Database & MQTT

  • MQTT TOCTOU race conditions — publish operations now use atomic check-and-set (#2462)
  • Cooldown TOCTOU race — atomic cooldown check prevents duplicate notifications (#2463)
  • Propagate database ID to Notes — v2only Note.Save now returns the assigned ID (#2460)
  • MQTT detectionId validation — defensive ID check prevents empty IDs in MQTT payloads (#2459)
  • Duplicate pending detection SSE — suppresses duplicate SSE broadcasts (#2433)
  • Dynamic threshold merge keys — normalized keys prevent duplicate species entries (#2414)

HLS Streaming

  • HLS session tracking and FIFO cleanup — fixes race condition, stale response, and FIFO leak (#2411)
  • AudioLevelIndicator fixes — resolves HLS-related pre-existing issues (#2416)
  • Stream label updates to MQTT — label changes propagate without restart (#2279)

Notifications & Alerts

  • Prevent alert test from triggering push — test button no longer sends real push notifications (#2348)
  • Reduce notification noise — disk alerts and securefs 404s no longer flood notifications (#2446)
  • Return 404 for missing mark-as-read — correct HTTP status instead of 500 (#2280)

Configuration & Infrastructure

  • Location sentinel replaced — explicit locationConfigured flag instead of (0,0) sentinel (#2350)
  • OAuth provider session lookup — active provider stored directly in session (#2349)
  • Shutdown deadline — prevents hanging past 9-second deadline (#2420)
  • Rebuild name maps on locale change — datastore name maps refresh when BirdNET locale changes (#2436)
  • YAML tags on all settings structs — consistent serialization (#2441)
  • SecureFS base dir for spectrograms — path resolution uses SecureFS (#2387)

Internationalization

  • Restart keys translated for all non-English locales (#2445)
  • Species synonym translations for all locales
  • Hardcoded English strings replaced with i18n keys across multiple components
  • Updated Latvian BirdNET labels (#2340 by @Anrijs)
  • Separate Finnish names for Carrion and Hooded Crows (#2343 by @pasimasa)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 3 months ago

BirdNET-Go - Nightly Build nightly-20260315

This nightly brings major frontend features — OIDC authentication, a color scheme system, audio clip extraction with processing tools, dashboard customization, and weather/moon phase display — alongside a large batch of stability and reliability fixes.

New Features

Authentication & Security

  • OIDC provider support — connect self-hosted identity providers (Keycloak, Authentik, etc.) for single sign-on (#2324)
  • OIDC frontend settings UI — configure OIDC providers directly from the security settings page (#2328)
  • RP-Initiated Logout for OIDC — proper logout flow that signs out of both BirdNET-Go and the identity provider (#2327)
  • TLS certificate management — four certificate modes (none, self-signed, custom, ACME) configurable from the UI (#2288)
  • MQTT TLS certificate management — configure TLS certificates for MQTT connections via the settings UI (#2296)
  • Allow iframe embedding — new option to permit embedding BirdNET-Go in iframes (#2291)
  • Redact credentials from browser logs — sensitive values are scrubbed before reaching the console (#2306)
  • Return error from GenerateRandomSecret — proper error propagation instead of silently returning an empty string (#2307)

Dashboard & UI

  • Color scheme system — predefined color schemes, custom color picker, and server-side persistence (#2252)
  • Customizable dashboard layout — inline editing with adjustable widget widths (#2265)
  • Weather display and moon phase — live weather and moon phase indicator on the dashboard banner (#2300)
  • Dashboard cogwheel settings — new dropdown with map controls and dashboard options (#2289)
  • Settings menu in header — replaced theme toggle with a cogwheel settings menu (#2287)
  • Reset dashboard option — restore dashboard layout to defaults from the header menu
  • Telemetry listen address selector — IP dropdown with port field replaces free-text input (#2257)

Audio & Analysis

  • Audio clip extraction from spectrogram — extract and download audio clips directly from the spectrogram view (#2303)
  • Audio processing toolbar — denoise, normalize, and gain controls for audio playback (#2323)
  • Redesigned audio processing toolbar — unified controls with improved layout (#2334)
  • Audio analysis overload notification — alert when the system cannot keep up with real-time audio analysis (#2286)
  • Audio EQ filter timing diagnostics — timing metrics for audio equalization on RTSP streams (#2262)

Observability & Configuration

  • eBird API key validation — test eBird API connectivity from the settings UI (#2335)
  • Environment detection and CPU details — system info now shows container environment and CPU model (#2264)
  • Backend connectivity check — offline banner and polling guards when the server is unreachable (#2269)

Bug Fixes

Audio & Analysis

  • Wait server-side for audio encoding — prevents premature 503 responses for in-progress encodes (#2284)
  • Prevent analysis buffer overruns — fixes ringbuffer-full conditions under sustained load (#2282)
  • Route FLAC clip extraction through temp file — fixes corrupted FLAC headers in extracted clips
  • Use temp file for AAC/ALAC clip extraction — MP4 muxer requires seekable output
  • Correct file extensions for AAC and OPUS clips — downloads now have the right extension

Frontend

  • Prevent spectrogram flickering on page load — eliminates layout shift when spectrograms render
  • Treat 0-byte spectrogram files as missing — avoids permanent blank spectrograms
  • Confidence circle dark mode fix — no longer renders as a pie chart in dark mode
  • Keep elapsed time running while offline — CurrentlyHearingCard timer continues during connectivity loss (#2275)
  • Use settings store in BannerCard — removes redundant API call (#2321)
  • Responsive audio player image — correct object-fit property for responsive layout
  • Detection card grid layout — improved responsive container queries
  • CSS import order fix — correct import order for schemes.css

Connectivity & Streaming

  • Cancel in-flight ping on watchdog deactivation — prevents stale pings after reconnection (#2278)
  • Replace setInterval with recursive setTimeout — prevents polling pile-up during outages (#2277)
  • Arm SSE error watchdog once per burst — stops duplicate reconnection attempts (#2276)
  • Await initial poll before scheduling next — prevents race condition on first connectivity check
  • Streaming JSON parser buffer persistence — preserves partial chunks across iterations (#2309)
  • Drain result channel on disconnect — prevents goroutine leak when clients disconnect (#2308)

Database & API

  • Populate species_code from eBird taxonomy — fixes missing species codes in v2only datastore (#2233)
  • Pass MySQL database name to schema validation — fixes validation on non-default database names (#2239)
  • Return 404 for missing notification mark-as-read — correct status code instead of 500 (#2280)

MQTT & Streams

  • Propagate stream label updates to MQTT — label changes now take effect without restart (#2279)

Configuration

  • Propagate default transport to RTSP/RTMP streams — stream config inherits the global default transport (#2263)
  • Validate telemetry listen address — validates at startup, API, and runtime to prevent invalid binds (#2253)
  • Reset invalid SummaryLimit — falls back to default instead of blocking startup

Timezone & Display

  • Server timestamp for relative time — fixes cross-timezone display of detection times (#2310)
  • False positive filter detection count — slider now shows the actual computed count (#2312)

Taxonomy

  • Taxonomy synonym fallback for image lookups — falls back to synonym mappings when species images aren't found under the current name

Telemetry

  • Suppress telemetry for image-not-found errors — stops noisy error reports for expected missing images
  • Suppress Sentry for expected mount point failures — no more false alerts in containers (#2281)
  • Suppress Sentry for unregistered sound level processor — eliminates noise from unconfigured processors (#2283)

CI

  • Add explicit permissions to GitHub Actions workflows — follows security best practices (#2320)
  • Normalize audio clip i18n keys — replaces partial translations with English placeholders (#2322)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 3 months ago

BirdNET-Go - Nightly Build nightly-20260311

This nightly focuses on stability and bug fixes across audio processing, database migrations, taxonomy mappings, and the frontend. It also adds Prometheus observability metrics and refreshes the Species settings page.

New Features

  • Species settings page redesign — refreshed Species settings page with the system design language for a more consistent look and feel (#2190)
  • Prometheus metrics for BirdNET buffer overruns — new metrics to monitor when the BirdNET processing pipeline drops audio segments due to buffer pressure (#2230)
  • MyAudio Prometheus metrics wired up — previously unused audio capture metrics are now exported to Prometheus (#2232)
  • Buffer overrun tracking for BirdNET processing — internal telemetry to track when audio buffers overflow during analysis (#2229)

Bug Fixes

Audio & Analysis

  • 503 instead of 404 when audio is still encoding — audio requests now return 503 (Service Unavailable) while encoding is in progress, allowing clients to retry (#2227)
  • Handle missing analysis buffer during RTSP reconnection — prevents panic when RTSP source reconnects before the analysis buffer is allocated (#2214)
  • Increase audio file readiness timeout for slow storage — longer timeout for NAS and network-mounted storage (#2210)
  • Preserve exponential backoff in audio file validation retries — backoff was accidentally flattened, now correctly exponential (#2218)

FFmpeg & Path Handling

  • Prevent ingress path prefix from contaminating FFmpeg binary path — path prefix no longer leaks into FFmpeg executable resolution (#2216)
  • Extend FFmpeg path validation to all execution points — consistent path validation everywhere FFmpeg is invoked (#2219)

Database & Datastore

  • Detect and fix v2 column contamination in legacy image_caches table — auto-repairs legacy tables that picked up v2 columns (#2188)
  • Disable FK checks during MySQL orphaned table cleanup — prevents migration failures on MySQL when dropping orphaned tables (#2208)
  • Restore species_code and fix empty summary in v2only analytics — analytics queries now return correct species codes and summaries (#2223)

Taxonomy

  • Add BirdNET synonym mappings for reclassified species — maps renamed species back to their current taxonomy (#2215)
  • Resolve remaining unmapped BirdNET species — fixes the last 10 species that had no taxonomy mapping (#2217)

Frontend

  • Enforce 4:3 aspect ratio on all bird thumbnail images — consistent thumbnail sizing across all views (#2189)
  • Correct PWA manifest start_url and scope — fixes PWA install and navigation behavior (#2221)
  • Prevent each_key_duplicate errors in species lists — eliminates Svelte console warnings from duplicate keys (#2224)
  • Show scientific_name in imageprovider error notifications — error toasts now include the species scientific name for easier debugging (#2231)

Image Provider

  • Cache network failures to avoid repeated broken DNS lookups — failed DNS lookups are cached to prevent flooding (#2222)
  • Add species and provider context to ErrImageNotFound errors — error messages now include which species and provider failed (#2225)
  • Return 404 instead of 500 for missing species images — correct HTTP status code for missing images (#2213)

Notifications & MQTT

  • Display error context in notification UI — notification errors now show actionable context (#2226)
  • Improve MQTT connection error handling and reconnection backoff — better error messages and exponential backoff for MQTT reconnects (#2220)

Infrastructure

  • Handle missing mount point gracefully in containers — system monitor no longer errors when container mount points are unavailable (#2211)
  • Skip files with unexpected filename format gracefully — disk manager ignores unrecognized files instead of erroring (#2212)

Telemetry Improvements

  • Close Sentry reporting gaps across 8 packages — previously uncovered error paths now report to Sentry (#2187)
  • Improve Sentry error reporting quality — better fingerprinting and context for error reports (#2209)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 3 months ago

BirdNET-Go - Nightly Build nightly-20260310

This nightly (March 10, 2026) contains critical bug fixes for the nightly released on March 9. Key fixes include audio filter chain initialization for all sources, biquad state corruption prevention in multi-source setups, MySQL v2 migration compatibility, and sound level processor stability. If you installed the March 9 nightly, updating to this release is strongly recommended.

This release also includes all features and improvements from the March 9 nightly: V2 database schema, alerting rules engine, redesigned UI pages, PWA support, and much more.


Critical Bug Fixes (since March 9 nightly)

  • Audio filter chain not initialized for non-malgo sources — filter chains were only set up for malgo audio sources, leaving RTSP and other sources without filtering (#2163)
  • Biquad state corruption in multi-source setups — shared filter state across audio sources caused cross-contamination; now uses per-source filter chains (#2168)
  • Sound level processor error flooding and race condition — excessive error logging and a data race in the sound level processor (#2169)
  • MySQL v2 AutoMigrate fails with legacy schema — v2 migration broke on MySQL when legacy tables existed (#2165)
  • V2 database table name mismatch — handle pre-PR#2165 table name mismatch for existing v2 databases (#2185)
  • Image provider crashes on empty scientific names — guard against empty scientific names on read paths (#2164)
  • Redundant SSE audio file polling removed — eliminated unnecessary polling in the processor (#2167)
  • Lifecycle management with tiered shutdown — new Service interface for clean startup/shutdown ordering (#2147)
  • Race condition in LegacyService Start/Stop — eliminated race between service start and stop (#2178)
  • FFmpeg exit code not captured — real exit codes now captured in handleQuickExitError (#2177)
  • Logger config struct tags missing — added mapstructure tags to logging config structs (#2186)
  • AviCommons now default image provider — switched default bird image provider to AviCommons (#2142, #2144)

New Features

V2 Database Schema

What changed: The database now uses a properly normalized design with separate tables for labels, models, and predictions linked by foreign keys. This enables multi-model support, model-specific labels, and significantly more efficient queries.

Migration: Existing installations can migrate to the new V2 schema from the System / Database dashboard. The migration runs in phases with progress tracking and validation and must be initiated manually by the user. Fresh installations start directly with the V2 schema.

Why it matters: Features like the new alerting rules engine, advanced analytics, and the database dashboard all require the V2 schema. Future features will be built exclusively on this foundation.

Alerting Rules Engine

A flexible, rule-based notification system that replaces simple threshold alerts. Create rules that combine multiple conditions — species, confidence, time of day, location — and route alerts to different notification channels. Managed through a new inline rule editor in the settings UI (#2010).

Database Dashboard

A new System / Database page showing real-time database health metrics, storage statistics, and performance sparklines. Includes integrated migration controls and backup management with progress tracking (#2056, #2058, #2060).

Insights Page (Backend)

New backend API endpoints for the upcoming Insights page, providing aggregated analytics data (#2145).

eBird Integration Settings

New settings UI for configuring eBird integration (#2146).

Currently Hearing Card

A new dashboard card showing species currently being detected in real-time, sorted by most recent detection with wall-clock timestamps (#2126, #2128).

PWA Install Support

BirdNET-Go can now be installed as a Progressive Web App on mobile and desktop devices for a native app-like experience (#2015).

Daylight Filter

An optional filter that can discard detections of user-specified nocturnal species during daytime hours, reducing false positives. Users must enable the filter and configure which species are affected. Uses sun position calculations based on your configured location.

Quiet Hours per Audio Source

Configure quiet hours independently for each audio source, allowing different schedules for different microphone locations (#2065).

Bird Image Proxy

Bird images are now proxied through the Go backend with a local file cache, improving privacy and load times (#2129).

UI Redesigns

  • Detection Detail Page — completely redesigned with improved layout and information density (#2037)
  • System Overview Page — data-dense layout with live sparklines for CPU, memory, disk, and temperature (#2046)
  • Terminal Page — polished card layout with color themes and popout window support (#2047, #2062)
  • Sidebar Navigation — new icons for analytics and system sections
  • Windows ConPTY Support — browser terminal now works on Windows (#2049)

Performance Improvements

  • ~20x faster spectrogram generation using FFT-friendly dimensions (#2027)
  • ~30x faster audio duration queries by replacing ffprobe with sox --info (#2028)
  • Spectrogram loading optimization with state machine and concurrent load limits (#2029)
  • Spectrogram lazy loading with cache headers (#2018)

Internationalization

  • Notification content now uses i18n translation keys (#2067, #2068, #2069)
  • Alert schema labels translated on the frontend (#2071)
  • Built-in alert rule names and notification titles translated (#2072)
  • NotificationBell hardcoded English strings replaced (#2070)

Other Bug Fixes

  • Duplicate predictions causing silent detection loss (#2127)
  • Shutdown bugs: database double-close, 9-second hang, goroutine race (#2131)
  • Extended capture buffer using wrong allocation size
  • Duplicate key errors in dashboard daily summary (#2032)
  • Audio device listing backend mismatch and duplicate key crash (#2031)
  • SSE WriteTimeout race from heartbeat interval (#2034)
  • Duplicate each-keys in Svelte components (#2035)
  • Audio card display name resolution (#2036)
  • Translation cache bugs causing stale translations (#2021)
  • crypto.randomUUID fallback for non-HTTPS contexts (#2024)
  • System metrics store initialization for sparklines (#2050)
  • Scientific name extraction from concatenated labels (#2051, #2053)
  • Detection detail translation and icon issues (#2055)
  • DailyEventsID propagation in v2only SaveDailyEvents (#2030)
  • Deduplicate predictions to prevent silent detection loss (#2127)
  • System monitor simplified to pure metric collector, duplicate notifications fixed (#2130)

Telemetry Improvements

  • Expanded diagnostic context with privacy-safe debugging fields (#2170)
  • 5xx errors now reported to Sentry via HandleError() (#2183)
  • Path anonymization centralized into privacy package (#2180)
  • Error origin tags to classify code vs environment issues
  • Stack traces enabled for fatal events with privacy scrubbing
  • Resource snapshots attached to system/database/timeout errors

Dependency Updates

  • Go dependencies: bumped go-minor-patch group (#2153)
  • Frontend dependencies: npm minor-patch group (#2154)
  • ESLint and related packages updated
  • GitHub Actions group bumped (#2156)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 3 months ago

BirdNET-Go - Nightly Build nightly-20260309-391

BirdNET-Go Changelog

What's New since nightly-20260118

Normalized Database Schema (V2)

This release introduces a completely redesigned, normalized database schema that replaces the legacy flat structure. The new V2 schema is the foundation for upcoming features and is required for all new functionality going forward.

What changed: The database now uses a properly normalized design with separate tables for labels, models, and predictions linked by foreign keys. This enables multi-model support, model-specific labels, and significantly more efficient queries.

Migration: Existing installations can migrate to the new V2 schema from the System / Database dashboard. The migration runs in phases with progress tracking and validation and must be initiated manually by the user. Fresh installations start directly with the V2 schema.

Why it matters: Features like the new alerting rules engine, advanced analytics, and the database dashboard all require the V2 schema. Future features will be built exclusively on this foundation.

Alerting Rules Engine

A fully configurable notification alerting system with a rules engine. Define custom rules that trigger notifications based on detection events and system conditions. The notification settings page has been redesigned with dedicated tabs for Channels, Rules, and History.

  • Create rules with flexible conditions (species, confidence thresholds, time windows)
  • Route alerts to different notification channels
  • Contextual messages in alert notifications
  • User-friendly error classification for failed alerts
  • MQTT publish failure alerts

Advanced Analytics Page

A new analytics page providing detailed statistical insights into your bird detection data. Contributed by @ModerateWinGuy.

  • Comprehensive detection statistics with filtering
  • False positives are excluded from all analytics
  • Weather bar timezone offset fix for accurate hourly display

Browser Terminal

Access a full terminal session directly from the web UI, useful for remote administration of headless installations like Raspberry Pi setups.

  • xterm.js-based terminal with WebSocket PTY bridge
  • Windows ConPTY support
  • Multiple color themes and popout window option

Extended Capture Mode

Extended capture allows the detection window to stretch well beyond the standard 15–60 second capture length, up to 20 minutes. This is designed primarily for recording long vocalizations such as owl calls that span many minutes.

  • Configurable per species, family, or genus via the settings UI
  • Requires explicit opt-in — not enabled by default
  • Not supported on systems with 512 MB or less RAM due to the memory requirements of large audio buffers

Daylight Filter

An optional filter that can discard detections of user-specified nocturnal species during daytime hours, reducing false positives. Users must enable the filter and configure which species are affected. Uses sun position calculations based on your configured location.

Currently Hearing

A new dashboard card showing birds detected in real time. Displays currently active species with wall-clock timestamps, giving you an at-a-glance view of what's being heard right now.

Bird Image Proxy

Bird species images are now served through the Go backend with a local file cache, instead of loading directly from external sources. This improves page load times, reduces external network requests, and works better on installations with limited or intermittent internet connectivity.

PWA Support

BirdNET-Go can now be installed as a Progressive Web App on mobile devices and desktops. Add it to your home screen for a native app-like experience.

Quiet Hours

Per-source quiet hours scheduling allows you to pause audio capture during specific time windows. Useful for reducing noise from non-bird sources during known quiet periods. Contributed by @iamrans0m00.

Events API

A new events API provides access to detection and system event history through structured JSONL logs. Supports timezone-aware date filtering and authenticated access.

Spectrogram Performance

Spectrogram generation has been dramatically optimized, which significantly improves web UI responsiveness — especially on resource-constrained devices like Raspberry Pi 3 and 4.

  • ~20x faster spectrogram generation by using FFT-friendly dimensions for sox
  • ~30x faster audio duration queries by replacing ffprobe with sox --info
  • Optimized loading with a state machine that prioritizes visible content
  • Cache headers and lazy loading for spectrogram images

Reverse Proxy Support

Universal reverse proxy support for Home Assistant ingress and custom proxy setups. BirdNET-Go now correctly handles forwarded headers and base path prefixes, making it work seamlessly behind nginx, Caddy, Traefik, or HA ingress.

System Page Redesign

The system overview page has been redesigned with a data-dense layout featuring live sparklines for CPU, memory, disk, and BirdNET inference time. Metrics history is stored in an in-memory ring buffer for smooth real-time visualization. Auto-refresh replaces the manual refresh button.

Detection Pages Redesign

  • Detection detail page has been completely redesigned
  • Detections listing now supports column sorting and a card view
  • Server-side sorting for the detections API

Database Dashboard

A new database dashboard shows migration status, database performance metrics, and storage statistics with live sparklines. Available for both legacy and V2 datastores.

Internationalization

Two new languages added: Slovak and Italian, bringing the total to 10 supported locales.

The i18n system has been expanded significantly:

  • Backend notification content is now translatable
  • API error responses include translation keys for frontend localization
  • Alert rule names and notification titles are translated
  • Toast notifications are fully translated
  • Error fallback strings on the frontend are localized

NTFY Improvements

  • Protocol auto-detection for NTFY server connections
  • Test Connection button to verify NTFY setup from the settings page
  • Fixed time.Duration corruption in push notification settings

Bug Fixes

  • Fixed audio equalizer filters not being applied to FFmpeg streams
  • Fixed RTSP transport flag being incorrectly applied to non-RTSP streams
  • Fixed equalizer Hz bandwidth to octaves conversion for correct RBJ cookbook filter behavior
  • Fixed audio device listing backend mismatch and duplicate key crash
  • Fixed audio card display name resolution from system device list
  • Fixed dashboard config not loading before daily summary fetch
  • Fixed species name disappearing at wide viewports in detections listing
  • Fixed species include list not searching all BirdNET labels
  • Docker: skip chown on NFS mounts to prevent ownership conflicts
  • Fixed broken systemd service generation on systems without /dev/snd
  • Fixed race condition in range filter settings swap
  • Fixed SSE heartbeat interval to prevent WriteTimeout race conditions
  • Fixed CSRF cookie refresh to prevent sporadic 403 errors on review save
  • Fixed duplicate key errors in dashboard daily summary
  • Added retry with backoff for audio playback on 404
  • Fixed shutdown bugs: database double-close, 9-second hang, goroutine race
  • Fixed SSE connections not closing before HTTP server shutdown
  • Fixed i18n translation cache bugs causing stale translations
  • Fixed detection deduplication to prevent silent detection loss
  • Restored version and build date display on About page
  • Fixed privileged context menu options being visible to guest users
  • Fixed WCAG AA contrast issues in system components

Contributors

Thanks to community contributors in this release:

  • @ModerateWinGuy — Advanced Analytics Page, WeatherBar timezone fix
  • @iamrans0m00 — Per-source quiet hours scheduling
  • @alectrocute — Spectrogram operational error priority fix

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala 3 months ago

BirdNET-Go - Nightly Build nightly-20260118

This pre-release (January 18, 2026) brings audio playback improvements, enhanced Home Assistant integration, and numerous bug fixes across the platform.

New Features

Audio Playback Speed Control
New playback speed control for detection audio clips with accessibility-focused design (#1774).

Aggregated Disk Notifications
Disk space notifications are now aggregated by mount point to reduce notification noise (#1822).

MQTT Detection ID for Home Assistant
MQTT messages now include detectionId for improved Home Assistant automation support (#1824).

Bug Fixes

Home Assistant & Reverse Proxy

  • Home Assistant MQTT discovery issues resolved (#1777)
  • Reverse proxy navigation support for Home Assistant Ingress (#1815)
  • CSRF token generation fixed for Cloudflare Tunnel deployments (#1823)

Dynamic Threshold Learning

  • Cooldown added to prevent rapid threshold learning (#1819)
  • Discarded detections no longer trigger threshold learning (#1828)
  • Species only added to dynamic thresholds when learning actually occurs (#1829)

Frontend & SPA Routing

  • SPA routing now reactive to navigation store changes (#1820)
  • SPA navigation 404 fixed for URLs with query parameters (#1826)
  • Open redirect protection added to buildAppUrl (#1817)
  • Mobile audio playback failure on iOS Safari resolved (#1825)
  • ESLint security and quality warnings resolved (#1775)

Notifications & SSE

  • Notifications now use detection time instead of processing time (#1782)
  • Panic during JSON marshaling in SSE notifications prevented (#1784)
  • 'Note not found in database' notifications prevented (#1783)

Internationalization

  • Race condition showing translation keys on first load fixed (#1786)
  • StatusBadges component now uses i18n translations (#1780)

Other Fixes

  • Settings overlap now syncs downward when filter level is lowered (#1776)
  • Weather detection timezone issues resolved (#1779)
  • Verified status now read from correct detection field (#1827)
  • Lowered log level for harmless species validation errors (#1821)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 5 months ago

BirdNET-Go - Nightly Build nightly-20260113

This pre-release (January 13, 2026) introduces a major redesign of stream configuration with multi-protocol support and real-time monitoring.

Major Features

Stream Configuration Redesign
Complete overhaul of audio stream configuration with support for named streams and multiple protocols. Streams can now be configured with distinct names and support for RTSP, HTTP, and file-based sources with automatic migration from legacy configuration (#1764).

Real-Time Stream Statistics
New stream monitoring UI with live stats updates and state history timeline for tracking stream health and performance (#1770).

Bug Fixes

  • ExecuteCommand actions now work correctly without parameters (#1760)
  • Script configuration errors are now surfaced to user notifications (#1761)
  • MQTT BirdImage JSON field restored to PascalCase for backward compatibility (#1762)
  • MQTT sound level template corrected and long device names truncated (#1763)
  • Sidebar active menu item highlighting restored (#1771)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 5 months ago

BirdNET-Go - Nightly Build nightly-20260111

This pre-release (January 11, 2026) adds Home Assistant integration support.

New Feature

Home Assistant MQTT Auto-Discovery
BirdNET-Go now supports Home Assistant MQTT auto-discovery, allowing automatic integration with Home Assistant for real-time bird detection monitoring. The feature includes a new settings UI for configuration (#1749, #1750).

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 5 months ago

BirdNET-Go - Nightly Build nightly-20260110

This pre-release (January 10, 2026) represents 18 days of development with numerous improvements since the previous nightly build, focusing on expanded OAuth authentication options, enhanced spectrogram customization, improved logging infrastructure, and comprehensive bug fixes.

Major Features

Expanded OAuth Authentication
Added support for Microsoft Account, LINE, and Kakao OAuth providers with a redesigned login modal featuring dynamic provider UI (#1654, #1658, #1662, #1663).

Centralized Logging System
Complete overhaul of logging infrastructure with unified structured logging, log rotation support, and dedicated spectrogram log files for easier debugging (#1676, #1678, #1741).

Spectrogram Customization
New configurable visual style presets and dynamic range settings give users control over spectrogram appearance (#1713, #1727).

Enhanced Mobile Experience
Comprehensive improvements to mobile UI across the application for better usability on smaller screens (#1685).

Weather Integration Improvements
Daily activity cards now display hourly weather icons, with complete yr.no symbol code mappings for accurate weather visualization (#1739, #1668).

Reverse Proxy Support
New Base URL configuration enables proper operation behind reverse proxies (#1636).

Scientific Name Species Lookups
Species configuration now supports lookups by scientific name in addition to common name (#1718).

Runtime Configuration
SPA migrated to runtime config fetching, eliminating need for rebuilds on configuration changes (#1660).

Performance Optimization
Added image load queue to limit concurrent spectrogram loads, improving page load performance (#1745).

Security

  • Security hardening with fuzzing tests and vulnerability fixes (#1648, #1649)
  • Centralized sensitive data sanitization for logging prevents accidental credential exposure (#1714)
  • Support bundle redaction gaps closed for better privacy protection (#1709)

Bug Fixes

  • Night detection search now correctly applies sunset/sunrise offsets (#1641)
  • Weather temperature stored in Celsius with correct display-time conversion (#1650)
  • Weather temperature and wind speed unit conversions corrected (#1733)
  • Weather timestamps stored in local timezone for correct date queries (#1740)
  • Weather icon derived from description when weatherIcon is unknown (#1737)
  • Audio buffer precision loss and race conditions fixed (#1689, #1691)
  • SSE write deadline reset prevents audio-level disconnections (#1675)
  • Duplicate SSE notification connections eliminated (#1742)
  • Duplicate Telegram/Shoutrrr notifications on timeout prevented (#1712)
  • BirdWeather test connection now includes Audio and BirdNET settings (#1667)
  • Detection comments API returns full comment objects instead of strings (#1731)
  • Locked detections can now be unlocked (#1686)
  • Comment section no longer collapses when typing (#1687)
  • Notification status correctly mapped to frontend read boolean (#1688)
  • Notification delete modal now appears correctly (#1695)
  • Dashboard fetches more detections when pagination limit increases (#1725)
  • Sox timeout handling improved with better fallback logging (#1726)
  • Species config keys normalized for case-insensitive matching (#1716)
  • ICU plural syntax with nested braces handled correctly (#1684)
  • SPA client-side routing implemented properly (#1698)
  • Horizontal scrollbar prevented when sidebar is collapsed (#1659)
  • Windows FIFO logging uses internal logger correctly (#1736)

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 5 months ago

BirdNET-Go - Nightly Build nightly-20251223

This pre-release (December 23, 2025) represents 9 days of development with 76 commits since the previous nightly build, focusing on completing the migration to the new Svelte 5 UI, major security hardening, and extensive code quality improvements.

🎉 Major Milestone: Svelte 5 UI is Now Default

The legacy HTMX-based UI has been completely removed. The modern Svelte 5 interface is now the only UI for all users. This completes a multi-month migration effort that brings:

  • Faster, more responsive interactions
  • Modern component architecture
  • Improved accessibility
  • Better mobile experience
  • Enhanced notification system with grouping and styling

The newUI setting has been removed as it is no longer needed.

Major Features

Collapsible Desktop Sidebar
New sidebar design with icons-only collapsed mode for more screen real estate. Smooth animations and improved navigation organization (#1626).

Enhanced Daily Summary Dashboard
Dashboard daily summary now features animations and dynamic sorting for better visualization of bird activity patterns (#1622).

Runtime Statistics UI
Database runtime statistics are now visible in the settings interface, providing insight into system performance and data storage (#1621).

Species Tracking Settings
New UI panel for configuring species tracking behavior, with settings changes applied at runtime without restart (#1591, #1595).

Per-Species Notification Controls
Configure cooldown periods and confidence thresholds per species for push notifications, reducing alert fatigue for common visitors (#1579).

Dynamic Threshold Controls
View and reset dynamic threshold runtime data directly from the frontend (#1601).

Notification Improvements
Enhanced notification system with grouping, consistent styling, and security improvements (#1609).

Security & Infrastructure

CSRF Protection
New CSRF middleware added to the API server for enhanced security against cross-site request forgery attacks (#1603).

File Permission Hardening

  • Restricted WriteFile permissions to 0600 (#1613)
  • Hardened file and directory permissions throughout (#1612)
  • Secure handling of file path operations (#1619)

New HTTP Server Architecture
Complete refactoring of the HTTP server infrastructure with improved architecture, moving authentication to server level (#1596, #1598).

OAuth Migration
OAuth callback endpoints migrated from legacy V1 to V2 API (#1574).

Bug Fixes

  • Detection review API endpoint now uses correct URL path format (#1629)
  • Mobile responsiveness improved for header dropdowns (#1628)
  • Mobile touch interactions no longer blocked by sidebar overlay (#1627)
  • Frontend object injection and TypeScript linter warnings resolved (#1600)
  • Missing i18n translations added for hardcoded strings (#1592)
  • Avicommons image provider switched to 2022 taxonomy for accuracy (#1582)
  • Spectrogram memory leak and context exhaustion prevented (#1573)
  • Hemisphere seasons now update correctly when defaults exist (#1572)

Code Quality

Extensive refactoring across multiple packages to improve maintainability, reduce cognitive complexity, and increase test coverage:

  • API v2 code quality improvements and complexity reduction (#1605, #1604, #1599)
  • Species tracker split into focused modules with comprehensive tests (#1593, #1594)
  • Notification, MQTT, and telemetry packages refactored (#1576, #1578, #1585)
  • Spectrogram, security, privacy, and observability improvements (#1588, #1586, #1589, #1590)
  • BirdWeather and image provider code quality enhancements (#1584, #1583)
  • Dynamic threshold code deduplicated with accessibility improvements (#1602)
  • SecureFS cognitive complexity reduced with improved test coverage (#1575)

Upgrading

Users of previous nightly builds should note:

  • The realtime.newui configuration option has been removed
  • The application will automatically use the new Svelte 5 interface
  • All previous functionality remains available through the new UI

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 6 months ago

BirdNET-Go - Nightly Build nightly-20251214

🚀 Major Features & Enhancements

Configurable False Positive Filter Levels (#1476, #1560, #1477)

  • Problem: Hidden detection filtering tied to overlap settings caused user confusion and unexpected behavior
  • Root Cause: Users didn't know overlap controlled both analysis frequency AND false positive filtering
  • Solution: Explicit 6-level filtering system that users can see, understand, and control
  • Filter Levels:
    Level Name Confirmations Use Case
    0 Off 1 Default - No filtering, accepts first detection
    1 Lenient ~2 Low-quality audio (surveillance cameras, cheap mics)
    2 Moderate ~3 Balanced filtering for most setups
    3 Balanced ~4 Standard filtering with good confidence
    4 Strict ~5 High-confidence environments
    5 Maximum ~6+ Maximum accuracy requirements
  • Configuration: realtime.falsepositivefilter.level: 0 in config.yaml
  • UI: New False Positive Filter settings section with level selector
  • Impact: Resolves user complaints about "BirdNET-Go detecting less than expected"

Push Notification Settings UI (#1557, #1558)

  • Feature: Full frontend settings UI for configuring push notification providers
  • Implementation:
    • Provider configuration panel in settings
    • Support for Shoutrrr URLs and custom scripts
    • Filter configuration for notification routing
    • Test notification functionality
  • Template Variables (#1485) - Community Contribution by @cameronr:
    • Added DetectionID for building custom URLs
    • Added DetectionPath for webhook integrations
    • Useful when server is behind a proxy and needs custom URL construction
  • Impact: Push notifications now fully configurable via web UI (previously config file only)

Thanks to @cameronr for the template variable additions!

Spectrogram Generation Modes (#1403, #1407, #1410, #1422)

  • Pre-rendering (#1403, #1407): Background spectrogram generation immediately after audio is saved
    • Feeds PCM data directly to Sox (bypasses FFmpeg) in low-priority worker pool
    • Configurable via UI toggle in settings
    • ⚠️ Increases disk usage (~55 KB per detection)
  • User-Requested Mode (#1410): For resource-constrained systems (Raspberry Pi, etc.)
    • Only generates spectrograms when user views detection
    • Reduces CPU/disk usage for systems with limited resources
  • FFmpeg 7.x Optimization (#1345): Improved spectrogram generation for newer FFmpeg versions
  • Backend Scalability (#1422): Architecture improvements for handling high detection volumes
  • Code Consolidation (#1408): Eliminated duplicate spectrogram generation code
  • Three Modes Available:
    Mode Description Use Case
    Pre-rendered Generate immediately Fast UI, more disk
    On-demand Generate when viewed Balanced (default)
    User-requested Only on explicit request Resource-constrained

Local eBird Taxonomy Database (#1442)

  • Problem: Runtime eBird API dependency for genus/family lookups caused latency and required API keys
  • Solution: Embedded local taxonomy database with 2,374 genera, 254 families, 11,145 species
  • Performance: 500x faster response times (<1ms vs 200-500ms)
  • New Endpoints:
    • GET /api/v2/taxonomy/genus/:genus - All species in genus
    • GET /api/v2/taxonomy/family/:family - All species in family
    • GET /api/v2/taxonomy/tree/:scientific_name - Complete taxonomic tree
  • Hybrid Mode: Local taxonomy + eBird API fallback for subspecies/locale data
  • No API Key Required: Core taxonomy features work offline
  • Impact: Eliminates runtime API dependency, improves reliability and performance

Improved macOS/Darwin Support (#1523, #1543, #1545, #1546) - Community Contribution by @HurleySk

  • Resource Monitoring (#1523): macOS-specific implementations for filesystem, inode, disk, and memory stats
  • Realtime Audio (#1543): macOS support for air realtime and audio devices
  • Build System (#1545, #1546): Lint task with TensorFlow CGO flags, Air config for v1.63+ compatibility
  • Impact: Enhanced macOS development and runtime support

Special thanks to @HurleySk for improving macOS support!

Dynamic Threshold Persistence (#1383, #1384, #1395, #1495)

  • Problem: Learned detection thresholds lost on application restart, causing detection drops
  • Solution: Database persistence layer with automatic save/load
  • Implementation:
    • New dynamic_thresholds table with comprehensive metadata
    • Periodic persistence every 30 seconds via background worker
    • Automatic cleanup of expired thresholds every 24 hours
    • Graceful shutdown with 15s flush timeout for slow storage (SD cards)
  • Priority Fix (#1495): Custom species thresholds now properly override dynamic thresholds
  • Impact: Thresholds survive restarts - no more sudden detection drops

Dashboard Redesign (#1548, #1553)

  • Detection Cards (#1548): Modern card-based layout with spectrogram backgrounds
    • Integrated audio playback with circular progress indicator
    • Context menu for review, visibility toggle, lock/unlock, download, delete
    • Color-coded confidence badges and weather display
    • Bird thumbnail popup on hover
  • Audio Controls (#1553): Advanced playback features
    • Playhead position indicator moving across spectrogram
    • Click-to-seek and drag-to-seek on spectrogram
    • Web Audio API with gain (-20 to +24 dB) and high-pass filter (20-5000 Hz)
    • Per-card audio settings (not shared between cards)
  • Daily Summary: CSS grid layout, daylight visualization, species badges, heatmap legend
  • Accessibility: Full ARIA support and keyboard navigation
  • i18n: Complete translations across all 8 languages

Settings Page Redesign (#1536)

  • Tabbed Interface: All settings pages reorganized with tab-based navigation
  • New Components:
    Component Purpose
    SettingsTabs Reusable tabs with change indicators and lazy rendering
    StreamManager Audio stream management with real-time health monitoring
    StreamCard Individual stream status with controls
    StatusPill Visual status indicator badges
    EmptyState Consistent empty state display
  • Stream Health: Real-time SSE monitoring with visual status indicators
  • Accessibility: Full keyboard navigation (Arrow, Home, End) and ARIA compliance
  • Code Reduction: ~1,600 lines removed through better component reuse

Audio BandReject (Notch) Filter (#1556)

  • Feature: New BandReject filter type for audio equalizer
  • Use Case: Remove specific frequency bands (electrical hum, interference)
  • Implementation:
    • DSP utility module with biquad filter calculations (Audio EQ Cookbook)
    • Width (bandwidth) parameter for precise notch control
    • Frequency response graph properly displays deep notches
  • Testing: 43 unit tests for DSP utilities

API v2 Completion (#1563, #1564)

  • Audio Streaming (#1563):
    • GET /api/v2/streams/audio-level - Real-time audio level SSE
    • HLS streaming endpoints for live audio via FFmpeg
    • Automatic source anonymization for unauthenticated clients
  • Migration (#1564): All remaining v1 endpoints migrated to v2
  • Features: Rate limiting, duplicate connection prevention, 30-minute max duration
  • Impact: Complete v2 API with full feature parity

New Language Support (#1480, #1481)

  • 🇳🇱 Dutch (Nederlands) (#1480): Complete translation coverage
  • 🇵🇱 Polish (Polski) (#1481): Complete translation coverage
  • Total Languages: Now supporting 8 languages (EN, DE, FR, ES, FI, PT, NL, PL)

SIMD-Accelerated Audio Processing (#1526)

  • Performance: ~5.5x speedup for RMS calculations (18,700 → 102,800 MB/s)
  • New Functions: SumOfSquaresFloat64, CalculateRMSFloat64, ClampFloat64, PCM16 conversions
  • SIMD Statistics: Min, Max, Sum, Mean with automatic scalar fallback
  • Impact: Faster audio processing on supported hardware

🐛 Bug Fixes & Performance Improvements

Hemisphere-Aware Season Calculation (#1323)

  • Problem: Southern hemisphere users saw "fall" when it should show "spring"
  • Root Cause: Season calculation hardcoded for northern hemisphere
  • Solution: Automatic hemisphere detection from latitude (>10° = North, <-10° = South)
  • Features: Auto-config updates on save, backward compatible with custom configs
  • Impact: Correct seasonal tracking for users worldwide

Unique Species Limit Fix (#1367)

  • Problem: Analytics Overview capped at 100 unique species
  • Root Cause: Hardcoded limit: '100' parameter in API request
  • Solution: Removed artificial limit - backend already has proper timeout/protection
  • Impact: Users now see true species counts (e.g., 163 instead of 100)

Notification History Persistence (#1445)

  • Problem: Duplicate "new species" notifications after restarts
  • Root Cause: Notification suppression state stored only in memory
  • Solution: New notification_histories database table persists suppression state
  • Impact: No more duplicate alerts for recently-seen species after restart

Zombie Process Prevention (#1368)

  • Problem: FFmpeg/SoX processes left running during spectrogram generation
  • Solution: Proper process cleanup with timeout handling
  • Impact: No more orphaned processes consuming resources

Disk Manager Improvements (#1296, #1307, #1394)

  • Memory Optimization (#1296): Reduced memory usage and allocations
  • Race Condition Fix (#1307): Proper handling of temp file race conditions during walk
  • Scanning Optimization (#1394): Reduced unnecessary file scanning in cleanup

Race Condition Fixes

  • GetSpeciesSummaryData (#1338): Transaction isolation prevents data inconsistency
  • Daily Range Filter (#1369): Prevents race in daily range filter updates
  • Notification Broadcast (#1535): Clone notifications to prevent concurrent modification

Database Fixes

  • MySQL Analytics (#1326): Resolved syntax error in datetime queries
  • NULL Species Codes (#1333): Handle NULL values in analytics queries
  • Disk Space Validation (#1437): Startup validation prevents silent failures
  • Threshold Persistence (#1395): Optimized to eliminate database locks

URL Encoding Fix (#1508) - Community Contribution by @oskari

  • Problem: Cities with special characters (umlauts, accents) failed geocoding
  • Solution: URI-encode city/country inputs before lookups
  • Impact: "Piikkiö, Finland" and similar locations now work correctly

Thanks to @oskari for this fix!

Frontend Fixes - Community Contributions by @HurleySk

  • Review Detection API (#1520): Corrected endpoint path
  • Mobile Scrolling (#1521): Detection detail tabs now scrollable on mobile
  • Spectrogram Duration (#1522): Always provide duration parameter to Sox
  • Spectrogram Container (#1310): Improved alignment and loading states
  • DatePicker (#1313): Better i18n, types, and accessibility
  • Tab Visibility (#1444): Fixed tab content visibility in DetectionDetail

Thanks to @HurleySk for these improvements!

Other Bug Fixes

  • Daily Summary Sorting (#1309): Improved grid sorting stability
  • Sticky Date Selection (#1312): Hybrid persistence for date picker
  • Form Validation (#1332): Removed validation from support dump fields
  • BirdNET Model Paths (#1405): Allow clearing paths to revert to defaults
  • Settings API (#1406): Enable main and security settings updates
  • SSE Blocking (#1420): Prevent slow clients from blocking other connections
  • FlushDeadline (#1432): Decoupled from backdated startTime
  • Spectrogram Mode Default (#1439): Added missing default and validation
  • HTMX UI (#1440): Restored spectrogram generation in legacy UI
  • Auth Compatibility (#1552): Skip username check when ClientID empty for V1 compat
  • BirdWeather DNS (#1401): Improved DNS timeout handling for multi-server environments
  • Spectrogram Logger (#1360): Prevent nil pointer panic

🏗️ Infrastructure & Developer Experience

Frontend Modernization

  • Tailwind CSS v4 (#1532, #1533, #1537):
    • Upgraded from 3.4.17 to 4.1.17
    • Removed DaisyUI dependency in favor of native Tailwind
    • CSS-based configuration (no more tailwind.config.js)
    • Autoprefixer now built-in
  • Lucide Icons (#1528): Migrated from custom SVG icons to @lucide/svelte
  • SelectDropdown Component (#1561): Unified dropdown implementation
  • Active Species Tab (#1562): New Species Settings tab for active species management

Docker & Container Improvements

  • Debian 13 Trixie (#1340): Upgraded base images
  • Timezone Support (#1419): Added tzdata-legacy for Trixie compatibility
  • Error Visibility (#1475): Improved error messages for disk space and startup failures

Testing & Quality

  • Mockery (#1446): Automated mock generation for unit tests
  • Testify Migration (#1426): Replaced gomock with testify/mock for consistency
  • Contributing Guide (#1424): Comprehensive guide with automated dev setup
  • Frontend Dev Mode (#1534): Faster iteration during development
  • Vitest Optimization (#1559): Faster test runs
  • Linter Zero-Error Policy (#1350, #1493): All linter errors resolved

Build & Tooling

  • Node.js 24 (#1311): Upgraded from v20 across build environments
  • FFmpeg Version Detection (#1343): Runtime decisions based on FFmpeg version
  • Telemetry Diagnostics (#1400, #1478): Enhanced for service startup failures, AVX2 optional

Documentation (#1327) - Community Contribution by @Maarc

  • Fixed typos in issue templates and VM documentation
  • Standardized qcow2 format documentation

Thanks to @Maarc for the documentation improvements!

Dependency Updates

  • github.com/getsentry/sentry-go: 0.36.1 → 0.40.0
  • google.golang.org/api: 0.253.0 → 0.257.0
  • gorm.io/gorm: 1.30.3 → 1.31.1
  • golang.org/x/crypto: 0.42.0 → 0.45.0
  • golang.org/x/sys: 0.36.0 → 0.38.0
  • github.com/nicholas-fedor/shoutrrr: 0.11.0 → 0.13.0
  • github.com/spf13/cobra: 1.10.1 → 1.10.2
  • Plus many other security and feature updates

🎯 Developer Notes

This release represents 47 days of development with significant improvements across detection filtering, UI/UX, platform support, and performance. The configurable false positive filter (#1476) addresses long-standing user confusion about detection sensitivity, making the system more transparent and controllable.

The frontend modernization (Tailwind v4, dashboard redesign, settings tabs) delivers a polished user experience, while the spectrogram generation modes provide flexibility for different hardware capabilities.

Community Highlights: Special recognition to:

  • @cameronr for push notification template variables
  • @HurleySk for macOS improvements and multiple frontend fixes
  • @oskari for the URL encoding fix
  • @Maarc for documentation improvements

Key improvements since nightly-20251028:

  • False positive filter - User-configurable 6-level detection filtering
  • Push notification UI - Full settings interface for notification providers
  • Spectrogram modes - Pre-rendered, on-demand, or user-requested generation
  • Local taxonomy - 500x faster species lookups without API dependency
  • macOS improvements - Enhanced Darwin platform support
  • Dynamic thresholds - Persist across restarts, custom overrides work properly
  • Dashboard redesign - Modern card-based UI with advanced audio controls
  • Settings redesign - Tabbed interface with stream health monitoring
  • 8 languages - Added Dutch and Polish support
  • SIMD acceleration - 5.5x faster audio processing
  • API v2 complete - All endpoints migrated with full feature parity

These improvements strengthen BirdNET-Go's foundation for real-time bird monitoring while providing a more intuitive and responsive user experience.


Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20251028...nightly-20251214

Contributors: Special thanks to @cameronr (Cameron Ring), @HurleySk, @oskari, and @Maarc for their valuable contributions to this release!

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 6 months ago

BirdNET-Go - Nightly Build 20251028

Logging System Panic Resolution (#1468) - Community Contribution by @d0ugal

  • Problem: Application crashes on startup with panic: interface conversion: interface {} is int64, not slog.Level
  • Root Cause: Using reserved slog key "level" as an attribute name in threshold persistence logging
  • Reserved Keys in Go slog: time, level, msg, source are automatically treated as log metadata, not regular attributes
  • Impact:
    • Startup failures on systems using dynamic threshold persistence (introduced in nightly-20251026)
    • Panic occurred during threshold loading when logging used "level" attribute conflicting with slog.LevelKey
  • Solution: Two-part fix for robustness
    • Changed attribute key from "level" to "threshold_level" in threshold persistence logging
    • Added safety check in defaultReplaceAttr to gracefully handle type mismatches instead of panicking
  • Testing: Comprehensive test coverage with 48 test cases verifying the fix and preventing regression
  • Impact: Restores stable startup for all users, prevents future panics from accidental use of reserved keys

Special thanks to @d0ugal (Dougal Matthews) for identifying the root cause and providing a complete fix with thorough testing!


🚀 Major Features & Enhancements

Interactive Notification System (#1447) - Community Contribution by @cameronr

  • Feature: Notification cards now clickable, navigating directly to detection details
  • Implementation:
    • Detection notifications link to specific detection detail pages
    • Keyboard accessibility support (Enter/Space keys)
    • Dynamic visual styling indicates interactive notifications
    • Event propagation handling prevents accidental activation during mark-as-read/delete actions
  • User Experience: Single click/tap from notification to full detection details with spectrogram, weather, and metadata
  • Accessibility: Full keyboard navigation support with ARIA attributes
  • Testing: Includes test notification generation with proper detection links

Special thanks to @cameronr (Cameron Ring) for this excellent UX improvement!

Detection Metadata Exposure for Notifications (#1458)

  • Feature: Advanced webhook template customization with 8 new metadata fields
  • Available Fields (all with bg_ prefix):
    • bg_detection_url - Direct link to detection details page
    • bg_image_url - Direct link to spectrogram image
    • bg_confidence_percent - Formatted confidence percentage (e.g., "95")
    • bg_detection_time - Formatted time of detection
    • bg_detection_date - Formatted date of detection
    • bg_latitude - GPS latitude (float64, 0.0 if unavailable)
    • bg_longitude - GPS longitude (float64, 0.0 if unavailable)
  • Use Cases:
    • Conditional GPS coordinates in webhooks: {{if ne .Metadata.bg_latitude 0.0}}
    • Confidence-based filtering in notification templates
    • Rich Discord embeds with clickable links and images
    • Location-aware notifications for mobile integrations
  • Privacy Features:
    • UI warning panel when using external webhooks with GPS data
    • RFC-compliant localhost/private IP detection (IPv4 RFC 1918, IPv6 RFC 4193)
    • Startup warnings when localhost + external webhooks configured
    • Comprehensive privacy documentation in WEBHOOK.md
  • Documentation: Complete webhook guide with template safety, type handling, and privacy considerations
  • Testing: 40+ test cases covering private network detection, GPS handling, and metadata validation
  • Impact: Enables sophisticated notification customization while maintaining user privacy awareness

Internationalization Validation System (#1464)

  • Problem: Translation coverage drift and missing translation keys causing runtime errors
  • Solution: Automated validation infrastructure with two complementary validators
  • Translation File Validator:
    • Validates completeness across all 6 supported languages (EN, DE, FR, ES, FI, PT)
    • ICU MessageFormat syntax validation
    • Parameter consistency checking
    • Detects empty values and untranslated strings
    • LLM-friendly JSON output for automated fixes
  • Usage Validator:
    • Scans codebase for t() translation usage
    • Finds missing translations (keys used but not defined)
    • Finds unused translations (dead keys)
    • Prevents runtime errors from missing keys
  • Features:
    • Fast execution (< 500ms complete validation)
    • GitHub Actions CI/CD integration with PR comments
    • 11 new npm scripts for validation workflows
    • Comprehensive 400+ line documentation
    • ast-grep patterns for future advanced validation
  • NPM Scripts:
    • npm run i18n:validate - Validate translation files
    • npm run i18n:check-usage - Check code usage
    • npm run i18n:validate:full - Complete validation
    • npm run i18n:find-unused - Find dead keys
  • CI/CD Integration: Automatic validation on PRs with detailed reports and artifact uploads
  • Impact: Prevents translation-related runtime errors, enables confident i18n development

🐛 Bug Fixes & Performance Improvements

Complete i18n Translation Coverage (#1466)

  • Achievement: 100% translation coverage across all 6 supported languages
  • Fixes Applied:
    • 22 missing translation keys added to en.json (keys used in code but not defined)
    • 819 missing translations added across all non-English locales
    • 10 ICU syntax errors resolved (placeholder keys excluded from validation)
    • 12 parameter mismatch errors fixed (improved ICU parser integration)
    • 52 outdated keys removed (cleanup of old OAuth, Weather Underground, test sections)
  • Language Coverage (before → after):
    • 🇩🇪 German (DE): 90.12% → 100% (+126 translations)
    • 🇫🇷 French (FR): 90.69% → 100% (+123 translations)
    • 🇪🇸 Spanish (ES): 88.30% → 100% (+148 translations)
    • 🇫🇮 Finnish (FI): 88.71% → 100% (+149 translations)
    • 🇧🇷 Portuguese (PT): 87.40% → 100% (+273 translations)
  • Translation Quality:
    • Consistent terminology within each language
    • Preserved technical terms appropriately (CPU, API, MQTT)
    • Proper grammar, punctuation, and accents
    • Descriptive ARIA labels for accessibility
  • Validator Improvements:
    • Skip ICU validation for placeholder keys (contain Go template syntax examples)
    • Fixed parameter extraction using ICU parser AST instead of regex
    • Better error messages with proper categorization
  • Impact: All UI elements now fully translated, no more missing translation warnings

Sentry Error Title Generation (#1463)

  • Problem: Runtime panics appeared in Sentry with uninformative titles like runtime.errorString: runtime error: invalid memory address or nil pointer dereference
  • Root Cause: CaptureError() used fmt.Sprintf("%T", err) which only returns Go type name
  • Solution: Intelligent error title parsing with three new functions
  • Error Type Recognition (10+ patterns):
    • Nil pointer dereference
    • Index/slice out of range
    • Integer divide by zero
    • Send/close on closed channel
    • Concurrent map access/writes
    • Interface conversion failures
    • Generic panics with message extraction
  • Component Formatting: Automatic component name beautification
    • httpcontrollerHTTP Controller
    • media_handlerMedia Handler
    • Handles abbreviations (HTTP, RTSP, MQTT, API, DB)
  • Examples (Before → After):
    • runtime.errorString: runtime error: invalid memory address or nil pointer dereference
    • Media: Nil Pointer Dereference
    • runtime.errorString: panic: Handler.ServeHTTP panic
    • HTTP Controller: Panic: Handler.ServeHTTP panic
    • runtime.errorString: concurrent map writes
    • API Handler: Concurrent Map Write
  • Features:
    • Added error_title tag for filtering in Sentry
    • Custom fingerprints for improved error grouping
    • Automatic title generation for all future panics
  • Testing: 48 test cases covering all error patterns, component formatting, and real-world examples
  • Impact: Clearer error identification, better grouping, more efficient debugging

Notification Metadata Consistency (#1461)

  • Problem: Webhook templates using {{.bg_detection_url}} or {{.bg_image_url}} worked for real detections but failed during API test button usage
  • Root Cause: Duplicate metadata enrichment code in two locations with different implementations
    • Real detections: Added all 8 bg_* metadata fields
    • Test button: Only added basic metadata fields
  • Solution: Created EnrichWithTemplateData() helper function
  • Benefits:
    • Single source of truth for metadata enrichment
    • Test notifications now identical to real detections
    • Future metadata additions easier (change in one place)
    • Follows DRY (Don't Repeat Yourself) principles
  • Features:
    • Handles nil inputs gracefully
    • Maintains fluent API pattern
    • Well-documented with comprehensive godoc
    • Comprehensive unit tests for edge cases
  • Impact: Test button now accurately represents real notification behavior

🏗️ Infrastructure & Developer Experience

Dependency Updates

  • github.com/getsentry/sentry-go: 0.36.0 → 0.36.1 (#1452)
  • github.com/getsentry/sentry-go/echo: 0.36.0 → 0.36.1 (#1451)
  • github.com/pkg/sftp: 1.13.9 → 1.13.10 (#1450)
  • google.golang.org/api: 0.252.0 → 0.253.0 (#1449)
  • github.com/nicholas-fedor/shoutrrr: 0.10.3 → 0.11.0 (#1448)
  • Dependency license updates (#1453)

🎯 Developer Notes

This release focuses on stability, internationalization, and notification system enhancements. PR #1468 fixes a critical startup panic introduced in nightly-20251026, while the i18n work (#1464, #1466) brings translation coverage to 100% across all languages.

The notification improvements (#1447, #1458, #1461) provide a significantly enhanced user experience with clickable notifications, advanced webhook customization, and robust privacy controls - all while maintaining backward compatibility.

Community Highlights: Special recognition to @d0ugal and @cameronr for their excellent contributions! The logging panic fix and interactive notifications both significantly improve the user experience.

Key improvements since nightly-20251026:

  • Logging panic fix - Restores stable startup for all users
  • 100% translation coverage - Complete i18n for all 6 languages
  • Interactive notifications - Click to navigate to detection details
  • Advanced webhook metadata - 8 new template fields with privacy controls
  • Automated i18n validation - Prevents future translation drift
  • Better error reporting - Meaningful Sentry error titles for faster debugging
  • Notification consistency - Test notifications now match production behavior

These improvements strengthen the foundation for international users, enhance the notification system, and provide better observability for debugging production issues.


Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20251026...nightly-20251028

Contributors: Special thanks to @d0ugal (Dougal Matthews) and @cameronr (Cameron Ring) for their valuable contributions to this release!

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 8 months ago

BirdNET-Go - Nightly Build 20251026

Critical Bug Fix

HTMX UI Spectrogram Rendering (#1440) addresses a breaking issue in the old HTMX-based user interface introduced during the recent spectrogram generation consolidation. The handler was passing relative paths instead of absolute paths required by the security validation layer, and generating decorated spectrograms instead of raw ones expected by the UI. A focused fix ensures absolute path conversion and correct spectrogram type selection, restoring proper on-demand spectrogram generation for legacy UI users.

Major Features

Notification History Persistence (#1445) prevents duplicate "new species" notifications after application restarts by persisting suppression state to the database. Previously, the in-memory notification tracking was lost on restart, causing users to receive duplicate alerts for recently detected species. The solution introduces a notification_histories table with automatic migration, asynchronous persistence, and periodic cleanup of expired records.

Bug Fixes & Performance

Notable improvements include:

  • Frontend tab content visibility fixes ensuring ARIA relationships work correctly in DetectionDetail view (#1444)
  • Spectrogram error log level adjustments reducing noise from expected operational events
  • Startup disk space validation preventing silent failures when insufficient storage is available
  • Logging strategy improvements for better troubleshooting capabilities
  • Spectrogram mode configuration default values and validation enhancements
  • Sentry error title clarity improvements by removing redundant type prefixes

Infrastructure

The release includes test infrastructure improvements with mockery integration for automated mock generation and enhanced DDoS protection test coverage with caching validation.

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 8 months ago

BirdNET-Go - Nightly Build 20251025

🚨 Critical Bug Fix - Detection Logic

Detection Rate Restoration (BG-16) (#1432) - MAJOR PRIORITY

  • Problem: 19+ confirmed users reported zero or near-zero bird detections since September 14, 2025
  • GitHub Issues: Closes #1314 (6 users, Sept 20), Closes #1359 (13+ users, Oct 8)
  • Root Cause: FlushDeadline calculated in the past, causing immediate flush before overlap-based false positive filtering could accumulate confirmations
    • With default settings (15s capture, 3s pre-capture, overlap 2.2):
    • FlushDeadline = (Now - 13s) + 12s = Now - 1s (already in the past!)
    • Result: Detections flushed immediately with count=1, needed=2 → "matched 1/2 times" → REJECTED
  • User Impact:
    • "20-30 different birds daily, until after the last nightly and then nothing"
    • "Cardinals and Blue Jays stopped being detected even though making plenty of noise"
    • Users forced to disable overlap (flooding with false positives) or increase capture length to 60s
  • Solution: One-line fix - decouple FlushDeadline from backdated startTime
    • Changed: FlushDeadline: time.Now().Add(detectionWindow) instead of using backdated item.StartTime
    • Result: FlushDeadline = Now + 12s (in future) → Wait 12 seconds → ~15 overlapping analyses → Count = 3-4, needs 2 → APPROVED ✓
  • Impact: Restores normal detection rates for all users on default settings

If you experienced low or zero detections, please update immediately and revert overlap to 2.2-2.5


🚀 Major Features & Enhancements

Spectrogram Generation System Overhaul (PR Series #1403, #1407, #1408, #1410, #1422)

A comprehensive series of improvements to address UI lag and resource constraints:

Spectrogram Pre-Rendering (#1403)

  • Problem: UI freezes when loading spectrograms on-demand
  • Solution: Automatic background generation of spectrograms after detections
  • Features:
    • Background worker pool with 2 concurrent generators
    • Queue-based processing with priority (new detections first)
    • Configurable modes: auto/prerender (default), manual (user-requested only), off
    • Deduplication prevents redundant generation
  • Impact: Eliminates UI lag when browsing detections

UI Settings Toggle (#1407)

  • Feature: User-facing toggle in Settings → Output → Spectrograms
  • Options: Auto Pre-Render, User Requested Only, Disabled
  • Help Text: Explains CPU/memory vs. UX trade-offs

Code Deduplication (#1408)

  • Refactor: Eliminated duplicate spectrogram generation code across codebase
  • Impact: Single source of truth, easier maintenance

User-Requested Mode for Resource-Constrained Systems (#1410)

  • Problem: Pre-rendering too resource-intensive for Raspberry Pi and low-power devices
  • Solution: Manual generation mode triggered only when user views detection
  • Configuration:
    • Config: output.spectrogram.generation_mode: "manual"
    • Modes: auto (background), manual (on-demand), off (disabled)
  • Impact: Allows users to control CPU/memory usage vs. UX trade-off

Backend Scalability Improvements (BG-13) (#1422)

  • Enhancement: Async generation with non-blocking HTTP 503 responses
  • Features:
    • Check if spectrogram exists first (fast path)
    • If exists: serve immediately
    • If not exists: trigger async generation, return HTTP 503
    • Frontend retries with exponential backoff
  • Impact: Multiple browsers no longer block on same spectrogram generation

Dynamic Threshold Persistence (#1383)

  • Problem: Dynamic thresholds lost on application restart, requiring re-learning
  • Solution: Persist thresholds to database with automatic restore
  • Features:
    • species_thresholds table with species_code/confidence/updated_at
    • Automatic load on startup
    • Background save with 5-minute interval
    • Graceful shutdown persistence
  • Database Changes: ALTER TABLE species_thresholds ADD COLUMN confidence REAL
  • Impact: Consistent detection accuracy across restarts

🐛 Bug Fixes & Performance Improvements

SSE Connection Management (#1420)

  • Problem: Slow clients blocked other SSE connections, causing UI freezes
  • Root Cause: Shared broadcast channel blocked on slow consumers
  • Solution: Per-client buffered channels with timeout-based eviction
  • Features:
    • 100-message buffer per client
    • 10-second write timeout
    • Automatic cleanup on timeout or disconnect
    • Graceful degradation (slow clients dropped, not all blocked)
  • Impact: SSE streams remain responsive even with slow/disconnected clients

Database Lock Elimination (#1395)

  • Problem: Dynamic threshold persistence caused SQLite database locks and "database is locked" errors
  • Root Cause: Long-running transaction held lock during batch updates
  • Solution:
    • Changed from single transaction to individual transactions per species
    • Immediate commit after each UPDATE
    • Reduced lock duration from seconds to milliseconds
  • Impact: No more database lock errors, concurrent operations work smoothly

Disk Manager Optimization (#1394)

  • Problem: Unnecessary file scanning during cleanup caused performance issues
  • Solution: Optimized file walking logic to reduce allocations
  • Impact: Reduced memory usage and faster cleanup operations

BirdWeather DNS Timeout Handling (#1401)

  • Problem: DNS resolution failures on multi-server environments
  • Solution: Improved timeout handling with fallback and retry logic
  • Impact: More reliable BirdWeather uploads in diverse network environments

Debian Trixie Timezone Support (#1419)

  • Problem: Missing timezone data on Debian 13 Trixie causing startup failures
  • Solution: Add tzdata-legacy package to Docker images
  • Impact: Timezone support works out of the box on Debian Trixie

Settings API Updates (#1405, #1406)

  • Fix #1405: Allow clearing BirdNET model/label paths to revert to defaults
  • Fix #1406: Enable main and security settings updates through API
  • Impact: Full configuration management via API

Installation Enhancements (#1400)

  • Telemetry Diagnostics: Enhanced logging and error reporting
  • AVX2 Optional: Made AVX2 detection non-blocking for wider compatibility
  • Impact: Smoother installation experience on diverse hardware

🎨 Frontend Improvements

Audio Player Debug Logging (#1428)

  • Feature: Add debug logging for multi-session troubleshooting
  • Impact: Better diagnostics when investigating audio playback issues

🏗️ Infrastructure & Developer Experience

Contributing Guide (#1424)

  • Feature: Comprehensive guide with automated dev setup
  • Tools: Taskfile automation, devcontainer support
  • Impact: Faster onboarding for new contributors

Dependency Updates

  • golang.org/x/time: 0.13.0 → 0.14.0 (#1415)
  • google.golang.org/api: 0.251.0 → 0.252.0 (#1413)
  • github.com/getsentry/sentry-go: 0.35.3 → 0.36.0 (#1412)
  • github.com/getsentry/sentry-go/echo: 0.35.2 → 0.36.0 (#1411)
  • github.com/nicholas-fedor/shoutrrr: 0.10.1 → 0.10.3 (#1414)
  • golang.org/x/sys: 0.36.0 → 0.37.0 (#1390)
  • golang.org/x/net: 0.44.0 → 0.46.0 (#1387)
  • golang.org/x/crypto: 0.42.0 → 0.43.0 (#1386)
  • vite: 7.1.5 → 7.1.11 (#1423)
  • playwright: latest (#1421)
  • Dependency license updates (#1392, #1417, #1427)

🎯 Developer Notes

This release prioritizes detection accuracy restoration and spectrogram performance. PR #1432 fixes a critical 41-day bug that affected default configurations, restoring normal detection rates for 19+ confirmed users (likely many more unreported).

The spectrogram generation overhaul (#1403, #1407, #1408, #1410, #1422) provides a flexible system for balancing UI responsiveness with resource constraints - essential for users on Raspberry Pi and low-power devices.

Key improvements since nightly-20251012:

  • Detection logic fix (BG-16) - Restores normal detection rates for default configurations
  • Async spectrogram generation - Prevents UI blocking on multiple concurrent requests
  • Configurable generation modes - Users control CPU/memory vs. UX trade-off
  • Dynamic threshold persistence - Consistent detection accuracy across restarts
  • SSE connection isolation - Slow clients no longer block other connections
  • Database lock elimination - Concurrent operations work smoothly

These improvements make the system more reliable, performant, and easier to operate in production environments.


Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20251012...nightly-20251025

Contributors: Special thanks to all contributors who helped identify, test, and resolve these issues.

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 8 months ago

BirdNET-Go - Nightly Build 20251012

🚀 Major Features & Enhancements

RTSP Stream Health Monitoring with Real-Time SSE (#1382)

  • Feature: Comprehensive API endpoints for monitoring RTSP stream health status
  • REST Endpoints (authenticated):
    • GET /api/v2/streams/health - Detailed health status of all streams
    • GET /api/v2/streams/health/:url - Stream-specific health status
    • GET /api/v2/streams/status - High-level summary with healthy/unhealthy counts
  • SSE Streaming (authenticated):
    • GET /api/v2/streams/health/stream - Real-time push updates via Server-Sent Events
    • 10 distinct event types (stream_added, state_change, health_recovered, error_detected, etc.)
    • Rate limit: 5 connections/minute per IP
    • Intelligent change detection with 1-second polling
    • 30-second heartbeat, 30-minute max duration per connection
  • Data Provided:
    • Process state tracking (idle, starting, running, restarting, backoff, circuit_open, stopped)
    • Error diagnostics with troubleshooting steps
    • Error history (last 10 errors per stream)
    • State transition history
    • Data flow metrics (bytes received, bytes/second)
    • Restart counts and timestamps
  • Security: URL credentials automatically sanitized, authentication required
  • Impact: Real-time visibility into stream health for monitoring dashboards and integrations

FFmpeg Stream Reliability Improvements (PR Series #1372, #1374, #1375, #1376, #1377)

A comprehensive series of improvements to address RTSP stream stability issues (#1264):

Process State Machine (#1372)

  • Problem: Difficult to debug RTSP stream issues - unclear what state FFmpeg processes are in
  • Solution: Implemented explicit state machine with 7 distinct states:
    • StateIdle - Stream created but not started
    • StateStarting - FFmpeg process starting
    • StateRunning - Process running and processing audio
    • StateRestarting - Restart requested
    • StateBackoff - Exponential backoff before retry
    • StateCircuitOpen - Circuit breaker cooldown
    • StateStopped - Permanently stopped
  • Features:
    • Thread-safe state transitions with logging
    • State transition history (bounded to 100 entries)
    • State visible in logs and health checks
    • Simplified IsRestarting() logic (20 lines → 12 lines)
  • Impact: Better debugging and monitoring capabilities, clearer visibility into stream lifecycle

RTSP Transport Change Detection (#1374)

  • Problem: Changing RTSP transport (TCP ↔ UDP) in config didn't affect running streams
  • Solution: Automatic detection and restart of streams when transport changes
  • Features:
    • Compares stream transport against configuration
    • Automatic stop/restart with new transport
    • Clean state transitions via state machine
    • Clear logging: "🔄 Transport changed for rtsp://... tcp → udp (restarting)"
  • Impact: Configuration changes take effect immediately without manual intervention

lastDataTime Reset and Zero Time Handling (#1375)

  • Problem: Confusing "inactive for 0 seconds" log messages for streams that never received data
  • Root Cause: lastDataTime not properly reset when starting new FFmpeg process
  • Solution:
    • Explicit reset of lastDataTime to zero time in processAudio()
    • Reset totalBytesReceived for clean state
    • Enhanced zero time logging: "never received data" instead of "0 seconds ago"
    • Improved silence detection logging with process runtime context
  • Testing: Comprehensive test coverage with race detector
  • Impact: Clear distinction between "never" and "X seconds ago" in logs

Stream Watchdog for Automatic Recovery (#1376)

  • Problem: Streams could get stuck in unhealthy states indefinitely
  • Solution: Automatic watchdog that detects and force-resets stuck streams
  • Configuration:
    • 15-minute threshold for force reset
    • 5-minute check interval
    • 30-second stop/start delay
    • Cooldown period to prevent thrashing
  • Features:
    • Defensive stream removal if stop fails
    • Full reset cycle: Stop → force-remove if needed → cleanup delay → StartStream
    • Clear logging with 🚨 emoji for easy identification
    • Complements existing health checks (handles long-term stuck states)
  • Impact: Automatic recovery from prolonged unhealthy states without manual intervention

Better Context Cancellation Diagnostics (#1377)

  • Enhancement: Using Go 1.20+ context.WithCancelCause for better diagnostics
  • Features:
    • Meaningful cancellation causes logged
    • Specific error messages about why contexts were cancelled
    • Improved troubleshooting for unexpected shutdowns
    • Clean code with reduced cyclomatic complexity
  • Impact: Easier debugging in production environments

🐛 Critical Bug Fixes & Performance Improvements

Notification URL Generation for Reverse Proxies (#1366)

  • Problem: Users behind reverse proxies (nginx, Cloudflare Tunnel) got notification URLs with localhost:8080 instead of their public hostname
  • Root Cause: security.host config was empty, BuildBaseURL defaulted to localhost
  • Solution: Hybrid host resolution strategy with priority chain:
    1. security.host config (explicit user setting)
    2. BIRDNET_HOST environment variable (Docker/container-friendly) ⭐ NEW
    3. localhost fallback (with warning log)
  • Configuration Options:
    • Config file: security.host: "birdnet.home.arpa"
    • Environment variable: BIRDNET_HOST=birdnet.home.arpa
    • Docker: -e BIRDNET_HOST=birdnet.home.arpa
  • Testing: 40+ test cases covering real-world scenarios, edge cases, and priority resolution
  • Impact: Correct notification URLs for all deployment scenarios

Analytics Unique Species Count Capped at 100 (#1367)

  • Problem: Analytics Overview showed maximum of 100 unique species, causing user confusion when Species page showed actual count (e.g., 163)
  • Root Cause: Hardcoded limit: '100' parameter in fetchSummaryData() API request
  • Solution: Removed hardcoded limit, let backend handle full dataset
  • Why Safe:
    • Backend has 30-second query timeout
    • Small data volume (163 species ≈ 8 KB JSON)
    • Frontend only displays count, not rendering all items
    • Species page already fetches all without issues
  • Impact: Accurate unique species count across all pages

Spectrogram Generation Nil Pointer Panic (#1360)

  • Problem: Nil pointer dereference panic in spectrogram generation when logger was nil
  • Root Cause: spectrogramLogger could be nil in edge cases during initialization or when file logger creation failed
  • Solution:
    • Added safe logger accessor: getSpectrogramLogger() with fallback to slog.Default()
    • Enhanced init() fallback chain: file logger → default logger → stdout logger
    • Added nil checks throughout logger calls
  • Impact: Reliable spectrogram generation without crashes

Zombie FFmpeg/SoX Processes on Raspberry Pi (#1368)

  • Problem: Zombie processes accumulated on Raspberry Pi during spectrogram generation, causing failures after first 5 recordings
  • Root Causes:
    • Missing Wait() after Kill() - killed SoX but didn't wait for exit
    • No timeout on Wait() - could block indefinitely on hung processes
    • Incomplete cleanup on error paths
  • Solution:
    • New helper functions: waitWithTimeout() and waitWithTimeoutErr() with 5-second timeout
    • Deferred cleanup ensures Wait() is ALWAYS called after Kill()
    • Enhanced logging with process PID and lifecycle tracking
    • Go 1.23+ optimizations with CommandContext
  • Impact: Unlimited spectrogram generations without zombie process accumulation on resource-constrained devices

Range Filter Daily Update Race Condition (#1369)

  • Problem: Species detected outside configured range filter list
  • Root Cause: Multiple concurrent goroutines could trigger daily range filter updates simultaneously, causing species list to flip-flop
  • Solution:
    • Added atomic ShouldUpdateRangeFilterToday() function with mutex
    • Only first goroutine on any given day returns true
    • Immediately updates LastUpdated to prevent duplicate updates
    • Enhanced logging and error handling
  • Testing: 100 concurrent goroutines verified with race detector
  • Impact: Consistent species filtering with exactly one range filter update per day

📚 Documentation & Developer Experience

  • Notification URL Configuration Guide (#1366): Setup methods, reverse-proxy guidance, examples, and troubleshooting
  • Stream Health API Documentation (#1382): Comprehensive guides with example requests/responses, error context details, state semantics, and integration tips

🎯 Developer Notes

This release focuses on RTSP stream reliability and monitoring capabilities. The FFmpeg improvements series (#1372, #1374, #1375, #1376, #1377) provides a solid foundation for diagnosing and automatically recovering from stream issues that users have reported in #1264. The new health monitoring API (#1382) enables real-time monitoring dashboards and integrations.

Key architectural improvements include:

  • Explicit state machine tracking for clear visibility into stream lifecycle
  • Automatic watchdog recovery for long-term stuck states
  • Better context cancellation diagnostics for production debugging
  • Real-time health monitoring via SSE for external integrations

These improvements make the system more observable, reliable, and easier to troubleshoot in production environments.


Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20251008...nightly-20251012

Contributors: Special thanks to all contributors who helped identify, test, and resolve these issues.

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 8 months ago

BirdNET-Go - Nightly Build 20251008

🚀 Major Features & Improvements

Customizable Notification Templates (#1356) 🌟 Community Contribution by @cameronr

  • Notification Settings UI: Full-featured settings page for editing, saving, and resetting templates
  • Template-Driven Content: Configurable placeholders for new species notifications
  • Detection Links: Server-rendered templates with clickable detection links (requires server address in settings)
  • URL Sanitization: URLs automatically stripped from in-app notifications (bell icon, toast, notification list)
  • Test Functionality: Send test "new species" notifications directly from settings
  • Multi-Language Support: Complete translations (en, de, es, fi, fr, pt)
  • Navigation Integration: Added to sidebar and settings menu
  • Impact: Fully customizable notification content for different notification channels

🔧 Bug Fixes & Reliability

Notification Package Improvements (#1350, #1351, #1349)

  • Linter Clean: All golangci-lint errors resolved for zero-error policy (#1350)
  • Goroutine Leak Fixed: Proper cleanup in toast filter tests (#1351)
  • Architectural Enhancements: Multiple improvements from code review (#1349)
    • Bounded dispatch concurrency with semaphore-based limiting
    • Exponential backoff with jitter for retries
    • Enriched filter metrics with specific rejection reasons
    • Optimized health check locking to reduce contention

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20251007...nightly-20251008

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 8 months ago

BirdNET-Go - Nightly Build 20251007

🚀 Major Features & Improvements

Push Notification System (#1336, #1348, #1349, #1352, #1353, #1354) 🌟 Community Contribution by @cameronr

  • Production-Ready Infrastructure: Complete push notification system with Shoutrrr, webhooks, and script providers
  • Advanced Reliability: Circuit breakers, health checks, metrics, and rate limiting for DoS protection
  • Comprehensive Telemetry: Privacy-first Sentry integration with 15 Prometheus metrics for observability
  • Webhook Provider: Multi-endpoint failover, flexible auth (Bearer/Basic/custom headers), templated JSON payloads
  • Secure Token Management: Environment variables, file-based secrets (Docker/Kubernetes), runtime resolution
  • Multi-Layer DoS Protection: Circuit breakers + rate limiting + retry backoff + timeout protection
  • Maintained Fork Migration: Updated from deprecated containrrr/shoutrrr to actively maintained nicholas-fedor/shoutrrr
  • Impact: Enterprise-grade notification delivery with full operational visibility and automatic failure recovery

Go 1.25 Modernization (#1292, #1289, #1291, #1294, #1295)

  • Enhanced Test Organization: T.Attr() metadata for better CI filtering and debugging across test suite
  • Modern WaitGroup Patterns: sync.WaitGroup.Go() for cleaner goroutine management
  • API v2 Test Improvements: Leverages Go 1.25 features with comprehensive test coverage
  • Devcontainer Upgrade: Go 1.25.1 with TensorFlow dependencies
  • myaudio Tests: Modernized with Go 1.25 features, fixed test timeouts
  • Documentation: Comprehensive Go 1.25 testing features and upgrade infrastructure guide
  • Impact: Improved test reliability, maintainability, and developer experience with latest Go features

Audio Capture Enhancements (#1268, #1269)

  • Dynamic Capture Length: User-configurable 10-60 seconds (replaces fixed 15-second)
  • Pre-Capture Timing: Configurable 0 to 1/2 of capture length for better detection coverage
  • Audio Gain Adjustment: -40 to +40 dB using FFmpeg volume filter
  • EBU R128 Normalization: Professional loudness normalization (target LUFS, loudness range, true peak)
  • Professional UI Controls: Capture length slider, gain slider, normalization controls with progressive disclosure
  • Real-Time Validation: Dynamic pre-capture validation prevents misconfiguration
  • Impact: Flexible audio processing tailored to various recording environments and bird species

Dashboard User Experience (#1312)

  • Sticky Date Selection: Smart 30-minute date retention using hybrid URL + localStorage
  • Priority Logic: URL parameters → Recent localStorage → Current date fallback
  • Browser Navigation: Proper support for back/forward buttons with date persistence
  • Configurable Retention: 15-30 minute retention period (30 minutes default)
  • Impact: Seamless dashboard navigation without constantly re-selecting dates

Podman Support (#1248)

  • Complete Parallel Support: Full Podman configuration alongside existing Docker functionality
  • Docker-to-Podman Migration: Automatic conflict detection, graceful service transition, data preservation
  • Rootless Container Support: Enhanced security with rootless Podman containers
  • Multi-Platform: Tested on Fedora, Ubuntu, Debian, RHEL family
  • Backward Compatible: Existing Docker configurations continue working unchanged
  • Impact: Modern container runtime options with enhanced security for advanced users

FFmpeg Version Detection (#1343, #1345)

  • Runtime Version Detection: Automatic FFmpeg version detection for intelligent feature decisions
  • Spectrogram Optimization: Eliminates unnecessary ffprobe calls on FFmpeg 7.x+
  • Bug Workaround: Handles FFmpeg 5.x duration metadata bug automatically
  • Zero User Impact: All optimizations happen transparently based on detected version
  • Impact: Improved performance and reliability across different FFmpeg versions

Hemisphere-Aware Seasonal Tracking (#1323)

  • Smart Hemisphere Detection: Automatic detection from latitude coordinates
  • Correct Seasonal Display: Proper "spring" for southern hemisphere users (previously showed "fall")
  • Generalized Year-Crossing: Handles any season starting in previous year
  • No Configuration Required: Eliminates manual config file editing workaround
  • Impact: Accurate seasonal bird tracking for users worldwide

Docker Base Image Upgrade (#1340)

  • Debian 13 Trixie: Upgraded from Debian 12 Bookworm to latest stable Debian 13
  • Security Updates: Latest system packages and security fixes
  • Multi-Platform Verified: linux/amd64 and linux/arm64 tested
  • Go 1.25.1 Maintained: Consistent Go build environment
  • Impact: Latest security patches and improved platform compatibility

🔧 Bug Fixes & Reliability

Critical Bug Fixes (#1350, #1351, #1341, #1307, #1338, #1344)

  • Linter Zero-Error Policy: All golangci-lint errors resolved with improved maintainability (#1350)
  • Goroutine Leak Fixed: Toast filter tests now properly clean up goroutines (#1351)
  • MinDetections Accuracy: Removed incorrect detection window scaling from minDetections calculation (#1341)
  • Temp File Race Conditions: Properly handle temp file race conditions during disk walk (#1307)
  • Transaction Isolation: Add isolation to GetSpeciesSummaryData to prevent race conditions (#1338)
  • Install Script Cleanup: Clean up parent directory when empty after data removal (#1344)

MQTT Improvements (#1287, #1288, #1229, #1241)

  • Reconnection Cooldown: Resolved automatic reconnection cooldown conflict (#1287)
  • Node Name in Messages: Added node name to sound level MQTT messages (#1288)
  • Occurrence Values: Fixed missing occurrence values in MQTT messages (#1229)
  • EOF Error Handling: Improved disconnect timeout handling to prevent EOF errors (#1241)

Database & Query Fixes (#1226, #1326, #1333, #1242, #1309)

  • Column Mismatch: Removed non-existent source_safe column from search query (#1226)
  • MySQL Syntax: Resolved MySQL syntax error in analytics datetime queries (#1326)
  • NULL Handling: Handle NULL species_code values in analytics queries (#1333)
  • Timestamp Race Condition: Resolved race condition in species summary endpoint (#1242)
  • Grid Sorting: Improved daily summary grid sorting stability (#1309)

Frontend Fixes (#1313, #1310, #1332, #1290, #1219, #1225)

  • DatePicker Improvements: Enhanced i18n, types, and accessibility (#1313)
  • Spectrogram Alignment: Fixed container alignment and loading states (#1310)
  • Form Validation: Removed form validation from support dump fields (#1332)
  • iOS Safari Playback: Fixed audio playback through Cloudflare on iOS Safari (#1290)
  • Timezone Bugs: Resolved timezone bugs in date string parsing across frontend (#1219)
  • Cache Busting: Version-based cache busting for Svelte assets (#1225)

OAuth & Settings (#1195, #1194, #1193)

  • OAuth Callback Fix: Resolved callback URL mismatch causing 404 errors with dual-route support (#1195)
  • Security Settings API: Enable security settings updates via API (#1194)
  • Node Name & Time Format: Allow updates via web UI (fixes persistent settings bug) (#1193)

RTSP & Audio (#1257, #1222)

  • Ampersands in RTSP URLs: Allow ampersands in RTSP URL query parameters (#1257)
  • URL Parsing: Removed strict RTSP URL parsing to prevent regression (#1222)

Species Tracking (#1205, #1201, #1293)

  • Winter Season Bug: Resolved winter season adjustment bug in species tracking (#1205)
  • Config Persistence: Resolve zero value omission in species configuration (#1201)
  • Package Refactoring: Moved species tracker to dedicated package for better organization (#1293)

Testing & Reliability (#1217, #1238, #1285)

  • Imageprovider Tests: Resolved test timeout and goroutine leaks (#1217)
  • Wikipedia API: Improved logging and fixed Wikipedia API issues (#1238)
  • Disk Manager: Ignore .temp files during directory walk (#1285)

Memory & Performance (#1296)

  • Disk Manager Optimization: Optimized memory usage and reduced allocations (#1296)

📦 Installation & Support Improvements

Install Script Enhancements (#1224, #1228, #1247)

  • Version Management: Comprehensive version management and rollback system
  • Port Validation: Checks all required ports (80, 443, 8080, 8090) before installation
  • Process Identification: Shows which processes are using occupied ports with actionable error messages
  • GitHub Issue Requirement: Mandatory GitHub issue number for support uploads
  • Support Bundle Diagnostics: Comprehensive diagnostic collection including journal logs, file logs, config/system collection

Cockpit Integration (#1243)

  • Optional Installation: Cockpit web-based management as final installation step
  • Smart Status Tracking: Tracks user choice to avoid repeated prompts
  • Existing Installation Detection: Detects if Cockpit already installed
  • Impact: Easy system management option for users preferring web-based admin tools

Spectrogram Improvements (#1277, #1310, #1345)

  • Generation Resiliency: Improved spectrogram generation reliability (#1277)
  • Container Alignment: Fixed alignment and loading states (#1310)
  • FFmpeg 7.x Optimization: Optimized generation for FFmpeg 7.x+ (#1345)

Wikipedia Provider (#1240)

  • Circuit Breaker: Enhanced with circuit breaker and lazy initialization
  • Reliability: Improved failure handling and recovery
  • Impact: More reliable species image and information retrieval

Context Propagation (#1334)

  • Analytics Functions: Added context propagation to datastore analytics functions
  • Better Cancellation: Improved request cancellation and timeout handling
  • Impact: More responsive analytics queries with proper timeout handling

📦 Dependencies & Maintenance

Node.js Upgrade (#1311)

  • Upgraded from Node.js v20 to v24 across all build environments
  • Modern JavaScript features and improved performance
  • Enhanced security with latest LTS version

Go Dependencies (#1276 + multiple Dependabot PRs)

  • Updated to latest versions of all major dependencies
  • github.com/stretchr/testify v1.10.0 → v1.11.1
  • google.golang.org/api v0.247.0 → v0.251.0
  • github.com/markbates/goth v1.81.0 → v1.82.0
  • github.com/eclipse/paho.mqtt.golang v1.5.0 → v1.5.1
  • github.com/getsentry/sentry-go v0.35.1 → v0.35.3
  • golang.org/x/net v0.43.0 → v0.44.0
  • golang.org/x/sync v0.16.0 → v0.17.0
  • golang.org/x/time v0.12.0 → v0.13.0
  • gorm.io/gorm v1.30.1 → v1.31.0
  • go.uber.org/mock v0.5.2 → v0.6.0

Frontend Dependencies (#1280, #1324)

  • vite v7.0.6 → v7.1.5
  • tar-fs v3.1.0 → v3.1.1 (security update)

License Documentation (#1216, #1256, #1275, #1286, #1322, #1331, #1346, #1251, #1337)

  • Multiple dependency license documentation updates
  • Automated AUTHORS file updates

Documentation (#1327) 🌟 Community Contribution by @Maarc

  • Minor typo fixes in documentation

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250825...nightly-20251007

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 8 months ago

BirdNET-Go - Nightly Build 20250904

Fix: Allow ampersand in RTSP URLs https://github.com/tphakala/birdnet-go/pull/1257

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 9 months ago

BirdNET-Go - Nightly Build 20250831

Nightly Build 20250831

🔧 Critical Bug Fixes & Performance Improvements

Enhanced Support Bundle Diagnostic Collection (#1247)

  • Problem: Support bundles often contained empty logs with no troubleshooting information
  • Root Cause: Log collection failed silently without capturing why it failed
  • Solution: Implemented comprehensive diagnostic collection that continues even when logs fail
  • Features:
    • Detailed tracking for journal logs, file logs, config/system collection
    • Path diagnostics showing existence, accessibility, and file counts
    • Journal collection details with commands, exit codes, and stderr output
    • Always creates collection_diagnostics.json for troubleshooting
  • Impact: Support bundles now always provide diagnostic information, enabling effective remote troubleshooting

Audio Processing Buffer Optimization

  • Problem: Audio analysis and capture had potential buffer underruns
  • Solution: Increased buffer sizes for both audio analysis and capture pipelines
  • Impact: More reliable audio processing with reduced chance of dropped samples

Wikipedia Image Provider Circuit Breaker (#1240)

  • Problem: API rate limiting and blocks caused continuous hammering of Wikipedia servers
  • Root Cause: No backoff mechanism when rate limited or blocked
  • Solution:
    • Implemented circuit breaker pattern with adaptive timeouts (60s for rate limits, 5-10min for blocks)
    • Added lazy initialization to prevent startup race conditions
    • Replaced mwclient with direct HTTP for proper User-Agent control
  • Impact: Respects Wikipedia API guidelines and prevents service degradation

BirdImageCache Race Condition Resolution

  • Problem: Cache refresh could cause race conditions during concurrent access
  • Solution: Improved cache refresh handling with proper synchronization
  • Impact: Eliminates potential crashes or data corruption during image cache updates

MQTT Connection Stability (#1241, #1229)

  • Issues Fixed:
    • EOF errors during disconnect timeout handling
    • Missing occurrence values in MQTT messages
    • Short timeout connection failures
  • Solution: Enhanced error handling, proper disconnect timeout management, and complete message payload validation
  • Impact: Reliable MQTT connectivity for Home Assistant and other integrations

🚀 Installation & Deployment Enhancements

Install Script Versioning & Rollback System (#1224)

  • Features:
    • Version-based installation with rollback capability
    • Enhanced location and timezone detection
    • Optional Cockpit web console integration (#1243)
    • Improved usage options and help documentation
  • Impact: Safer installations with ability to recover from failed updates

Support Upload Requirements (#1228)

  • Change: Support bundle uploads now require mandatory GitHub issue number
  • Purpose: Better tracking and correlation of support requests with reported issues
  • Impact: Improved support workflow and issue resolution tracking

📚 Documentation & Developer Experience

Custom BirdNET Classifier Training Guide

  • Addition: Comprehensive guide for training custom classifiers (e.g., dog bark detection)
  • Includes: Prerequisites, folder structure, audio preparation, configuration settings
  • Visual Aids: Waveform and spectrogram examples for better understanding
  • Impact: Empowers users to create custom sound detection models beyond birds

🐛 Additional Bug Fixes

  • Log Processing Priority: Added priority levels to error contexts for better categorization
  • Database Search Query: Fixed non-existent source_safe column reference (#1226)
  • Timestamp Race Condition: Resolved race condition in species summary endpoint (#1242)
  • Frontend Timezone Parsing: Fixed timezone bugs in date string parsing (#1219)
  • Frontend Cache Busting: Implemented version-based cache busting for Svelte assets (#1225)
  • RTSP URL Parsing: Removed strict parsing to prevent regression (#1222)

🎯 Developer Notes

This release focuses on stability improvements and enhanced diagnostics capabilities. The support bundle enhancements and MQTT fixes address critical issues reported by the community. The addition of custom classifier training documentation opens new possibilities for specialized sound detection applications beyond bird identification.


Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250826...nightly-20250831

Contributors: Special thanks to all contributors who helped identify, test, and resolve these issues.

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 10 months ago

BirdNET-Go - Nightly Build 20250826

🔧 Critical Bug Fixes

MQTT Messages Missing Occurrence Values (#1229)

  • Problem: MQTT messages weren't including occurrence probability values due to invalid JSON tag and missing calculation
  • Root Cause: Invalid omitzero JSON tag and processor not calculating occurrence values during detection creation
  • Solution: Fixed JSON tag to omitempty and added GetSpeciesOccurrenceAtTime method with on-demand calculation
  • Impact: MQTT messages now properly include time-aware species occurrence probabilities (0.0-1.0) for better rarity-based alerting
  • Test Evidence: Comprehensive tests confirm occurrence values appear correctly in MQTT payloads

RTSP URL Parsing Regression Fix (#1222)

  • Problem: Fixed critical regression introduced in #1161 where RTSP URLs with complex passwords containing special characters (like colons) would fail validation despite working perfectly with FFmpeg
  • Root Cause: Audio Source Registry refactor introduced strict Go url.Parse() validation that broke existing working configurations
  • Solution: Replaced strict URL parsing with basic string validation that maintains security while preserving compatibility
  • Impact: Existing RTSP configurations with complex passwords now work again without requiring password changes
  • Affected Users: Anyone using RTSP streams with passwords containing special characters like :, (, ), =, etc.

Database Search Query Fix (#1226)

  • Problem: Search functionality failed with "no such column: notes.source_safe" error on new installations
  • Root Cause: Search query was trying to SELECT a non-existent database column that was never stored due to gorm:"-" tag
  • Solution: Removed non-existent notes.source_safe from SELECT query and cleaned up unused fields
  • Impact: Search functionality now works correctly on fresh installations without database errors

Frontend Timezone Bug Resolution (#1219) 🌟 Collaborative effort with @farski

  • Problem: Widespread timezone-related date parsing bugs causing YYYY-MM-DD date strings to shift to different days due to UTC conversion issues
  • Root Cause: Direct use of new Date(dateString) with YYYY-MM-DD format strings, which JavaScript interprets as midnight UTC, causing timezone boundary problems
  • Key Insight: Issue correctly identified by @farski who explained JavaScript's YYYY-MM-DD parsing behavior
  • Solution: Updated all date formatting functions to use parseLocalDateString() which parses dates at noon local time
  • Comprehensive Coverage: Fixed 14 files across components, analytics pages, dashboard, and utilities with 112+ tests
  • Impact: Consistent date behavior across all timezones - no more date shifting in analytics, date pickers, CSV exports, or charts

🚀 Major Features & Performance Improvements

Version-Based Cache Busting for Svelte Assets (#1225)

  • Smart Cache Management: Implements ETag headers using version-buildDate format for automatic browser cache invalidation
  • Deployment Optimization: Ensures users get fresh assets immediately on new deployments while maintaining efficient caching
  • Technical Approach: Uses version-based ETags instead of file hashing to maintain compatibility with embedded Go filesystem
  • Cache Policy: 1-hour cache with must-revalidate + ETag validation for optimal performance
  • Impact: Eliminates stale asset issues while maintaining fast load times and reducing server bandwidth

Comprehensive Version Management & Rollback System in Install Script (#1224)

  • Advanced Logging Infrastructure: Timestamped log files (install-YYYYMMDD-HHMMSS.log) with comprehensive system state tracking
  • Complete Version History: Captures Docker image hashes and config backups before every upgrade with SHA256 integrity checking
  • Interactive Rollback System: Full revert functionality accessible from all installation menus with optional config restoration
  • Privacy-Safe Logging: Detailed system monitoring while excluding sensitive information (coordinates, passwords, RTSP credentials)
  • Security Enhancements: Uses mktemp for secure temp files, restrictive permissions, and proper cleanup traps
  • System Monitoring: Comprehensive tracking of disk space, memory, Docker states, network connectivity, and service status
  • Impact: Safe upgrades with confidence - full rollback capability and detailed troubleshooting information

🚀 Installation & Deployment Improvements

Enhanced Location & Timezone Detection in Install Script

  • Improved IP Geolocation: Enhanced get_ip_location function now includes timezone information when using ipapi.co fallback service
  • Smart Timezone Configuration: Prioritizes location-based timezone detection with better user context during confirmation prompts
  • Input Validation: Enhanced user input handling with normalization and validation against available system timezones
  • User Experience: Location configuration now displays detected timezone information for better user awareness
  • Port Validation: Refactored port configuration logic to validate all required ports upfront, preventing installation failures
  • Impact: Significantly smoother installation process with more accurate location/timezone detection and fewer configuration errors

🎯 Developer Notes

This release focused on critical bug fixes affecting core functionality (MQTT messages, RTSP parsing, search queries, timezone handling) and major infrastructure improvements for deployment reliability. The timezone fixes represent a collaborative community effort with significant testing coverage.


Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250825...nightly-20250826

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 10 months ago

BirdNET-Go - Nightly Build 20250825

🚀 Major Features & Improvements

Bird Detection Occurrence Probability included in MQTT messages (#1199)

  • Species Rarity Scoring: Adds 0-1 occurrence probability to all bird detections
  • Smart Alerting Foundation: Enables nuanced notifications based on species rarity at specific locations
  • MQTT Integration: Occurrence data automatically included in MQTT payloads
  • Performance Optimized: Cached species scores lookup with graceful fallbacks
  • Impact: More intelligent detection prioritization based on actual species probability

CSV Export for Range Filter Species (#1207)

  • Data Export: Download complete species lists from range filter settings
  • Multi-Access Points: Export from both main settings page and modal dialogs
  • Custom Parameters: Support for latitude, longitude, and threshold customization via query strings
  • Metadata Headers: CSV includes location, threshold, and timestamp information
  • Impact: Enables offline analysis and data sharing with other birding tools

End-to-End Testing Foundation with Playwright (#1202)

  • Cross-Browser Testing: Chrome, Firefox, Safari, and mobile device support
  • Page Object Models: Reusable dashboard interaction patterns
  • CI/CD Integration: GitHub Actions ready with comprehensive test reporting
  • Foundation for Quality: Smoke tests for dashboard and authentication workflows
  • Impact: Target 70% reduction in user-reported bugs through systematic integration testing

Smart Notification Management (#1178)

  • Duplicate Prevention: Eliminates spam from repeated "new species" notifications
  • Configurable Suppression: 7-day default window (0-30 days configurable)
  • Memory Efficient: Automatic cleanup of old notification records
  • Thread Safe: Robust concurrent operation handling
  • Impact: Cleaner notification experience without losing important alerts

🔧 Bug Fixes & Reliability

Critical Bug Fixes & System Stability (#1208, #1217, #1195, #1194, #1193, #1205, #1201, #1188)

  • Species Tracker Reliability: Fixed 8 critical bugs with comprehensive testing, achieving 41% test coverage
  • OAuth Authentication: Resolved callback URL mismatches causing 404 errors with dual-route support
  • Settings Persistence: Fixed web UI inability to save node names, time formats, and security settings
  • Test Infrastructure: Eliminated imageprovider test timeouts and goroutine leaks with proper cleanup
  • Species Config Persistence: Resolved zero value omission in species configuration
  • Notification Optimization: Lowered priority of timeout errors to reduce alert noise

🐳 Docker & Deployment Revolution

Decoupled BirdNET Models from Binary (#1191, #1190, #1189, #1187)

  • Separated Model Files: BirdNET models now separate from birdnet-go binary in Docker images
  • Reduced Update Downloads: Only download binary changes when updating - models stay cached
  • NoEmbed Build Option: Optional builds without embedded models for maximum size reduction
  • Automatic Model Discovery: Smart detection of BirdNET models in standard paths without configuration
  • Environment Variable Support: Custom model paths via BIRDNET_MODELPATH
  • Backward Compatibility: Existing Docker configurations continue working unchanged
  • Impact: Dramatically faster Docker updates and reduced bandwidth usage for frequent deployments

Install Script Improvements (#1181)

  • Comprehensive Port Validation: Checks all required ports (80, 443, 8080, 8090) before installation
  • Process Identification: Shows which processes are using occupied ports
  • Actionable Error Messages: Provides specific stop commands for common web servers
  • Multi-Tool Compatibility: Uses ss, lsof, netstat, and nc for maximum system compatibility
  • Impact: Prevents installation failures due to port conflicts with clear remediation steps

📦 Dependencies & Maintenance

Security & Compatibility Updates (#1216, #1186, #1213, #1212, #1211, #1210, #1185)

  • Updated dependency licenses documentation (multiple updates)
  • github.com/stretchr/testify v1.10.0 → v1.11.0
  • google.golang.org/api v0.247.0 → v0.248.0
  • github.com/markbates/goth v1.81.0 → v1.82.0
  • go.uber.org/mock v0.5.2 → v0.6.0
  • github.com/go-viper/mapstructure/v2 v2.3.0 → v2.4.0

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250811...nightly-20250825

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 10 months ago

BirdNET-Go - Nightly Build 20250813

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 10 months ago

BirdNET-Go - Nightly Build 20250811

Features & Improvements

Frontend/UI Enhancements

  • Comprehensive DatePicker enhancements and reactive date constraints (#1146)
  • Replaced manual notification count updates with Svelte 5 reactive patterns (#1144)
  • Comprehensive devcontainer improvements for modern development (#1143)
  • Integrated ast-grep for enhanced frontend static analysis (#1124)
  • Enhanced audio settings with improved controls and help text (#1102)

Analysis & Processing

  • Improved error handling (#1127, #1129, #1130, #1133)

System & Infrastructure

  • Added secure filesystem API for directory browsing (#1104)
  • Added SIGTERM signal handling for graceful shutdown (#1108)

Bug Fixes

Frontend

  • Extracted deduplication logic to shared utility (#1145)
  • Implemented comprehensive message deduplication for API and SSE (#1140)
  • Comprehensive frontend test suite improvements and reliability fixes (#1121)
  • Comprehensive settings edge case and validation testing (#1119)
  • Resolved TypeError when settings.config is null/undefined (#1118)
  • Prevented toast notifications from appearing in notification bell (#1117)
  • Resolved image loading and caching issues in detection views (#1105)
  • Added notification deduplication to NotificationBell component (#1100)

Backend

  • Implemented enhanced error handling in jobqueue (#1128)
  • Resolved RTSP JSON API configuration reload issues (#1126)
  • Aligned RTSP settings data structure between frontend and backend (#1122)
  • Resolved RTSP stream infinite restart loop (#1106)
  • Improved error message uniformity and deduplication (#1101)

Dependencies & Maintenance

  • Updated French translations to match en.json by @geekworldtour (#1141)
  • Updated dependency licenses (#1139, #1085)
  • Bumped golang.org/x/text from 0.27.0 to 0.28.0 (#1138)
  • Bumped golang.org/x/crypto from 0.40.0 to 0.41.0 (#1137)
  • Bumped golang.org/x/net from 0.42.0 to 0.43.0 (#1136)
  • Bumped google.golang.org/api from 0.244.0 to 0.246.0 (#1134)

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250805...nightly-20250811

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 10 months ago

BirdNET-Go - Nightly Build 20250805

Features & Improvements

Frontend/UI Enhancements

  • Complete User Interface settings page implementation with comprehensive tests (#1096)
  • Compact and consistent Species Configuration UI with portal dropdowns (#1095)
  • Added NewUI configuration option for UI redirect in dashboard (#1094)
  • Added sticky action bar for settings pages (#1091)
  • Replaced Leaflet with MapLibre GL JS and enhanced modal map functionality (#1090)
  • Upgraded Svelte UI to use npm-installed HLS.js (#1087)
  • Implemented single detection view with enhanced UX (#1086)
  • Optimized settings page layout and range filter UX (#1077)
  • Implemented comprehensive Svelte UI login security system (#1067)

Performance & UX

  • Eliminated spectrogram performance bottleneck and enhanced loading UX (#1064)
  • Enhanced datastore error handling with comprehensive categorization and telemetry integration (#1061)

Bug Fixes

Frontend

  • Prevented login redirect URL duplication (#1093)
  • Converted Svelte 5 binding patterns from bind: to one-way binding with comprehensive test coverage (#1092)
  • Resolved systematic frontend test failures (multiple phases: 46→36→23 test failures) (#1076, #1075, #1074, #1073)
  • Resolved frontend security linter warnings with comprehensive safety utilities (#1070)

Backend

  • Sanitized RTSP credentials in detection notifications for security (#1072)
  • Resolved image provider round-robin bug (#1068)

Dependencies & Maintenance

  • Updated dependency licenses (#1084)
  • Bumped github.com/prometheus/client_golang from 1.22.0 to 1.23.0 (#1083)
  • Bumped github.com/mattn/go-sqlite3 from 1.14.29 to 1.14.30 (#1081)
  • Bumped google.golang.org/api from 0.243.0 to 0.244.0 (#1080)
  • Bumped github.com/getsentry/sentry-go/echo from 0.34.1 to 0.35.0 (#1079)
  • Updated AUTHORS file (#1063)

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250731...nightly-20250805

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 10 months ago

BirdNET-Go - Nightly Build 20250731

Features & Improvements

Error Handling & Monitoring

  • Added explicit priority support to error system (#1060)
  • Enhanced database telemetry with resource monitoring (#1058)
  • Enhanced Windows resource monitoring with gopsutil integration

Frontend Improvements

  • Enhanced map interaction in MainSettingsPage with zoom controls
  • Implemented Phase 1 frontend quality infrastructure (#1055)
  • Improved frontend component testing and UI enhancements

Bug Fixes

Frontend

  • Resolved analytics charts disappearing when applying filters (#1059)
  • Replaced console statements with centralized logger utility (#1057)
  • Resolved final TypeScript linter errors (#1056)
  • Enforced strict TypeScript checking at build time (#1054)
  • Resolved dashboard LRU cache initialization error (#1053)

Backend

  • Fixed notification worker tests for medium priority error handling
  • Improved error messages in data rate calculation for RTSP source

Code Quality

  • Updated logger interface to support flexible argument handling
  • Updated SearchBox component styling for improved UI consistency
  • Cleaned up package configuration and removed unused dependencies

Build & Infrastructure

  • Updated Dockerfile to install Node.js v20
  • Improved directory creation logic in Taskfile.yml

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250730...nightly-20250731

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250730

🚀 Major Features & Improvements

Svelte 5 Dashboard Performance Revolution (#1048, #1040)

  • Progressive Loading Architecture: Eliminated loading spinners with optimized Svelte 5 patterns
  • Smart Rendering: Deferred non-critical component loading for instant initial page load
  • Memory Optimization: Reduced component re-renders and improved reactive state management
  • Zero-Spinner Experience: Seamless transitions without loading indicators
  • Impact: Dramatically faster dashboard loading and smoother user experience across all devices

Comprehensive Species Tracking System (#1037, #1020)

  • Seasonal Detection Badges: Visual indicators for first seasonal/yearly species detections
  • Historical Tracking: Automatic tracking of species firsts with database persistence

ReviewModal Complete Redesign (#1017)

  • Horizontal Layout: Modern side-by-side design with spectrogram on left, details on right
  • Enhanced Weather Display: Integrated weather data with visual indicators in review workflow
  • Responsive Design: Adapts seamlessly from mobile to desktop viewports
  • Improved Workflow: Streamlined review process with better visual hierarchy
  • Impact: Significantly improved review efficiency and user satisfaction

🔧 Infrastructure & Reliability

Critical Bug Fixes (#1046, #1044, #1039, #1038, #1032, #1033, #1019)

  • Disk Space Protection: Removed automatic diagnostic dumps preventing storage exhaustion
  • Docker Stability: Fixed zombie chown process issue in entrypoint script
  • Settings Integrity: Resolved data loss during settings updates with comprehensive test coverage
  • Timezone Accuracy: Fixed multiple timezone bugs affecting dashboard and search functionality
  • Range Filter Persistence: Coordinate updates now properly preserve range filter settings
  • Review Locking: Removed unnecessary temporary locking improving concurrent access
  • Impact: Significantly improved system stability and data integrity

📦 Dependencies & Maintenance

Security & Compatibility Updates (#1031, #1029, #1027, #1026, #1025, #992)

  • Updated frontend npm packages for security and performance
  • gorm v1.30.0 → v1.30.1
  • google.golang.org/api v0.240.0 → v0.243.0
  • go-sqlite3 v1.14.28 → v1.14.29
  • cpuid v2.2.11 → v2.3.0
  • Updated dependency licenses documentation

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250725...nightly-20250730

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250728

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250725

🚀 Major Features & Improvements

Enterprise-Grade Sound Level Monitoring with RTSP Support (#1008)

  • BREAKING: Full RTSP stream sound level monitoring support - no longer limited to sound card sources
  • Enterprise Safety Features: Automatic processor re-registration during FFmpeg crashes/restarts
  • Hot Reload Support: Dynamic enable/disable and configuration changes without application restart
  • Production-Ready Reliability: 30-second shutdown timeouts, graceful degradation for partial failures
  • Enhanced Error Handling: Comprehensive logging and structured error management
  • Impact: This transforms sound level monitoring from a basic feature into an enterprise-ready, fault-tolerant system suitable for mission-critical deployments

Complete Internationalization (i18n) Infrastructure (#999)

  • Comprehensive Language Support: 7 languages supported (English, German, Spanish, Finnish, French, Japanese, Portuguese)
  • 800+ Translation Keys: Complete coverage of all user-facing text across 40+ components
  • Zero Performance Impact: Lightweight custom implementation with type-safe translation keys
  • Auto-Detection: Browser language preference detection with localStorage persistence
  • Developer Experience: Auto-completion and compile-time validation of translation keys
  • Impact: Makes BirdNET-Go accessible to international users and provides foundation for global adoption

WCAG 2.1 Level AA Accessibility Compliance (#996)

  • Complete Accessibility: 17/17 accessibility tests passing with axe-core validation
  • Color Contrast Compliance: 11/11 contrast tests meeting 4.5:1 ratio requirements
  • Enhanced Navigation: Keyboard navigation, focus management, and screen reader compatibility
  • Automated Testing: Comprehensive accessibility testing framework preventing future regressions
  • Universal Design: Modal focus trapping, ARIA attributes, and semantic markup throughout
  • Impact: Ensures the application is usable by users with disabilities and meets modern accessibility standards

🌤️ Weather Data Enhancements

Advanced Weather Display with Dynamic Metrics (#1005, #1007)

  • Wind Gust Support: Display format "5(8)m/s" showing wind speed and gust strength
  • Unit Flexibility: Metric/imperial/standard unit support based on weather provider configuration
  • Dynamic Weather Icons: Temperature-responsive thermometer colors and animated wind indicators
  • Enhanced Detection UI: Weather data integrated into detections list with localized descriptions
  • Responsive Design: Weather metrics adapt to available display space
  • Impact: Provides comprehensive environmental context for bird detections, enhancing scientific value of observations

🎯 User Experience Improvements

Customizable Results Display (#1001)

  • Flexible Pagination: Dropdown selector with 10/25/50/100 results per page options
  • Smooth Transitions: Client-side pagination eliminates page flickering
  • Browser Navigation: Full back/forward button support with URL synchronization
  • Consistent Defaults: 25 results default across all detection views
  • Impact: Gives users control over data density and improves navigation experience

Enhanced UI Polish (#1006, #1004, #1002)

  • Layout Improvements: Updated RecentDetectionsCard with better spacing and translations
  • French Localization: Updated translations for improved French language support (thanks @geekworldtour!)
  • UI Cleanup: Minor improvements and consistency fixes across components
  • Impact: Provides more polished, professional user interface with better international support

🔧 Infrastructure & Code Quality

Icon System Centralization (#994)

  • Maintainability: Centralized inline SVG icons for improved code organization
  • Accessibility: All icons properly marked as decorative with aria-hidden attributes
  • Consistency: Standardized icon usage patterns across components
  • Impact: Reduces technical debt and improves long-term maintainability

Testing & Quality Improvements (#1009, #995, #993)

  • API v2 Stability: Fixed test failures due to improper SunCalc initialization
  • Code Review Compliance: Addressed frontend code quality issues
  • Integration Testing: Improved test reliability with proper content-type headers
  • Impact: Enhances development workflow reliability and prevents production issues

🙏 Community Contributors

  • @geekworldtour for French translation improvements

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250722...nightly-20250725

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250724

Fixed Docker build, this is same as 20250722 but actually updated Docker images

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250722

🚀 Major Features & Improvements

Modern Svelte 5 UI Implementation (#981)

  • Complete rewrite of the user interface using Svelte 5
  • Available for testing at /ui/ path - approximately 90% feature complete with the legacy UI
  • All new functionality will be built on the Svelte UI from this point forward
  • Enhanced settings management with improved user experience
  • Modern reactive architecture with better performance and maintainability
  • Comprehensive integration testing for the new UI components

🔧 Bug Fixes & Improvements

FFmpeg Process Management

  • Fix FFmpeg zombie process accumulation (#980)
    • Resolved resource leaks in audio processing pipeline
    • Improved system stability during long-running operations
    • Enhanced cleanup of child processes

Test Infrastructure

  • Fix required JSON body for BirdWeather integration tests (#993)
    • Resolved failing integration tests with proper content-type headers
    • Improved test reliability for API endpoint validation

Dependencies

  • Update dependency licenses and AUTHORS file (#991, #832, #840)
  • Dependency updates: Sentry Go SDK, golang.org/x/net, SQLite driver (#955, #957, #958, #890)

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250718...nightly-20250722

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250718

🚀 Major Features & Improvements

Support Bundle Management

  • Allow support bundle uploads without telemetry enabled (#975)
    • Users can now share diagnostic data without enabling continuous error tracking
    • Minimal Sentry initialization for support uploads only
    • Enhanced debug logging throughout support bundle generation
    • Fixed journal log collection timeout on systems with extensive logs
    • Improved privacy-first approach with opt-in uploads

Internationalization

  • Update of 150 missing translations (#969) - @geekworldtour
    • Enhanced multi-language support
    • Improved user experience for non-English speakers

🔧 Bug Fixes & Improvements

Test Reliability

  • Fix hanging tests in internal/api/v2 (#974)

    • Replaced time.Sleep with deterministic synchronization
    • Improved test reliability and execution speed
  • Fix race conditions across multiple packages (#936, #937, #938, #940)

    • Resolved concurrent access issues in myaudio, security, jobqueue, and imageprovider
    • Enhanced thread safety with proper mutex usage
    • Improved test stability under race conditions

Code Quality

  • Major code refactoring to address linter issues (#970, #971, #973)

    • Eliminated code duplication across the codebase
    • Consolidated duplicated test patterns
    • Improved code maintainability and readability
  • Enhanced error handling (#944, #945, #947)

    • Replaced nilnil returns with sentinel errors
    • Improved error context and diagnostics
    • Better error propagation throughout the codebase
  • Reduced cyclomatic complexity (#948)

    • Simplified complex functions in API and test code
    • Improved code readability and maintainability

Security

  • Resolve gosec security issues in backup package (#943)
    • Fixed potential security vulnerabilities
    • Enhanced secure file handling

UI/UX Improvements

  • Fix notification deletion not working in UI (#950)
    • Restored functionality for removing notifications
    • Improved user interface responsiveness

Testing

  • Update birdweather tests to use FLAC format (#968)

    • Fixed compatibility issues with audio format testing
    • Improved test coverage for audio processing
  • Add t.Helper() calls to test helper functions (#949)

    • Better test failure diagnostics
    • Clearer error reporting in test output

Event System

  • Fix flaky tests in internal/events package (#939)
    • Improved event system reliability
    • Better test synchronization

👥 Contributors

Special thanks to our community contributors:

  • @geekworldtour - Translation updates

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250710...nightly-20250718

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250710

🚀 Major Features & Improvements

RTSP Stream Management

  • Add intelligent FFmpeg timeout management for RTSP streams (#917)
    • Automatic 10-second socket timeout for better connection reliability
    • Smart detection of user-provided timeout parameters
    • Graceful fallback with validation for custom timeout values
    • Enhanced connection failure detection and recovery

Stream Health & Monitoring

  • Fix FFmpeg health monitor restart count tracking (#915)
    • Proper restart count increment and tracking
    • Improved health monitoring accuracy
    • Better circuit breaker functionality

🔧 Bug Fixes & Improvements

Security & Privacy

  • Consolidate RTSP URL sanitization in privacy package (#916)
    • Centralized credential masking for logs
    • Enhanced privacy protection across all RTSP operations
    • Consistent sanitization in error messages and telemetry

Configuration

  • Add configurable RTSP parameters support (#915)
    • Custom FFmpeg parameter injection via configuration
    • Flexible timeout and connection settings
    • Enhanced troubleshooting capabilities for problematic cameras

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250709...nightly-20250710

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250709

🚀 Major Features & Rewrites

Major fixes

  • Complete rewrite of FFmpeg stream management (#910)

Performance Optimizations

  • Optimize BirdNET prediction pipeline (#898)
  • Implement buffer pool for ReadFromAnalysisBuffer to reduce allocations (#899)
  • Add buffer pool for audio conversion (#900)
  • Prevent repeated capture buffer allocations (12.89% heap reduction) (#901)
  • Optimize pairLabelsAndConfidence to reduce memory allocations (#897)

Enhanced Logging & Monitoring

  • Enhanced FFmpeg structured logging with exit reason parsing (#909)
  • Connect metrics to datastore, weather, suncalc, disk manager, and BirdNET model (#902)

🔧 Bug Fixes & Improvements

  • Fix race condition in audio gain processor tests (#908)
  • Fix sound level processor registration for RTSP streams (#913)
  • Make sound level interval configurable with 5-second minimum (#914)

🧹 Code Cleanup

  • Remove obsolete capture buffer allocation tracking system (#912)

📦 Dependencies

  • Bump google.golang.org/api from 0.239.0 to 0.240.0 (#891)

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250704...nightly-20250709

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 11 months ago

BirdNET-Go - Nightly Build 20250704

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250703...nightly-20250704

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 12 months ago

BirdNET-Go - Nightly Build 20250703

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250629...nightly-20250703

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 12 months ago

BirdNET-Go - Nightly Build 20250629

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250628...nightly-20250629

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 12 months ago

BirdNET-Go - Nightly Build 20250628

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250620...nightly-20250628

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 12 months ago

BirdNET-Go - Nightly Build 20250620

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250602...nightly-20250620

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] 12 months ago

BirdNET-Go - Nightly Build 20250602

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250531...nightly-20250602

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250531

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250512...nightly-20250531

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250512

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250511...nightly-20250512

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250511

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250508...nightly-20250511

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250508

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250504...nightly-20250508

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250504

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250427...nightly-20250504

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250427

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250424...nightly-20250427

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250424

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250421...nightly-20250424

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250421

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250420...nightly-20250421

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250420

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250419...nightly-20250420

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250419

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250418

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250415...nightly-20250418

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250415

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250407...nightly-20250415

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250407

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250406...nightly-20250407

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250406

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250317...nightly-20250406

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - Nightly Build 20250317

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.4...nightly-20250317

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] about 1 year ago

BirdNET-Go - March 15th, 2025 release

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.3...v0.6.4

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala over 1 year ago

BirdNET-Go - Nightly Build 20250315

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250314...nightly-20250315

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250314

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250313

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.3...nightly-20250313

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - March 8th, 2025 release

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.2...v0.6.3

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala over 1 year ago

BirdNET-Go - Nightly Build 20250308

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250307

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250305

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250304

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250302...nightly-20250304

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250302

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250228...nightly-20250302

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250228

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250224...nightly-20250228

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250224

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.2...nightly-20250224

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250222

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.2...nightly-20250222

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - February 21st, 2025 release

This version fixes BirdWeather uploads which were broken by unannounced API change

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.1...v0.6.2

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala over 1 year ago

BirdNET-Go - Nightly Build 20250221

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250219

  • Fix CSRF token issues related to settings saving
  • Fix BirdWeather uploads

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250218...nightly-20250219

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250218

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.1...nightly-20250218

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - February 16th, 2025 release

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.0...v0.6.1

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala over 1 year ago

BirdNET-Go - Nightly Build 20250214

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250211...nightly-20250214

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250211

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.0...nightly-20250211

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250210

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.0...nightly-20250210

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250209

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250119...nightly-20250209

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250124

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.0...nightly-20250124

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250119

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.6.0...nightly-20250119

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - January 15th, 2025 release

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/v0.5.5...v0.6.0

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by tphakala over 1 year ago

BirdNET-Go - Nightly Build 20250115

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250113...nightly-20250115

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250113

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250109...nightly-20250113

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250109

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20250105...nightly-20250109

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20250105

What's Changed

New Contributors

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20241223...nightly-20250105

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago

BirdNET-Go - Nightly Build 20241223

What's Changed

Full Changelog: https://github.com/tphakala/birdnet-go/compare/nightly-20241221...nightly-20241223

Biosphere - Bioacoustics and Acoustic Data Analysis - Go
Published by github-actions[bot] over 1 year ago