Blockers
- http://birdnet.local/avian/ now serves the collage (added avian/index.html
redirect to frontend/; previously the symlink target had no top-level
index, so users saw a directory listing of api/ assets/ forwarding/
frontend/ scripts/).
- Gemini model bumped from gemini-2.5-flash-image-preview (deprecated
2026-01-15) to the stable gemini-2.5-flash-image. Pregen was non-
functional out of the box.
- avian-mqtt.service: dropped %h (which expands to /root for system-mode
units regardless of User=). Use WorkingDirectory=~ which DOES respect
User=, plus a relative ExecStart.
- birdnet-api.php case 'lifelist' now aliases COUNT(*) AS n (was 'total'),
matching what apt.js reads for atlas card counts. Atlas previously
always displayed 0.
Bugs
- Retry-After parsing handles HTTP-date format without crashing.
- apt.js no longer fetches firstseen/timeseries (declared in state but
never consumed). Two wasted round-trips per page load removed.
- update_birdnet.sh defaults branch=avian-visitors so the (opt-in)
Sunday auto-update cron doesn't reset HEAD to upstream main and
delete the avian/ overlay.
- recording.php: removed dead $BIRDS_JSON_CANDIDATES.
Polish
- Pregen --sleep default raised 4→6s (more headroom under free-tier RPM).
- en-dash in README BOM (~$35–80) replaced with hyphen for style match.
- Slop sweep across user-facing docs: no em-dashes, no en-dashes, no
AI-slop word hits (robust/comprehensive/seamless/etc.).
Restructures the install so users run ONE command. The fork's
newinstaller.sh clones this repo (instead of upstream Nachtzuster) and
runs BirdNET-Pi's installer. install_services.sh symlinks the avian/
overlay into the Caddy site root, so http://birdnet.local/avian/ comes
up after reboot with no Caddy config needed.
Reviewer-flagged fixes:
Frontend (avian/frontend/apt.js)
- Switch all API paths from /api/*.json (which didn't route) to relative
action-based URLs (./api/birdnet-api.php?action=recent etc.).
- Fetch ./masks.json + ./dims.json relatively (were /avian/*.json).
- Replace every innerHTML user-content sink with createElement +
textContent + setAttribute — species labels are user-editable in
BirdNET-Pi, so untrusted.
- Add esc() helper for the few remaining innerHTML attribute contexts.
- fetchJson throws on non-200 (was silently parsing 404 HTML as JSON).
- Defensive null-check in loadMask if MASKS hasn't loaded.
Backend (avian/api/*.php)
- birdnet-api.php now derives DB_PATH from dirname(__DIR__, 3) so any
BirdNET-Pi install user works (no hardcoded /home/birdnet).
- recording/spectrogram/cutout use getenv('HOME') for the same reason.
- cutout.php reworked as the canonical image resolver: bundled
illustration → bundled cutout → cached rembg → fresh
Wikipedia+rembg, with the binomial regex guard and atomic rename
on cache write. Wikipedia URL host pinned to wikimedia.org /
wikipedia.org to block SSRF.
- Stale 'X-BirdNET-Proxy-Token' auth claims removed everywhere.
Pregen (avian/scripts/pregen.py)
- Gemini key moved from URL query to x-goog-api-key header.
- Model bumped to gemini-2.5-flash-image-preview.
- Bounded retry on 429 + 5xx with Retry-After honoured.
- Default --sleep raised from 1s to 4s (under free-tier RPM).
- Unified parser handles |/_/comma in all three input modes.
- responseModalities now [TEXT, IMAGE] (was IMAGE-only).
- --poses validated against POSES keys.
- ASCII [ok]/[fail] markers (was ✓/✗ — Windows console crash).
- Surfaces finishReason + blockReason on safety blocks.
Prompt template
- 'Two placeholders' typo → three.
- 'warm paper' / 'transparent background' contradiction resolved.
Forwarding
- mqtt-bridge.py: paho-mqtt 2.x CallbackAPIVersion compat shim.
- avian-mqtt.service: dropped broken %i, set User=birdnet + %h path.
- forwarding/README.md uses the actual action-based URLs.
README
- One-line install via curl … newinstaller.sh.
- No more 'install BirdNET-Pi separately' step (our fork does it).
- License section uses absolute github.com links.
- bird.onethreenine.net replaces the not-yet-existent project writeup.
- docs/thumb.png replaced with the 24-bird Twitter capture.
Removed
- avian/caddy/ and avian/scripts/install.sh — no longer needed; the
overlay symlink in install_services.sh handles everything.
added RPi 400, because it also runs the BirdNET-Pi software without problems. Many people seem to think that no Raspberry Pi model is available due to the chip crisis, but in fact the Raspberry Pi 400 is and has always been for sale!