You are viewing archived documentation for v0.29. Go to latest →

Release Protocol

Steps to follow for every BirdNET-NG release.

Version Numbering

BirdNET-NG ships three independent SemVer streams (since vhub-0.28.0):

Stream Includes Tag prefix Source of truth
hub hub, web, inference, shared, docs, root vhub-X.Y.Z root package.json
satellite packages/satellite only vsat-X.Y.Z packages/satellite/package.json
mobile packages/mobile only vapk-X.Y.Z packages/mobile/package.json

Each stream uses standard SemVer. Pick the stream(s) by reading the diff:

  • packages/satellite/** touched? → bump satellite.
  • packages/mobile/** touched? → bump mobile.
  • Anything else? → bump hub.
  • Multiple scopes touched? Bump each affected stream — usually one commit per scope.
Bump When Example
minor New capabilities — things the package couldn't do before vhub-0.27vhub-0.28
patch Improvements to existing capabilities — polish, fixes, translations vsat-1.2.0vsat-1.2.1
major Breaking changes, incompatible migrations 0.x1.0

When to bump minor

A user would say "the app can do something new":

  • New pages or major UI features (e.g., satellite detail page, field journal)
  • New infrastructure (e.g., live audio streaming, push notifications)
  • New API endpoints or data models
  • New satellite capabilities (e.g., audio autodetection, error state reporting)

When to bump patch

A user would say "that works better now":

  • Bug fixes
  • Translation fixes and i18n improvements
  • UI polish (alignment, colors, icons, auto-boost)
  • Performance improvements
  • Small additions to existing features (e.g., sort toggle, extra stat)
  • Documentation-only updates

When NOT to bump

Don't bump for every commit. Batch related changes:

  • Work on features, commit and push without bumping
  • When a coherent set of changes is ready, go through the release process
  • Multiple bug fixes can be grouped into a single patch release

Release Process

Step 1 — Update Documentation

This is the first step. Do not skip or defer it.

Update ALL documentation to reflect the current state of the codebase. This includes both the docs package AND root project files.

Root files

File Check
CLAUDE.md Migration count, container count, conventions
ARCHITECTURE.md Migration table, services, technology stack
FEATURES.md Mark completed features, add new ones

Docs package — roadmap, features, and release protocol (CRITICAL)

These are the most important pages. They MUST be updated first.

Page Check
guide/roadmap.md Move completed items to Released, update Planned, renumber future versions
guide/features.md Add new capabilities, update existing descriptions, migration count
reference/release-protocol.md Ensure process is current, update if workflow changed

Docs package — guide

Page Check
guide/architecture.md Components, services, MQTT channels, migration count + table, tech stack
guide/getting-started.md Setup instructions still accurate

Docs package — reference

Page Check
reference/api.md All endpoints listed with correct auth levels
reference/mqtt.md Message formats, channels, QoS values
reference/configuration.md All env vars, platform/tenant settings
reference/webhooks.md Event types, payload format
reference/design-system.md Button/badge classes, color palette

Docs package — deployment

Page Check
deployment/hub.md Container count, migration count, commands
deployment/workers.md Docker, standalone, GPU
deployment/satellites.md Overview, comparison table
deployment/satellite-rpi.md Setup, profiles, heartbeat, update script
deployment/satellite-android.md Features, settings, troubleshooting
deployment/docs-site.md Documentation site deployment

Sync root docs

After updating docs/versions/vX.Y/, copy the updated files to docs/ (root serves as "latest"):

cp docs/versions/vX.Y/guide/roadmap.md docs/guide/roadmap.md
cp docs/versions/vX.Y/guide/features.md docs/guide/features.md
# ... and any other changed files

Step 2 — Build and Deploy

Build all packages and deploy for testing:

pnpm build
docker compose up -d --build

Verify all containers are running:

docker compose ps

Step 3 — Test and Confirm

The user must test the deployment and explicitly confirm it's ready for release.

Checklist:

  • Web UI loads and shows current features
  • New features work as expected
  • No console errors
  • Docs site shows updated content
  • Satellite(s) connected and functioning

Do not proceed to Step 4 until the user says "good to go" or equivalent.

Step 4 — Version Bump

Pick the stream(s) by reading the diff. Bump each affected one:

pnpm version:bump --scope hub <minor|patch>          # hub stream
pnpm version:bump --scope satellite <minor|patch>    # Pi satellite
pnpm version:bump --scope mobile <minor|patch>       # Android APK

Each scoped bump:

  • Updates the package.json versions for that scope only (and pyproject.toml for hub).
  • Refuses to bump if nothing in scope has changed since the last scoped tag (--force to override).
  • Prepends a ## <scope> X.Y.Z — DATE heading to CHANGELOG.md.
  • For hub: also snapshots docs/versions/vX.Y/.
  • Commits and tags as vhub-X.Y.Z / vsat-X.Y.Z / vapk-X.Y.Z.

Edit the placeholder CHANGELOG entry with real notes, then git commit --amend and re-tag if needed.

Step 5 — Push

git push origin main --tags

Step 6 — Final Deploy

docker compose --profile split up -d --build

For the mobile stream additionally rebuild + upload the APK:

./packages/mobile/build-apk.sh

For the satellite stream the Pi update is hub-triggered: open the Satellites page, find the row showing "needs update", click the update button. birdnet-update.sh on the Pi fetches the latest vsat-* tag.

Step 7 — Verify

  • Web UI shows new hub version in sidebar (only if hub bumped).
  • Docs site version dropdown updated (only if hub bumped).
  • Satellites with mobile/Pi version mismatches show "needs update" badge for the right stream.
  • After triggering update, satellite reports new version on next heartbeat and badge clears.

Summary

1. Update docs for the affected scope(s)
2. Build and deploy for testing
3. User tests and confirms → WAIT FOR APPROVAL
4. Version bump for each affected scope (--scope hub|satellite|mobile)
5. Push to origin with tags
6. Redeploy hub (and APK if mobile changed)
7. Verify

Hotfix Process

For urgent fixes between releases:

  1. Fix the issue.
  2. Build and deploy the affected scope.
  3. User confirms the fix.
  4. pnpm version:bump --scope <scope> patch.
  5. Push and redeploy.

What goes in which scope

Change Scope
Hub API endpoint, route, service hub
Web UI (any page in packages/web/src) hub
Inference worker (Python) hub
Shared types, MQTT protocol changes hub (heads-up: also bump satellite and mobile if the protocol break affects them)
Migration in packages/hub/src/db/migrate.ts hub
Documentation site (docs/) hub
Pi satellite TS code (capture, filter, outbox, scheduler) satellite
birdnet-update.sh / install.sh satellite
Mobile-app code (packages/mobile/src) mobile
Mobile native plugin (packages/mobile/android/app/src/main/java/...) mobile
build-apk.sh mobile