Satellites
Satellites are the audio capture nodes in a BirdNET-NG deployment. They record bird sounds, filter out silence and noise on-device, and upload audio chunks to the hub via MQTT for identification.
What Satellites Do
- Audio capture — record 3-second WAV chunks at 48kHz mono (BirdNET's native window)
- On-device filtering — adaptive noise floor + spectral peak SNR detection to reject silence and non-bird audio before upload
- MQTT upload — send audio chunks and telemetry to the hub over WSS (WebSocket Secure, port 443)
- Heartbeat — periodic status reports to keep the satellite showing as "online" on the hub
Supported Platforms
| Platform | Type | Status | Page |
|---|---|---|---|
| Raspberry Pi | Dedicated hardware | Available | Satellite: Raspberry Pi |
| Android phone | Mobile app | Available | Satellite: Android |
Feature Comparison
BirdNET-NG supports two types of satellites for capturing bird audio in the field: the Pi Satellite (a Node.js agent for Raspberry Pi) and the Phone Satellite (an Android app built with Capacitor). Both connect to the same hub and use the same MQTT protocol, but they differ in hardware capabilities, deployment model, and user interaction.
| Feature | Pi Satellite | Phone Satellite |
|---|---|---|
| Audio source | ALSA (USB microphone) | Native AudioRecord plugin |
| Sample rate | 48kHz native | 48kHz (falls back to 44.1kHz / 16kHz) |
| Audio filtering | Adaptive noise floor + spectral peak SNR | Same algorithm |
| Filter config | Received from hub via MQTT | Received from hub via MQTT |
| GPS | gpsd (external chip) or static env vars | Built-in device GPS (auto-update with configurable interval) |
| Manual GPS | Via environment variables | In-app settings page |
| Local buffer | sql.js outbox (survives restart) | In-memory buffer (lost on app kill, max 100 chunks) |
| Recording modes | live, simulate (white noise), replay (fixtures) | Live only |
| Keep awake | N/A (always on, headless) | Toggle (Android wake lock) |
| Default state | Starts recording immediately | Starts paused (tap to record) |
| Settings source | Environment variables + hub config push | In-app settings page + hub config push |
| Telemetry | CPU temp, storage free, uptime | Battery level, storage free, uptime |
| Noise floor | Reported in heartbeat | Reported in heartbeat |
| Version tracking | Reported in heartbeat | Reported in heartbeat |
| Background operation | Systemd service | Capacitor background mode |
| Deployment | SSH + npm install + systemd | APK install (sideload or build) |
| Update method | git pull + rebuild + restart service | Rebuild APK + reinstall |
| Connectivity | WSS (port 443) | WSS (port 443) |
| Registration | Auto on first connect (env config) | In-app registration screen |
| Rename | From hub UI only | From hub UI or in-app settings |
| On-device logging | stdout/journald | In-app log viewer with copy/clear |
Shared Concepts
MQTT Registration
Every satellite must be registered with the hub before it can connect. Registration creates MQTT credentials and associates the satellite with a tenant. Registration can be done:
- Via the web UI (Satellites page)
- Via the REST API (
POST /api/satellites) - In-app (Android satellite only)
MQTT Topics
All satellites use the same topic structure: birdnet/{tenant_id}/{satellite_id}/{channel} where channel is audio, telemetry, heartbeat, config, or ack.
Heartbeat
Satellites send a lightweight heartbeat at a configurable interval (default 30 seconds, set from hub tenant settings) via MQTT QoS 1. The heartbeat includes the satellite's current state (recording, paused, scheduled_off, error) and noise_floor_rms for filter calibration.
On-Device Audio Filtering
Both satellite types use the same adaptive filtering algorithm:
- Adaptive noise floor — tracks ambient noise level over time (smoothing alpha: 0.02)
- Minimum RMS energy — rejects silence below threshold (default 0.003)
- Spectral peak SNR — requires signal-to-noise ratio above threshold (default 1.5)
- Bird-band frequency check — confirms energy in the 1-10kHz bird frequency range
Filter settings are managed centrally in hub tenant settings and pushed to all satellites via MQTT. This typically filters 70-90% of chunks, reducing bandwidth and processing load.
Recording Profiles
Profiles control when satellites capture audio. They are pushed from the hub via MQTT and can be changed on the Satellites page.
| Profile | Schedule | Description |
|---|---|---|
continuous |
24/7 | Always recording |
dawn_chorus |
sunrise-30min to sunrise+2h | Peak bird activity |
night_migration |
sunset+30min to sunset+12h | Nocturnal flight calls |
low_power |
sunrise+/-30min, sunset+/-30min | Dawn and dusk only |
Sunrise and sunset times are calculated automatically from the satellite's GPS coordinates using the NOAA solar algorithm.
When to Use Which
The Pi satellite is the better choice for permanent, always-on installations where power and network are reliable. The phone satellite is ideal for portable or temporary deployments -- field trips, surveys, or testing new locations before committing to a fixed setup.
Future Platforms
The following satellite platforms are planned but not yet available:
- iPhone — iOS satellite app (planned)
- ESP32 — low-power microcontroller satellite (planned)
- Docker satellite — containerized satellite for testing and development (planned)