Configuration Reference
Every setting that matters, organized by what it controls. The
desktop app shows these in a tabbed β Settings dialog;
the server shows them on a Blazor /settings page. The names and
defaults are the same on both editions unless noted.
Data\config.json; on the server they live in
data/config.json inside the data folder you mounted into the
container.
Desktop app settings
Open with β Settings. The dialog has twelve tabs; click Save to apply or Cancel to discard.
Camera (RTSP)
| Setting | Default | Purpose |
|---|---|---|
| Camera Name | β | Friendly name (e.g. "Backyard Feeder"); shown in the title bar and used as your public feeder name |
| Camera IP Address | 192.168.1.100 | The camera's network address |
| RTSP Port | 554 | Streaming port |
| RTSP Username / Password | β | Camera account credentials |
| RTSP URL | auto | Built from the above, or paste a full URL. Build/Test buttons here. |
| Analysis Stream URL | auto | Optional low-res stream for
software motion (Tapo: /stream2 used automatically) |
| Use ONVIF motion detection | On | Use the camera's hardware motion events (recommended for Tapo) |
| TAPO Reboot (TP-Link email/password) | β | Cloud login enabling remote camera reboot |
Bird Identification
| Setting | Default | Purpose |
|---|---|---|
| AI Model | Bird Model (965) | Local classifier; or SpeciesNet (2,498, experimental) |
| Minimum Confidence Threshold | 35% | Only detections above this are recorded |
| Use Test Mode | Off | Generates fake detections for testing β leave off for real use |
Monitoring
| Setting | Default | Purpose |
|---|---|---|
| Check Interval (seconds) | 2 | How often the app samples for motion |
| Motion Threshold | 5 | % of pixels that must change to count as motion |
| Cooldown Period (seconds) | 3 | Minimum gap between detections |
| Monitor daylight hours only | On (7β20) | Pauses overnight; set start/end hours |
| Auto-reconnect | On | Retry dropped connections automatically |
| Periodic reconnect (minutes) | 0 (off) | Force a fresh connection every N minutes |
| Feeder Zip Code / GPS | β | Location for weather, rarity, daylight. GPS optional (with "Pick on Map"). Also published with your feeder if community sharing is on β see Community sharing below |
| Temperature Unit | Fahrenheit | Β°F or Β°C |
Advanced
| Setting | Default | Purpose |
|---|---|---|
| Snapshot Folder | Data\Snapshots | Where photos/videos are saved |
| Save snapshots locally | On | Keep image files on disk |
| Max Snapshots Per Day | 500 | Daily cap |
| Auto-delete old snapshots | Off | Optionally purge after N days (default 30) |
| Enable video recording | On | Record a clip per detection (duration, pre-buffer) |
| Best frame extraction | On | Pick the clearest frame from the clip for ID |
| Object Detector (YOLOv8) | On | Crop to the bird; filter non-bird motion |
| Save below-threshold detections | Off | Keep uncertain ones in a ForReview folder |
| Check for updates on startup | On | Notify when a newer version is available |
| Auto-connect & start on startup | Off | Begin monitoring automatically at launch |
Other tabs (summary)
- Email Notifications, Pushover, NTFY & Windows β see Notification channels.
- Summary Reports β Daily / Weekly / Monthly digest schedules, recipients, and delivery method.
- Photo Frame β FTP or email-to-frame delivery of snapshots.
- Community β see Community sharing.
- Video Summary β intro card, music, highlight extraction, Ken Burns, scheduled daily summary time.
- Debug Logging β per-component log levels (None / Low / Medium / High) for Bird Identification, Camera, Motion, Monitoring loop, and MainForm/UI, plus log-file rotation.
Server settings
On the server edition, settings live on the Blazor /settings page.
They're grouped into the same logical sections as the desktop app, but presented
in one long scrollable page with anchored sub-sections rather than tabs. All
settings persist to data/config.json in your mounted data folder.
docker restart birdwatch after
a settings change.
Major sections
- Camera β RTSP URL (or Pi camera device path), Camera type dropdown, Test camera button, ONVIF toggle.
- Detection β Confidence threshold, motion detection threshold, cooldown, daily cap, daylight hours.
- Location & weather β ZIP code or lat/long, temperature unit.
- Notifications β Email (SMTP), ntfy push.
- Community β sharing toggle, feeder name, and separate switches for uploading images and clips (the server has no Share Level dial; see below).
- License β paste a license key; deactivate to move to another machine.
- Storage β snapshot retention policy, video retention, ForReview folder toggle.
- Backups & Migrate β see Part 8 β Backups & migration.
Notification channels
Q: Does the server support Pushover notifications?
Yes. The server sends email, ntfy, and
Pushover. (Windows toast and photo-frame delivery remain
desktop-only.)
Email (SMTP) β both editions
- Enable email notifications.
- Set the SMTP server and port
(Gmail:
smtp.gmail.com/587), keep SSL / TLS on. - Enter your sending email + password and one or more recipients (comma-separated).
- Click Send Test Email.
ntfy push β both editions
ntfy is a free, open-source push service that needs no account.
- Install the ntfy app on your phone.
- In settings, enable ntfy, keep the server
https://ntfy.sh, and choose a unique topic name (e.g.birdwatch-myfeeder-12345). - Subscribe to the same topic in the phone app.
- Click Send Test Notification.
Pushover β both editions
Pushover delivers instant push notifications (with the photo) to your phone, tablet, or desktop. Low-cost one-time purchase per platform after a free trial.
- Create an account at pushover.net and install the app.
- Create an application at pushover.net/apps/build.
- In Settings β Pushover, enable it and paste your Application API Token and User Key.
- Click π± Send Test Notification.
BirdWatch in Pushover to give bird alerts
their own distinctive tone.
Windows desktop notifications β desktop only
Native Windows 10 / 11 toast pop-ups. Fast and local β no internet round-trip. Settings β NTFY & Windows tab.
Photo frame β desktop only
BirdWatchAI can push snapshots (and optionally videos) straight to a digital photo frame, turning it into a live bird gallery. In Settings β Photo Frame:
- Enable it, name the frame, choose whether to send snapshots, videos, and whether to auto-send on every detection.
- Pick a delivery method: FTP Upload (host, port, credentials, remote path, optional FTPS) or Email to Frame (the frame's email address + SMTP details).
- Click πΌ Test Photo Frame.
You can also send any single detection on demand via the history right-click menu β πΌ Send to Photo Frame.
Summary reports β both editions
Reports roll up your activity into a tidy digest with statistics, charts, and snapshots. Enable any of Daily / Weekly / Monthly with a chosen schedule, the recipient email(s), and the delivery method (Email, Pushover, or Both β on both editions). Reports are skipped automatically when there were no detections in the period.
Community sharing
Sharing is controlled in Settings β Community. It is off by default on both editions — nothing leaves your machine until you turn it on.
Server edition
Three checkboxes, on Settings β Community:
| Control | Default | What it does |
|---|---|---|
| Share my sightings with the BirdWatch community | Off | The master switch. While it is off, nothing at all is shared. |
| Also upload the snapshot image | On | Publishes the photograph of the bird with each sighting. |
| Also upload the recorded video clip | On | Publishes the clip too. The heaviest upload and the most storage. |
What a shared sighting always carries: the species, our confidence, the timestamp, the rarity, and the temperature when one was recorded.
Location. If you have set a ZIP code or coordinates — which you probably have, since the temperature lookup needs one — that location is attached to your feeder when sharing is on, and is used to place it on the public map. There is no separate level that withholds it. How precise it is depends on how you set it: a ZIP lookup gives an area-level position, while a street address gives coordinates close to the building. To share only an approximate area, set your location by ZIP code. To share none, clear the location before enabling sharing — and set Weather source to Don't record temperature, or the location will be needed again.
Desktop edition
The desktop app uses a single Share Level (0–4), which governs what leaves your machine:
| Level | What is shared |
|---|---|
| 0 β Off | Nothing is shared |
| 1 | Species + timestamp only (plus confidence, rarity, and temperature when available) |
| 2 | The above + your ZIP code (or GPS coordinates if you've enabled GPS instead of ZIP) |
| 3 | The above + the snapshot image |
| 4 | The above + the video clip |
On the desktop, and only on the desktop, location is shared at Level 2 and above, and GPS is used in place of ZIP only if you explicitly enable GPS coordinates.
Both editions
Other options on the tab:
- Enable Community Sharing β the master switch.
- Automatically push each detection β uncheck to share only manually (right-click a detection β π Push to Communityβ¦).
- When you correct or delete a detection locally, the change syncs to the community automatically.
- Your install periodically sends a heartbeat so the website can show your feeder as online / monitoring.
Communities β sharing with a group instead of the world
By default a feeder publishes to the Public Feed: everyone who visits the community site sees its sightings. A community is a named group you can publish into instead β a school sharing with its own teachers and parents, a nature centre, a birding club.
| Type | Who can see it |
|---|---|
| Public | Everyone, signed in or not. The Public Feed is itself a public community. |
| Private | Only people the community's owner has invited. Not listed anywhere β you join with a code the owner gives you. |
Your feeder can belong to any number of communities at once. The list lives in Settings β Community β Communities.
Joining
- Public communities appear in the list β click Request to join.
- For a private one, type its code into Join a private community by code and click Request to join. Private communities are deliberately not listed, so the code is the only way in.
- The status shows Awaiting approval until a moderator of that community approves you, then Publishing.
Going private
Once a feeder has left every public community:
- Its sightings disappear from the public feed and map, and are visible only to members of its private communities.
- New photos and videos are stored in a private area with no public web address. Members' browsers fetch them through short-lived signed links; nobody else can open them at all.
Detection tuning β when defaults aren't right
The factory defaults work for most installs, but if you're getting too many false positives, missing real birds, or finding the AI keeps misidentifying things, here's what knob to turn:
| Symptom | Knob | Direction |
|---|---|---|
| Too many "false" detections (squirrels, wind) | Motion Threshold; YOLOv8 detector | Raise threshold; keep YOLOv8 on |
| Missing real birds | Motion Threshold; Cooldown | Lower threshold; lower cooldown |
| Wrong species often | Camera placement; Best-frame extraction; Min confidence | Get the camera closer; keep best-frame on; raise confidence to 40β50% |
| Bursts of duplicates of the same bird | Cooldown | Raise to 10β30 s |
| App ignores some real birds (low confidence) | Min confidence; "Save below-threshold detections" | Lower min confidence; enable the for-review folder and confirm manually |
On the desktop, the π Telemetry window plots motion %, temperature, and your two thresholds against detection markers β the easiest way to pick a Motion Threshold that's just below real visits and above background sway.