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.6-rc.1

Latest
September 21, 2026

v0.3.6-rc.1

Changelog

  • c97fd9efeat(diag): log every link report and let the operator download the device journal from the dashboard
  • fd27078feat(mavlink): report modem quality and camera bitrate to the ground station as CELLULAR_STATUS
  • e950bbdfeat(web): keep an hour of modem signal and camera bitrate history and draw it on the dashboard
  • 507fbeddocs: point apt instructions at apt.aircast.one
  • acea873Revert "fix: retire mavp2p" cleanup shims
  • 284885dfix: retire mavp2p, which has been crash-looping since the router moved in-process
  • 5ff9d6bstyle(ui): carry the blue into the light theme
  • d126357style(ui): share aircast-flasher's palette
  • 5867fbfrefactor(ui): every page is one surface, not a pile of panels
  • cdd2d8crefactor(ui): the telemetry page is one surface, not three
  • 844b0b3fix: the telemetry page answers the question it is read as asking
  • e86fee7fix: the MSP reader keeps its place, and the aircraft says what it is
  • eda3a36feat: a Betaflight aircraft reaches the ground station, and the ground reaches back
  • 4c58464fix: the last camera's port returns to the rescue too
  • c27eec5fix: rescue reconciler creates before it destroys, and never stops trying
  • ad95a4dfeat: managed rescue-ethernet profile that can never steal a camera port
  • 374dbb3test(e2e): cover the radio link end to end
  • 55a416efeat: the packet radio link works, and says so honestly
  • 161daa3feat: the dark-camera diagnosis measures instead of guessing, and closes its own loop
  • e29befefeat: the multi-camera page opens on a wall of live tiles
  • fe52249feat: icons on the setup rows
  • 5dd938afix: setup rows are solid surfaces, not windows onto the dot grid
  • 4a870e3fix: make the hero's interactive text look interactive
  • 51a6c3ffix: give the setup rows a readable hierarchy
  • 09cb245feat: redesign the camera page — picture-first hero, everything else folds
  • db00c7fharness: one-tap QGC setup link on MAVLink endpoints, register /telemetry page
  • f41e7a9feat: one-tap Aircast QGC setup link on the MAVLink endpoint card
  • 8459717feat: raise the UI type scale and tokenize the stray px sizes
  • 5c2b7e3feat: organize the camera page by intent — watch it, share it, send it
  • 0e75e70feat: the last hand-plumbed widgets are Alpine components
  • 97a0d05feat: the gimbal pad is an Alpine component
  • d7abbf2Merge origin/master
  • b95bc98Merge branch 'release/v0.3.1'
  • 91386bcfix: pin templ CLI version for code generation
  • a861c97ci: dispatch a Pi image build on an aircastd release
  • 80af8fdchore: ignore playwright-cli, test-results, harness bin, and python sidecar caches
  • cead002fix(release): snapshot versions must sort above the tag they follow
  • 44b21dbsave wip work
  • ccd9f95chore: bump aircast-media to v0.10.1
  • 27a6fdefix: the radio row said "connecting" and "unverified" at once
  • 0fb74dbfeat: ask the radio whether it is transmitting
  • 2f28097refactor: one letterbox, shared
  • b4bf345refactor: one letterbox, shared
  • 302de25feat: the radio link is a publishing destination, and says whether it works
  • 1b6764bfeat: the wizards are Alpine components
  • 23d003dfeat: the watch page answers the aiming task review
  • 4ed6ea1feat: send a camera over the packet radio link
  • 20c5297chore: aircast-media v0.9.5 — a source that will not connect says so
  • 7f069eechore: aircast-media v0.9.4
  • 6b2134bchore: aircast-media v0.9.3
  • 2c1f3f9chore: aircast-media v0.9.1 — on-demand paths can be published to more than once
  • 6a1fc52chore: aircast-media v0.9.0 — a publisher path accepts reconnections
  • 4c5906afix: consume rtspAnyPort, closing the last dropped path option
  • 8348681fix: the demo path waited for a publisher that was never coming
  • ce68d12chore: aircast-media v0.6.1 — publisher paths actually start
  • 2b3ea49fix: a cloud destination added later never reached the pipeline
  • 7f37e69feat: publish to the cloud from the pipeline that holds the camera
  • a51a7e0fix: cloud publishing would have stopped, silently
  • dd07d6afix: an H265 camera got no HLS at all
  • d174a2ffix: one unhappy sink made a working camera look dead
  • eca44e0fix: finish the esbuild extraction so releases ship the page JS
  • 8dc71ddfix: mounting metrics took the engine down
  • ddf9341fix: the engine's own endpoints were never mounted
  • e36a083chore: one rule per artifact in .gitignore
  • fc2a75cfeat: expose what the engine knows about itself
  • 914aa7cfix: the browser could not play from the engine at all
  • a66390cfix: the engine came up with no paths, no servers, and mediamtx stopped
  • 0b282ebfix: a publisher source waited on a path nothing publishes to
  • 0e761d5fix: take mediamtx's ports before the engine reaches for them
  • 12c2bf6feat: reconcile the engine's WebRTC addresses instead of refusing them
  • 796d267chore: depend on aircast-media v0.2.0
  • dbd29c2feat: carry video in-process, behind a stored setting
  • a9bd0eechore: ignore pycache, playwright-cli and test-results
  • 9f7895fdetect: report sidecar model state so a missing accelerator is named
  • 32e1581add AI work
  • 946624ctest(e2e): cover click-to-track and gimbal follow on the watch overlay
  • 931f5c3feat: click-to-track a detection and follow it with the SIYI gimbal
  • 8e9d480feat: push detections over SSE; fix detection latency + letterboxing
  • 2082c53feat: on-device AI detection, video-file camera source, watch reconnect
  • 6707952feat: route MAVLink in-process, and find cameras instead of asking for them
  • 5e65a68feat(share): hand someone the picture without handing over the device
  • 47beb53fix(flightlog): a fault that lasts an hour is one line, not three hundred
  • 5d0e72afix(provision): the exported file is a secret, and now says so
  • df1f9f3docs: record what features 7 and 8 actually needed
  • 7b8ac4afeat(provision): make airframe two a flash away, without baking secrets
  • 04bdd6ffix(web): make the verdict and the camera row agree on how bad it is
  • d271fe5feat(flightlog): give the operator a way to find out what happened
  • 5206b78fix(network): a link carrying none of the video is not a slow link
  • fc4180afeat(network): say whether the link can carry the video, not how strong it is
  • 72720a3feat(web): tell the operator which thing to touch, not that something is wrong
  • f9d2a83fix(pilot): a first alert has not been suppressed for 292 years
  • 35b868ffeat(pilot): log every alert decision, sent or held back
  • 8ce46e6feat(pilot): give the in-flight channel an owner and a policy
  • 6a6d7acfeat(web): make the Flight screen answer its question on a phone
  • 6156d46fix(stream): stop the camera sweep lying about where it looked
  • cb2f5e7feat(stream): find the camera instead of asking for its RTSP URL
  • 47fa1cbfix(web): stop an unknown live page polling the device forever
  • 4024314fix(web): land a dark camera on the fix, not on its SFU credentials
  • e4b27cdfeat(web): rebuild the device UI around the operator, not the subsystems
  • 4ecf0b7feat(web): make the ground-station links usable, and gate the e2e suite
  • 5a11b67test(e2e): cover the device UI end to end, and raise the alert when video stops
  • 757a430fix(web): make the Wi-Fi join form's mistakes visible and catchable
  • da4fd40refactor(web): derive the setup summary from one list of checks
  • 2024d61fix(web): address code review — expansion, dead code, magic strings, missing tests
  • 66981bdfix(web): make the device UI's structure hold up as the fleet grows
  • 8992acefix(web): field-level validation plus task-level UX fixes to the setup flow
  • 5ecd1a0fix(web): resolve device UI information-architecture defects
  • 6b91c7dMerge pull request #45 from aircast-one/fix/telemetry-unconfigured-not-error
  • 03db5dbMerge pull request #44 from aircast-one/feat/auto-transport-tcp
  • ab63be1chore: strip explanatory comments (house style)
  • 9ea3a9cchore: strip explanatory comments (house style)
  • fb78005fix(telemetry): treat missing/empty mavp2p config as unconfigured, not an error
  • 9a16802fix(streaming): address review of auto-transport reconciler
  • 2ba1c15feat(streaming): make "automatic" transport fall back to TCP on UDP frame loss
  • 7312801Merge pull request #43 from aircast-one/feat/camera-link-diagnosis
  • 4701394fix(streaming): address review of camera link diagnosis
  • 6f67f5efeat(streaming): name the real cause when a camera is unreachable
  • 421b235Merge pull request #41 from aircast-one/chore/ponytail-audit
  • b299408chore: cut duplicated plumbing across stores, poll loops and views
  • d588fb1Merge pull request #40 from aircast-one/fix/factory-reset-software-wipe
  • 3247047fix(reset): make factory reset actually clear state on any install
  • 2d303e0Merge pull request #39 from aircast-one/feat/operator-first-overview
  • ca0bb41chore(web): drop unused watchButtonVariant (lint)
  • 313193bfeat(web): clickable links + "Open in Aircast QGroundControl" deep link
  • 77f9ef6feat(web): make ground-station links the centerpiece with a decision aid
  • aa6aff5fix(web): keep ground-station links inline, not hidden
  • 56942aafeat(web): operator-first overview with live camera previews
  • 63452dfMerge pull request #38 from aircast-one/feat/stat-icons
  • 90b0ff2feat(web): add icons to overview stat cards
  • 3f0e3e7Merge pull request #37 from aircast-one/chore/strip-comments
  • a042441chore: strip explanatory comments across the codebase
  • 2669133Merge pull request #35 from aircast-one/ui/operator-video-links
  • 8c1ff37feat(web): operator endpoints UX + BYO public Cloudflare viewer
  • 3bf882aMerge pull request #36 from aircast-one/feat/multi-destination-publish
  • 00cdc48feat(sfu): publish each camera to multiple destinations concurrently
  • fd45facMerge pull request #34 from aircast-one/ui/cloudflare-card-guidance
  • 62f4c6dfix(sfu): harden the Cloudflare WHEP bridge and extract CloudflareWatch
  • 04fa539fix(sfu): review follow-ups for the Cloudflare WHEP bridge
  • eafa122fix(sfu): harden cloudflare target parsing for gosec taint findings
  • 393d6befeat(sfu): Cloudflare Realtime UX, truthful publish health, and WHEP playback bridge
  • 7262655Merge pull request #33 from aircast-one/ui/destination-guidance
  • 22edba8fix(web): name the exact action in unsaved-choice guidance
  • 7ebed7bMerge pull request #30 from aircast-one/ui/flatten-video-streaming-card
  • 164fc5dchore: drop unused badgeIf
  • d89c38cfeat(web): destination-first publishing UX with honest health everywhere
  • 520eaeafeat(web): coherent sign-in story — persistent verdict, managed mode, honest actions
  • f290f71feat(sfu): test sign-in on save, configure LiveKit destination in one form
  • a6c8f2achore: review fixes — shared mint status, e2e CI warm-up and browser cache
  • d5192ddfeat(web): flatten video streaming card to two levels with one status
  • 2fdf116Merge pull request #31 from aircast-one/fix/overview-watch-live-button
  • 8fb3474fix(web): restore Watch live button on overview video card
  • 177b61eMerge pull request #29 from aircast-one/ui/operator-friendly-settings
  • 1877f3fMerge remote-tracking branch 'origin/master' into ui/operator-friendly-settings
  • e2b5a42Merge pull request #28 from aircast-one/feat/sfu-publish-modes
  • 4a805f7fix(web): scope sign-in modes to the WHIP path, keep coexisting credentials
  • b3154e5feat(web): operator-friendly settings page
  • a8da6f0chore: upgrade templ to v0.3.1020 and regenerate
  • cb6f3cfchore(build): pin templ via go.mod tool directive
  • 4371ef7Merge remote-tracking branch 'origin/master' into feat/sfu-publish-modes
  • 9f401f1feat(web): mode-based SFU publishing form with visible credentials
  • d54fc23Merge pull request #27 from aircast-one/fix/cloud-connect-stuck-working
  • 39224e4Merge pull request #26 from aircast-one/chore/upgrade-templ-0.3.1001
  • 98278bafeat(stream): relabel WHEP for operators
  • a4d3927fix(web): bound form fetches and reload past dead SSE on cloud connect
  • 5b6c37achore: upgrade templ to v0.3.1001 and regenerate
  • 946cfc9feat(stream): drop WebRTC from pull-endpoint list

v0.3.5

August 22, 2026

v0.3.5

Changelog

  • 301cff6refactor: drop redundant DataStalled check from UplinkUsable
  • a68d1e1feat: validate mediamtx path names before merging stream patches
  • 8ab6594fix: raise hotspot immediately when the saved wifi fails
  • fc203b8fix: gate hotspot reachability on tailscale being up
  • 7554efffix: don't treat a freshly reset bearer as a usable uplink
  • 91386bcfix: pin templ CLI version for code generation
  • a861c97ci: dispatch a Pi image build on an aircastd release
  • 80af8fdchore: ignore playwright-cli, test-results, harness bin, and python sidecar caches

v0.3.4

August 22, 2026

v0.3.4

Changelog

  • ad6d874fix(tailscale): use a pre-auth key without a Headscale control server

v0.3.2

August 22, 2026

v0.3.2

Changelog

  • ad6d874fix(tailscale): use a pre-auth key without a Headscale control server

v0.3.1

August 22, 2026

v0.3.1

Changelog

  • 5ea84abfix(network): raise the hotspot when no Wi-Fi client profile exists

v0.3.0

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 about 5 minutes

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

Download the Flasher
Releases - Aircast Documentation | AirCast