Releases: JoeBarraco/birdwatchai-server-releases
v0.2.288
v0.2.285
What's new
Features
- Import detection history from a Windows install. Counterpart to the existing
WinForms config import: Settings → "Import detection history (from the Windows
app)" now reads the original WinFormsdetections.dband copies every row into
the server's history, optionally migrating the matching snapshot + clip files
intodata/snapshots/yyyy/MM/dd/anddata/clips/yyyy/MM/dd/. Useful when
moving a feeder from the desktop app to the server and you want to keep the
life list, gallery, and stats unbroken. The WinForms DB is opened read-only,
so the source install is untouched. The on-screen hint spells out that the
path fields take container paths (/data/migration/...) — not the host path
WinSCP shows you (~/birdwatch/data/migration/...) — so the most common
setup mistake is now called out where you're about to make it.
Docs
- macOS setup walkthrough. New
MACOS-SETUP.mdin the public release repo
mirrors the Windows / Pi guides for users running Docker Desktop on Intel or
Apple Silicon Macs. Ships withbirdwatch-{start,stop,update,logs}.command
double-clickable helpers.
Upgrading
cd ~/birdwatch
docker compose pull
docker compose up -d --force-recreate birdwatchv0.2.282
What's new
Features
- Import detection history from a Windows install. Counterpart to the existing
WinForms config import: Settings → "Import detection history (from the Windows
app)" now reads the original WinFormsdetections.dband copies every row into
the server's history, optionally migrating the matching snapshot + clip files
intodata/snapshots/yyyy/MM/dd/anddata/clips/yyyy/MM/dd/. Useful when
moving a feeder from the desktop app to the server and you want to keep the
life list, gallery, and stats unbroken. The WinForms DB is opened read-only,
so the source install is untouched.
Docs
- macOS setup walkthrough. New
MACOS-SETUP.mdin the public release repo
mirrors the Windows / Pi guides for users running Docker Desktop on Intel or
Apple Silicon Macs. Ships withbirdwatch-{start,stop,update,logs}.command
double-clickable helpers.
Upgrading
cd ~/birdwatch
docker compose pull
docker compose up -d --force-recreate birdwatchv0.2.279
What's new
Fixes
- 📤 Share is now idempotent — clicking it on a detection that was already shared
(either via auto-share or by a previous click) no longer creates a duplicate row
on the community feed. The dashboard tells you "Already shared — no duplicate
created" in that case instead of the usual "Shared" confirmation. This also
guards the auto-share path against the rare case where the engine restarts
mid-persist and would otherwise re-share.
Internal
- ROADMAP note about the end-user compose-stale gap (the dashboard's Apply Update
refreshes the image, but not docker-compose.yml — so anyone who installed before
a compose change ships stays broken until they manually re-pull). Three options
to address it sit on the punch list.
Upgrading
cd ~/birdwatch
docker compose pull
docker compose up -d --force-recreate birdwatchv0.2.276
Enhance Wi-Fi setup instructions for Raspberry Pi Added troubleshooting steps for Wi-Fi connectivity issues on Raspberry Pi, including using Ethernet and setting the Wi-Fi country code.
v0.2.245
Fix: Wired Pi camera (Arducam / Camera Module via CSI ribbon cable) now actually works on Pi OS Bookworm.
The first cut of Pi camera support shelled out to ffmpeg's v4l2 input,
which works for USB webcams but fails on the CSI Pi camera — the
unicam driver at /dev/video0 only exposes raw Bayer sensor data,
which ffmpeg can't decode. Capture has to go through libcamera's ISP
pipeline. This release switches the Pi camera path to rpicam-still
internally (from the Raspberry Pi rpicam-apps package), which works
against the real hardware.
What's in this release
Pi camera
- Capture via
rpicam-still(Raspberry Pi rpicam-apps-lite bundled in
the arm64 image; amd64 builds skip it since there's no Pi camera to
drive). - Settings → Camera → "Camera index" field —
0for a single-camera
Pi,1/2for multi-camera setups. Backward-compatible with the old
/dev/video0form (extracts the trailing digit). - The dashboard's Test camera button reports actionable
rpicam-specific errors when capture fails (instead of the generic
ffmpeg one).
Compose
docker-compose.yml's Pi camera block grew to cover what libcamera
actually needs:/dev/dma_heap, the ISP pipeline nodes
/dev/video10–23, the/dev/media*controllers, a/run/udev:ro
bind mount for camera discovery, plus the existinggroup_add: 44.
RTSP installs are unaffected — the block stays commented out by
default.
Upgrading
RTSP installs (most users): nothing to do. Apply update from the
dashboard, no compose changes required.
Existing Pi camera installs that uncommented the old (smaller)
devices: block before today: you need to expand it. Apply the update
from the dashboard, then SSH in and edit ~/birdwatch/docker-compose.yml:
add /run/udev:/run/udev:ro to your volumes: block, replace the
small devices: block with the new longer one in the file's comments,
keep group_add: ["44"]. Then docker compose up -d and re-test from
the dashboard.
Fresh Pi camera installs: see the "Using a Pi camera" section in
the README — walks through ribbon orientation, libcamera-hello --list-cameras sanity check, the compose edits, and the dashboard
switch.
v0.2.243
Fix: Wired Pi camera (Arducam / Camera Module via CSI ribbon cable) now actually works on Pi OS Bookworm.
The first cut of Pi camera support shelled out to ffmpeg's v4l2 input,
which works for USB webcams but fails on the CSI Pi camera — the
unicam driver at /dev/video0 only exposes raw Bayer sensor data,
which ffmpeg can't decode. Capture has to go through libcamera's ISP
pipeline. This release switches the Pi camera path to libcamera-still
internally, which works against the real hardware.
What's in this release
Pi camera
- Capture via
libcamera-still(libcamera-apps now bundled in the
image, ~50 MB). - Settings → Camera → "Camera index" field —
0for a single-camera
Pi,1/2for multi-camera setups. Backward-compatible with the old
/dev/video0form (extracts the trailing digit). - The dashboard's Test camera button reports actionable
libcamera-specific errors when capture fails (instead of the
generic ffmpeg one).
Compose
docker-compose.yml's Pi camera block grew to cover what libcamera
actually needs:/dev/dma_heap, the ISP pipeline nodes
/dev/video10–23, the/dev/media*controllers, a/run/udev:ro
bind mount for camera discovery, plus the existinggroup_add: 44.
RTSP installs are unaffected — the block stays commented out by
default.
Upgrading
RTSP installs (most users): nothing to do. Apply update from the
dashboard, no compose changes required.
Existing Pi camera installs that uncommented the old (smaller)
devices: block before today: you need to expand it. Apply the update
from the dashboard, then SSH in and edit ~/birdwatch/docker-compose.yml:
add /run/udev:/run/udev:ro to your volumes: block, replace the
small devices: block with the new longer one in the file's comments,
keep group_add: ["44"]. Then docker compose up -d and re-test from
the dashboard.
Fresh Pi camera installs: see the "Using a Pi camera" section in
the README — walks through ribbon orientation, libcamera-hello --list-cameras sanity check, the compose edits, and the dashboard
switch.
v0.2.241
New: Wired Raspberry Pi camera support.
The dashboard now supports a Raspberry Pi Camera Module or Arducam attached
directly to the Pi over the CSI ribbon cable, as an alternative to an RTSP
IP camera. Useful when there's no convenient IP camera at the feeder spot,
or when WiFi reliability rules out streaming.
What's in this release
Camera
- New "Camera type" dropdown in Settings → Camera: choose between
RTSP / IP camera (the historical default — Tapo, Reolink, etc.) and
Pi camera (CSI ribbon cable). - Pi camera path captures via ffmpeg's v4l2 input — no new dependencies
inside the container; v4l2 compat is on by default on Pi OS Bookworm. - "Test camera" button on the settings page routes to whichever backend is
currently selected, so you can verify before saving.
Compose
docker-compose.ymlships with a commented-outdevices:+group_add:
block at the bottom of thebirdwatchservice. Uncomment those lines
if you're enabling the Pi camera; RTSP-only installs leave them alone.
Docs
- README has a new "Using a Pi camera (CSI ribbon cable)" section covering
ribbon orientation, enabling the camera interface with raspi-config,
verifying withlibcamera-hello --list-cameras, exposing the device
into the container, and switching the camera type from the dashboard.
What stays the same
The existing pipeline — frame-diff motion detection, identify, best-frame,
overlay, clip recording, notifications, community share — works on Pi
camera frames unchanged. Only the bytes-on-the-wire layer is different.
ONVIF motion events still apply to RTSP cameras only (wired Pi cameras
don't speak ONVIF). Frame-diff motion detection (Settings → Detection →
Motion threshold) is the right default for the Pi camera path.
Upgrading
Existing installs: pull the latest compose + image as usual. The Pi
camera fields show up in Settings → Camera automatically; the default
camera type stays RTSP, so nothing changes unless you switch.
Switching an existing install to Pi camera:
- Plug the ribbon cable with the Pi powered off.
- Uncomment the
devices:+group_add:blocks in your
~/birdwatch/docker-compose.yml. docker compose up -dto recreate with the device passthrough.- Settings → Camera → Camera type → Pi camera → enter
/dev/video0
→ Test camera → Save.
v0.2.236
New: one-click "Apply update" from the dashboard.
The ⬆ Update available button now opens a modal with the release
notes; click Apply to have the watchtower sidecar pull the new image
and recreate the container in ~90 seconds. No SSH needed.
If you're upgrading from an earlier release, this is the last update
you'll have to apply by hand — re-clone or git pull this repo so
the docker-compose.yml picks up the new watchtower service, then
docker compose up -d. Future releases land via the dashboard button.
v0.2.234
Fix: Dashboard no longer crashes at startup on Linux arm64 / aarch64.
The previous release used a shared-framework Docker image where the
.NET assembly loader couldn't resolve System.Private.Xml during
Blazor's MapRazorComponents setup. We've switched to a self-contained
publish on a runtime-deps base — the entire .NET 8 runtime ships inside
the image now, so the dashboard's assembly resolution never has to leave
the published output.
End-user impact: a fresh docker compose up -d now actually boots and
you land on the setup wizard.
No other changes since v0.2.232.