π 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: 0in 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
DetectionIDfor building custom URLs - Added
DetectionPathfor webhook integrations - Useful when server is behind a proxy and needs custom URL construction
- Added
- 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 genusGET /api/v2/taxonomy/family/:family- All species in familyGET /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_thresholdstable 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)
- New
- 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 SettingsTabsReusable tabs with change indicators and lazy rendering StreamManagerAudio stream management with real-time health monitoring StreamCardIndividual stream status with controls StatusPillVisual status indicator badges EmptyStateConsistent 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_historiesdatabase 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!