Releases

Download the latest Aircast Raspberry Pi images and view version history.

Flashing manually? Write the .img.xz with Raspberry Pi Imager or balenaEtcher, and use the imager's OS customisation to set Wi-Fi and hostname before writing. The Aircast Flasher does all of this for you.

v0.3.0

Latest
July 18, 2026

v0.3.0

Changelog

  • a022e34Merge pull request #24 from aircast-one/fix/camera-interface-validation
  • 1f470ccfeat(web): copy-ready RTSP/WHEP links per camera on overview
  • 63655b0Merge pull request #23 from aircast-one/fix/camera-interface-validation
  • 0ff1df5fix: harden camera setup review findings
  • dc6c7f7fix: typed interfaces in e2e harness fixture
  • 793cc06Merge remote-tracking branch 'origin/master' into fix/camera-interface-validation
  • b12e319fix: type-aware interface handling in camera setup
  • 486d82cMerge pull request #20 from aircast-one/feat/sfu-cloud-provisioned-config
  • f74a844Merge branch 'feat/sfu-cloud-provisioned-config' of github.com:aircast-one/aircastd into feat/sfu-cloud-provisioned-config
  • 0e94524fix(ui): drop raw WHEP share links — sharing goes through cloud watch links
  • ad72294fix(identity): harden enrollment — flow-scoped failures, https-only cloud API, ctx-scoped OnEnroll
  • 73871ecMerge branch 'master' into feat/sfu-cloud-provisioned-config
  • 1c46112Merge pull request #22 from aircast-one/feat/sfu-publish-secrets
  • b56c5b6chore: drop LOG_FORMAT; console format is JSON, journalctl renders it
  • 16f4d3fsecurity: pipe the streamer publish token via stdin, not env
  • 0775e15Merge remote-tracking branch 'origin/master'
  • 37c8552feat(sfu): per-camera publish secrets for cloudflare:// and livekit:// targets
  • b1123a0fix(ui): dedupe watch actions and WHEP labels in the camera cloud card
  • 7e49e7drefactor(ui): collapse config sections behind one-line disclosures
  • 03d592afeat(ui): surface wss:// LiveKit in the custom-SFU target field
  • ab18f9drefactor(sfu): pass publish token via stdin, not an env var
  • fe1d0cetest(e2e): Playwright harness for the settings UI
  • 95afa68feat(sfu): native LiveKit publishing and hardened third-party SFU auth
  • 2bd01bbfix: CI data race, lint, and unauthenticated pprof exposure
  • e723c34SFU publishing: support static bearer token and configurable scope so aircastd can publish to any third-party WHIP SFU (open, token/API-key, or OAuth)
  • fd8b523Expose net/http/pprof endpoints for on-device profiling
  • 697e10daircastd cloud enrollment: OAuth device-flow, auto-provisioned SFU publish creds, camera auto-connect, and /live watch link
  • eb84035Merge pull request #21 from aircast-one/fix/cn-concurrency
  • dd6d9e0Serialize ui.cn behind a mutex; twmerge's global LRU cache is not concurrency-safe and corrupts under concurrent template renders
  • a89387eSerialize ui.cn behind a mutex; twmerge's global LRU cache is not concurrency-safe and corrupts under concurrent template renders
  • 3861975resolve review: 600-perm provisioned oauth config, log credential overrides, reject custom issuers on one-click connect, add tests
  • 1df28dfSFU cloud: read OAuth from provisioned /etc/aircast/oauth.json, drop hardcoded prod fallbacks, provision per-env via deploy/pi-gen
  • d686fc9Merge pull request #16 from aircast-one/feat/aircastd-oauth-publish-token
  • f602f40feat(web): link to cloud device page when publish token mints
  • 88821bafeat(web): show SFU publish-token health; fix token URL placeholder
  • 1b883c8feat(sfu): drop publish-token audience; SFU audience is server-set
  • 3d66993feat(sfu): configure publish OAuth via UI settings, not env vars
  • b76629cfix(sfu): launch tokenless on mint failure; review follow-ups
  • 239015frefactor: mint publish token via x/oauth2/clientcredentials
  • 25bcd9csecurity(sfu): OAuth-only publish tokens; harden minter (R3.1 + R3.7)
  • cbfb1bcrefactor: derive device id from /etc/machine-id
  • c5b6c70security(sfu): quarantine required-but-tokenless streamer launches
  • 8d45a72security: pass publish token via env, not streamer argv
  • bb89bc1refactor: rename authclient.Manager to Minter
  • b874c9bbuild: fetch tags before releasing; warn when streamer missing on deploy
  • be23260feat(sfu): mint sfu:publish tokens via OAuth2 client credentials
  • a4c929dRemove dead Swagger stack and collapse single-impl interfaces
  • 6224eaeMerge pull request #15 from aircast-one/chore/release-via-reusable-workflow
  • 89f17e2ci: use the reusable go-release workflow
  • 88bcf7efix(release): scope S3 artifact deletion to this repo's package

v0.2.1-dev.7

July 18, 2026

v0.2.1-dev.7

Changelog

  • a022e34Merge pull request #24 from aircast-one/fix/camera-interface-validation
  • 1f470ccfeat(web): copy-ready RTSP/WHEP links per camera on overview
  • 63655b0Merge pull request #23 from aircast-one/fix/camera-interface-validation
  • 0ff1df5fix: harden camera setup review findings
  • dc6c7f7fix: typed interfaces in e2e harness fixture
  • 793cc06Merge remote-tracking branch 'origin/master' into fix/camera-interface-validation
  • b12e319fix: type-aware interface handling in camera setup
  • 486d82cMerge pull request #20 from aircast-one/feat/sfu-cloud-provisioned-config
  • f74a844Merge branch 'feat/sfu-cloud-provisioned-config' of github.com:aircast-one/aircastd into feat/sfu-cloud-provisioned-config
  • 0e94524fix(ui): drop raw WHEP share links — sharing goes through cloud watch links
  • ad72294fix(identity): harden enrollment — flow-scoped failures, https-only cloud API, ctx-scoped OnEnroll
  • 73871ecMerge branch 'master' into feat/sfu-cloud-provisioned-config
  • 1c46112Merge pull request #22 from aircast-one/feat/sfu-publish-secrets
  • b56c5b6chore: drop LOG_FORMAT; console format is JSON, journalctl renders it
  • 16f4d3fsecurity: pipe the streamer publish token via stdin, not env
  • 0775e15Merge remote-tracking branch 'origin/master'
  • 37c8552feat(sfu): per-camera publish secrets for cloudflare:// and livekit:// targets
  • b1123a0fix(ui): dedupe watch actions and WHEP labels in the camera cloud card
  • 7e49e7drefactor(ui): collapse config sections behind one-line disclosures
  • 03d592afeat(ui): surface wss:// LiveKit in the custom-SFU target field
  • ab18f9drefactor(sfu): pass publish token via stdin, not an env var
  • fe1d0cetest(e2e): Playwright harness for the settings UI
  • 95afa68feat(sfu): native LiveKit publishing and hardened third-party SFU auth
  • 2bd01bbfix: CI data race, lint, and unauthenticated pprof exposure
  • e723c34SFU publishing: support static bearer token and configurable scope so aircastd can publish to any third-party WHIP SFU (open, token/API-key, or OAuth)
  • fd8b523Expose net/http/pprof endpoints for on-device profiling
  • 697e10daircastd cloud enrollment: OAuth device-flow, auto-provisioned SFU publish creds, camera auto-connect, and /live watch link
  • eb84035Merge pull request #21 from aircast-one/fix/cn-concurrency
  • dd6d9e0Serialize ui.cn behind a mutex; twmerge's global LRU cache is not concurrency-safe and corrupts under concurrent template renders
  • a89387eSerialize ui.cn behind a mutex; twmerge's global LRU cache is not concurrency-safe and corrupts under concurrent template renders
  • 3861975resolve review: 600-perm provisioned oauth config, log credential overrides, reject custom issuers on one-click connect, add tests
  • 1df28dfSFU cloud: read OAuth from provisioned /etc/aircast/oauth.json, drop hardcoded prod fallbacks, provision per-env via deploy/pi-gen
  • d686fc9Merge pull request #16 from aircast-one/feat/aircastd-oauth-publish-token
  • f602f40feat(web): link to cloud device page when publish token mints
  • 88821bafeat(web): show SFU publish-token health; fix token URL placeholder
  • 1b883c8feat(sfu): drop publish-token audience; SFU audience is server-set
  • 3d66993feat(sfu): configure publish OAuth via UI settings, not env vars
  • b76629cfix(sfu): launch tokenless on mint failure; review follow-ups
  • 239015frefactor: mint publish token via x/oauth2/clientcredentials
  • 25bcd9csecurity(sfu): OAuth-only publish tokens; harden minter (R3.1 + R3.7)
  • cbfb1bcrefactor: derive device id from /etc/machine-id
  • c5b6c70security(sfu): quarantine required-but-tokenless streamer launches
  • 8d45a72security: pass publish token via env, not streamer argv
  • bb89bc1refactor: rename authclient.Manager to Minter
  • b874c9bbuild: fetch tags before releasing; warn when streamer missing on deploy
  • be23260feat(sfu): mint sfu:publish tokens via OAuth2 client credentials
  • a4c929dRemove dead Swagger stack and collapse single-impl interfaces
  • 6224eaeMerge pull request #15 from aircast-one/chore/release-via-reusable-workflow
  • 89f17e2ci: use the reusable go-release workflow
  • 88bcf7efix(release): scope S3 artifact deletion to this repo's package

v0.2.1-dev.6

July 8, 2026

v0.2.1-dev.6

Changelog

  • 4a1bcf7fix(release): never reuse a deleted release's suffix number
  • 93029bfbuild: decouple aircast-streamer deploy — it ships from its own repo
  • b403e91fix: bound modem dead-path recovery and close usage/UI review findings
  • 9d7809cweb: split page templates per-domain; merge network usage into interfaces
  • 60510b1Merge pull request #13 from aircast-one/fix/external-integration-error-visibility
  • 5fe59d2fix(lint): clear findings exposed once CI could fetch private deps
  • bcadb77ci: authenticate to private aircast-one modules in test workflow
  • f29c736fix(sfu): surface streamer logs and name camera-source stalls
  • 70d5862Fix false-positive diagnostics from the error-visibility change
  • 8a0cfaafix(stream): remove transport watchdog that starved RTCP cameras
  • eda795eSurface silent systemd/mediamtx failures during reconcile
  • 6e68129Add SFU streaming, Starlink telemetry, usage budgets, and remote diagnostics
  • 3051f05feat(sfu): swap gstreamer whip-client for native aircast-streamer
  • 6a44cb8feat: cellular data-usage tracking + SFU WHIP publishing, with UI refactor
  • a557ff3Add watch page with SFU streaming, telemetry feed, and WHEP endpoints

v0.2.1-dev.5

July 1, 2026

v0.2.1-dev.5

Changelog

  • f6e23b7fix(web): commit stream-mode/ICE source left out of 53ef163
  • d4fbc54Add spinner and status icons to camera wizard apply step
  • 92b3890Merge pull request #3 from aircast-one/fix/mediamtx-reload-timeout
  • 6e2c813fix(mediamtx): drive config via file auto-reload; restructure package

v0.2.1-dev.3

June 30, 2026

v0.2.1-dev.3

Changelog

  • 24a96f7feat(web): unify dashboard theme with aircast-website
  • 4dc2eccstream: diagnose camera setup failures instead of a bare live flag
  • 59c21e6chore: merge rerelease into release.sh rerun command

v0.2.1-dev.2

June 29, 2026

v0.2.1-dev.2

Changelog

  • 3450bb0feat(aircastd): Wi-Fi onboarding, setup wizard, network refactor
  • 5f9a3f5feat(tailscale): auto-connect on boot when a control server + key are set
  • e4cbf97stream: pin mediamtx WebRTC ICE candidates to reachable IPv4 hosts
  • 7d8f972fix(tailscale): guard config mutations during switch; atomic ClearAuthKey
  • 31ab635fix(tailscale): harden Headscale control-server store and switch handler
  • 7d216eafeat(tailscale): Headscale control-server support with safe switching
  • d065d7bfix(ui): style Select to match shadcn inputs
  • b254d72fix(telemetry): drop udp:// prefix from MAVLink endpoint

v0.2.1-dev.1

June 28, 2026

v0.2.1-dev.1

Changelog

  • 3450bb0feat(aircastd): Wi-Fi onboarding, setup wizard, network refactor
  • 5f9a3f5feat(tailscale): auto-connect on boot when a control server + key are set
  • e4cbf97stream: pin mediamtx WebRTC ICE candidates to reachable IPv4 hosts
  • 7d8f972fix(tailscale): guard config mutations during switch; atomic ClearAuthKey
  • 31ab635fix(tailscale): harden Headscale control-server store and switch handler
  • 7d216eafeat(tailscale): Headscale control-server support with safe switching
  • d065d7bfix(ui): style Select to match shadcn inputs
  • b254d72fix(telemetry): drop udp:// prefix from MAVLink endpoint

v0.2.0

June 22, 2026

v0.2.0

Changelog

  • d543c9efeat(streaming,network): transport watchdog, config-merge fix, wizard/UI work
  • aa7ac39feat(streaming,network): guided camera wizard, per-camera RTSP transport, interface validation
  • 4f5aba6feat(network): connection management + split network package
  • 6f3d77efeat(network): NetworkManager connection management + UI component library
  • 6a965f2feat(network): interface config API + link-priority view
  • e6b6fa4fix(modem): fall back to LTE attach APN when the bearer omits it
  • 25c0668refactor: code-review cleanups + network status redesign
  • 9476cc1refactor: vertical-module architecture for the HTTP layer

v0.1.0

June 22, 2026

v0.1.0

Changelog

  • d543c9efeat(streaming,network): transport watchdog, config-merge fix, wizard/UI work
  • aa7ac39feat(streaming,network): guided camera wizard, per-camera RTSP transport, interface validation
  • 4f5aba6feat(network): connection management + split network package
  • 6f3d77efeat(network): NetworkManager connection management + UI component library
  • 6a965f2feat(network): interface config API + link-priority view
  • e6b6fa4fix(modem): fall back to LTE attach APN when the bearer omits it
  • 25c0668refactor: code-review cleanups + network status redesign
  • 9476cc1refactor: vertical-module architecture for the HTTP layer

v0.0.1

June 21, 2026

v0.0.1

Changelog

  • 3d2afe8fix(deps): complete go.sum hash entries for clean release
  • 537da7cupdate dependencies
  • 89cbd10ci(release): drop inline Pi image dispatch; deployer handles it
  • de017c5ci(release): build aircast-pi-gen from lite-arm64 branch
  • 39c63dffeat: JSON control API, mediamtx config self-repair, dashboard rework
  • b8ee94bfix(network): omit gateway and clear stale addresses on static camera IP
  • 3de53d7refactor: modular provider architecture on a type-keyed DI container
  • 8a8f4d5refactor(mediamtx): extract config persistence behind configStore interface
  • 12c31fbfix(mavp2p): validate MAVLink frame structure in ACM probe
  • 7b7fa05feat(web): live SSE dashboard + Tailscale interactive login

v0.0.1-dev.2

June 18, 2026

v0.0.1-dev.2

Changelog

  • 1596830feat(web): router-style multi-page dashboard, camera network, flash messages

v0.0.1-dev.1

June 18, 2026

v0.0.1-dev.1

Changelog

  • 2ea77f0feat(web): drop auto page reload
  • e992622feat(web): tailscale panel + dashboard redesign; mediamtx paths from config
  • ab0e4d4feat(web): router-style dashboard layout
  • 18c43a8feat(web): edit mediamtx camera source from the landing page
  • 578c6d4harden: modem int-overflow guards, deploy reliability, cleaner shutdown
  • ea8a36ffeat(web): list real mediamtx stream paths on the landing page
  • 156b183feat(web): document connection endpoints on the landing page
  • 8311c4cMerge remote-tracking branch 'origin/master'
  • ff4bb88Merge pull request #2 from aircast-one/feat/templ-landing-page
  • bace6b0Add delivery pipeline, mediamtx Control API, mavp2p autodetect, slog
  • 0adb148fix(web): 404 unknown paths, use strconv.Itoa, drop contradictory Known
  • 66cbfd6fix(web): address code review
  • 0cd612achore(web): remove static landing page superseded by templ
  • bd0245ffeat(web): render landing page with templ, show modem status
  • 9b8817dMerge pull request #1 from aircast-one/worktree-agent-a36954bbdb61bd708
  • 3d2b491fix(modem): surface staleness, fix flaky test, 503 on not-ready
  • 29eb11bfix(modem): address code review
  • 85a6894refactor(config): drop speculative env overrides
  • efc0e99feat(modem): add read-only modem/cellular observability
  • 36d8493Initial aircastd: HTTP control plane managing mediamtx and mavp2p

Flash your Pi in ~10 minutes

The Aircast Flasher downloads the image, sets Wi-Fi and hostname, and verifies the card — no terminal.

Download the Flasher
Releases - Aircast Documentation | AirCast