github tphakala/birdnet-go nightly-20251214
Nightly Build nightly-20251214

pre-releaseone day ago

πŸš€ 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: nightly-20251028...nightly-20251214

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

Don't miss a new birdnet-go release

NewReleases is sending notifications on new releases.