pgpilot flight companion
Navigation
Free · Designed for iPad. Not verified for macOS.
Simply the most awesome flight companion for paragliding. Just log in and fly!
Features:
- All the standard stuff: thermal assist, navigation, instrument panels etc.
- External vario + PTT button over bluetooth.
- Voice chat directly in the app (!)
- Create groups with private chats, share tasks, etc.
- Visualize potential landing spots with glide range layer on the map.
- Takeoffs, landings, live wind, thermal hotspots, ++
We are in beta, expect some hard edges and give feedback!
more A big Bluetooth rework, a sharper Side View, and a thermal bubble you can put where you like
• We rebuilt how the app talks to your vario over Bluetooth. Connections come back far more reliably after a dropout, you can run more than one vario at once, and you choose per device whether to use the vario's own climb readings or the app's. If your vario reports temperature and humidity, you'll see those too.
• The Side View got a proper cleanup — it's one widget now, with a switch for whether it follows your heading or the route to your next waypoint. Airspaces, contrast, and waypoint markers are all easier to read at a glance.
• The thermal bubble is now a widget you can place wherever you like — it no longer has to sit in the middle of the map, so you can tuck it out of the way and keep your view clear.
• Tap a pilot on the map for a lot more: navigate straight to them, mark them as a buddy, jump to their group, or grab a share link.
• XContest does more than sync now — your flights upload to XContest straight from the app.
• The terrain hillshade is now lit by the real sun position for the time of day, so the relief looks the way it actually does out there.
• New true-black map style that's easier on the battery on OLED screens.
• The Side View is much smoother now. It was quietly redoing a lot of work several times a second, which could make the whole app feel sluggish with it open — that's sorted.
• When you replay a flight, your own marker shows as an arrow again instead of the walking icon.
• Auto-recenter behaves better — it backs off the moment you pan, and stays put while you've got a menu open.
• Voice you missed while the app was in the background now recovers properly instead of going quiet.
• Tapping the compass does the right thing whether you're in north-up or track-up.
• Vario connections rank devices more sensibly, so the app stops latching onto things that aren't your vario.
• A keyed-up wake tap no longer fires push-to-talk by accident.
2026.6.8 3d ago
- test(xcontest): run coros on a dedicated-thread loop to fix xdist event-loop clash (#825)
- release: 2026.6.5.1346 — reliable PTT on weak signal + LiveTrack24 live tracking (#824)
- feat(voice): join-first PTT - wait for channel rejoin before transmitting (#822)
- docs(livetrack24): fix stale push docstring (livetrack_enabled, no feature flag) (#823)
- fix(comms): reconcile PTT connection indicator with real channel state (#818)
- fix(voice): broadcast v2 chunks during channel reconnect ('connecting') (#816)
- chore(backlog): TASK-462.1 done (LiveTrack24 push merged, PRs #811 #821)
- feat(livetrack24): enable push for all users via livetrack_enabled toggle (#821)
- fix(flightlog): badge reads the sync root so uploaded flights stop showing "Not uploaded" (#820)
- feat(classifier): drive rule + stats fallback for trackless flights (#817)
- fix(sync): resync from real live_tracks coverage, not the lying count column (#819)
- chore(backlog): TASK-464 XContest live-push follow-ups (PR #813 merged)
- feat(xcontest-push): relay pilot positions to the XContest live map (owner-gated)
- chore(backlog): TASK-463 resync staleness fix (PR #819) addresses chunk-backfill gap
- feat(livetrack24): backend push relay of live flights (TASK-462.1) (#811)
- chore(backlog): TASK-463 app flights lose cloud track when live_tracks never sync
- chore(backlog): TASK-450 quiet-period outcome - still blocked, likely range-level
- fix(airspace): show on ground, distance-only line fallback, compact status pill (#815)
2026.6.5 6d ago
- release: 2026.6.4.2113 — airspace overhaul, task line, metres-when-close, hike/fly (#814)
- Airspace overhaul: unified analysis, status pills, single instrument, datum correctness (#809)
- feat(flights): hike/fly split — fix activity data loss, distinct hike color, bulk delete (#812)
- chore(backlog): TASK-462.1 in progress (push PR #811)
- fix(task): full optimized line for task distance/altitude, meters-when-close, waypoint sounds (#810)
- docs(backlog): validate XContest Live push protocol end-to-end
- chore(backlog): add LiveTrack24 integration tasks (TASK-462 push/pull)
- docs(backlog): reverse-engineered XCTrack XContest Live push protocol
- ci(android): wire store-listing icon/graphics sync to Play Console (#807)
- chore(backlog): add battery next-frontier task
- docs(backlog): iOS battery experiments report (dedup validation, deadband, journey, next frontier)
2026.6.4 Jun 5
- Release 2026.6.3.2245 — Grenoble pass 1 (release notes) (#806)
- fix(fai-assist): bend FAI assist arcs into iso-perimeter ellipses (FAI-clipped) (#799)
- chore(backlog): mark TASK-459 + TASK-458 Done (shipped in #803)
- perf(map): persistent setData de-dup + fix GPS-inject seam (TASK-459, TASK-458) (#803)
- feat(network): @capacitor/network as native connectivity trigger + cadence input (TASK-460) (#805)
- feat(instruments): thicker black outline on instrument values for legibility (#804)
- chore(backlog): renumber map-gate de-dup task 457->459 (457 taken by merged voice task)
- chore(backlog): add TASK-457 (map-gate persistent de-dup) + TASK-458 (fix GPS-inject seam) from iOS battery investigation
- fix(voice): re-fetch chat history on Realtime reconnect to recover missed PTT (TASK-457) (#801)
- chore(backlog): renumber duplicate TASK-454 (resume→455, roger-beep→456; iOS-bg keeps 454)
- feat(voice): background PTT playback on iOS via silent-audio keep-alive (Sleep-gated) (TASK-454) (#793)
- fix(voice): always deliver unheard PTT messages via listen-outcome model (TASK-454) (#795)
- fix(voice): play PTT opener roger-beep before mic opens so it isn't transmitted (#797)
- fix(comms): give PTT button the frosted shadow halo other buttons have (#800)
- chore(backlog): TASK-453 done (brightness arbiter + iOS plugin fix, PR #794)
- Centralized brightness arbiter + ON/OFF-Auto model (TASK-453) (#794)
- fix(flight): cross-check Doppler speed vs ground movement to stop false indoor takeoffs (#798)
- fix(map): correct flight-track z-order + consolidate map layer ordering (#796)
- chore(backlog): TASK-453 in progress (PR #794)
- chore(backlog): add brightness arbiter + ON/OFF-Auto task
2026.6.3 Jun 4
- chore(release): 2026.5.25.2200 — font size, nicknames, obstacles fix (#760)
- feat(display): font size scale setting (0.8x-1.6x) (#759)
- feat(profile): pilot nickname for compact map labels (#756)
- fix(sw): obstacles 8s timeout aborted cold cache, killed the layer (#758)
- feat(presence): align position-reporting timers to wall-clock multiples (#757)
- fix(ios-ptt): self-heal stuck recorder state on next press (#754)
- fix(comms): bump group-channel recreate delay 500ms → 5s (#755)
- chore(map): tune non-buddy pilot icon sizes (#753)
- fix(comms): force-recreate group channel on CHANNEL_ERROR/TIMED_OUT too (#752)
2026.5.25 May 26
- chore(release): 2026.5.24.2100 — sticky BLE reconnect, terrain styles
- fix(ios-ble): keep retrying auto-connect like Android (TASK-438) (#747)
- chore(map): shrink non-group pilot icons (buddies 60%, others 20%) (#746)
- feat(map): add Google Terrain and Hybrid raster styles (#745)
- fix(ios-auth): keep pilots signed in across app backgrounding (#744)
- feat(altitude): auto-QNH calibrates baro to GPS pre-takeoff (#742)
- chore(backlog): add task-high.98 — move data_pipeline scheduler to dedicated thread (#743)
- chore(backlog): record task-441 (bubble thermal-assist freeze fix, PR #740) (#741)
- fix(thermal-assist): re-sample bubbles on every fix, not just at activation (#740)
- chore(backlog): add task-high.98 — move data_pipeline scheduler to dedicated thread (#738)
- docs(healthcheck): add HEALTHCHECK.md + incident log (draft) (#737)
- perf(realtime): double broadcast flush intervals to halve Supabase load (#736)
2026.5.24 May 25
- chore(release-notes): expand 2026.5.23.2002 with PTT, comms, backend fixes
- chore(release): 2026.5.23.2002 - fix Vegard 7h ghost flight + dedup cloud chunks
- fix(flight-cloud): make track chunk upload idempotent (TASK-439) (#735)
- fix(flight): auto-stop stale sessions on extended GPS silence (#734)
- fix(backend): bound httpx pools + retain orphan asyncio tasks (#732)
- fix(comms): throttle comms_channel_state_change emission at source (#733)
- chore(ops): add Fly -> Axiom log-shipper runbook + setup script (#731)
- fix(nav): stop navigation_started event storm tripping Supabase readonly (#728)
- feat(events): per-event-name rate limit to cap analytics storms (#729)
- fix(realtime): mirror channel.state on worker proxy (TASK-438) (#727)
- chore(ops): add Supabase emergency recovery script (#730)
- chore(voice): revert v2 default to off pending receiver regression (#725)
2026.5.23 May 24
- chore(release): 2026.5.21.2138 — orientation + edit-mode + safe-area + landing fixes (#723)
- fix(display): reapply safe-area override after native re-injection (#721)
- fix(landing): reset detector on wake gap to prevent Android brief-background false trigger (#722)
- fix(instruments): center edit toolbar + displace widgets on resize (#720)
2026.5.22 May 22
- chore(release): 2026.5.21.1037 - orientation revert (#719)
- feat(panel): restore device-driven orientation with global override (#717)
- perf(data_pipeline): probe metadata first in supervised tick, skip 10MB+ data fetch when unchanged (#718)
- fix(db): wrap index_advisor_run in plpgsql with DEALLOCATE ALL (#716)
- fix(db): drop schema prefix on index_advisor call (fixes #712/#714 retry) (#715)
- fix(db): enable hypopg before index_advisor in PR #712 migration (#714)
- chore(db): enable index_advisor extension + expose service-role RPC (#712)
- chore(backlog): file flights-uuid followups (TASK-436, TASK-437) (#711)
- fix(feed): skip non-UUID flight ids in kudos/comments/cloud queries (#709)
- fix(ci): make Android versionCode monotonic across workflows (#710)
- fix(forecast): pass takeoff: ids through normalization (#704)
- chore(release): add 2026.5.20.1721 notes for TestFlight push (#708)
- chore(db): add pilot_buddies(user_id) + groups(created_at,archived=false) indexes (#707)
- feat(map): lower MapLibre pixelRatio 1.5 -> 1.25 (TASK-437 H2) (#682)
- MapGate: three-lane MapLibre update scheduler (TASK-438) (#693)
- chore(db): tighten external_tracks retention to 500-row batches every minute (#705)
- feat: 3-stage battery saver with cascading auto-dim (TASK-434) (#697)
- test(qa,theme): use open_comms_sheet / open_settings_sheet helpers (#703)
- ci(tests): rerun playwright timeout flakes once (#702)
- test(rain_radar): use canonical open_settings_sheet helper (#701)
2026.5.21 May 21
- chore(release): add 2026.5.20.1721 notes for TestFlight push (#708)
- chore(db): add pilot_buddies(user_id) + groups(created_at,archived=false) indexes (#707)
- feat(map): lower MapLibre pixelRatio 1.5 -> 1.25 (TASK-437 H2) (#682)
- MapGate: three-lane MapLibre update scheduler (TASK-438) (#693)
- chore(db): tighten external_tracks retention to 500-row batches every minute (#705)
- feat: 3-stage battery saver with cascading auto-dim (TASK-434) (#697)
- test(qa,theme): use open_comms_sheet / open_settings_sheet helpers (#703)
- ci(tests): rerun playwright timeout flakes once (#702)
- test(rain_radar): use canonical open_settings_sheet helper (#701)
- test(settings,theme): gate Settings sheet on translate-y-0, not heading (#700)
- test(voice-delete): convert unit tests to async to coexist with Playwright loop (#699)
- test(replay): mark full_visual_sequence as visual to unhang CI (#698)
- ci(tests): bump E2E timeout to 75 min and cache deps (#696)
- feat(airspace): user-uploaded custom airspaces (OpenAir + GeoJSON) (#694)
- style(light-map): clearer roads in PGpilot (Light) (#695)
- feat(panel): per-page Orientation toggle + filter presets by orientation (#687)
- chore(layouts): double landscape action-button height (#684)
- fix(fan_in): L1 escalate on prolonged event staleness even when reconnects succeed (#681)
- ci(tests): hardcode cancel-in-progress: false (fixes PR #674 regression) (#680)
- revert(map): restore openfreemap_flying as DEFAULT_MAP_STYLE (#679)
2026.5.20 May 20
- chore(release): 2026.5.18.1913 — fix offline pack airspace/obstacles eviction regression
- fix(sw): preserve primed offline-pack airspace/obstacles on activate (#644)
2026.5.18 May 19
- chore(release): 2026.5.16.2059 - landing prompt fix, offline data persistence, backend stability (#627)
- fix(view-data): encode response off-loop so jsonable_encoder stops blocking /api/health (#626)
- fix(realtime): per-channel startup jitter so tile bursts don't synchronize (#625)
- make live wind arrows 20% larger per pilot feedback (#624)
- chore(landing): extend non-hike landing prompt countdown 10s -> 20s (#623)
- fix(landing): trust baro vario for stale-GPS gate instead of 60-fix fallback (#620)
- fix(offline): persist data cache across releases + cover obstacles/NOTAMs/wind (#621)
- fix(data_pipeline): 30 min poll + per-loop startup jitter (kill TLS bursts) (#622)
- Revert "fix(data_pipeline): cap concurrent ticks with semaphore to avoid TLS-handshake bursts (#617)" (#619)
- ci(ios): preflight on Ubuntu + submit on Ubuntu + Pod/SPM cache (#618)
- fix(data_pipeline): cap concurrent ticks with semaphore to avoid TLS-handshake bursts (#617)
- fix(realtime/bus): always yield in upsert/append (one fix, all producers) (#616)
- fix(ogn/client): yield to event loop between APRS beacons (#614)
- fix(auto_upload): yield to event loop between users in poll cycle (#613)
- fix(watchdog): write thread stacks to disk + flush before os._exit (#611)
- Revert "fix(backend): parallelise InReach polls + dump loop stack on watchdog lag (#610)" (#612)
- fix(backend): parallelise InReach polls + dump loop stack on watchdog lag (#610)
2026.5.16 May 17
- chore(release): 2026.5.14.2041 - rename Beta badges to New (Apple 2.2 reject) (#602)
- chore(ci): add cancel-app-store-submissions to asc-query workflow (#601)
2026.5.14 May 14
- chore(release): bump versionCode 378 + release notes for v2026.5.9.0725 (#537)
- feat(thermal-assist): bubble overlay mode (TASK-391) (#534)
- feat(realtime): flip DEFAULT_REALTIME_WORKER_ENABLED to true (TASK-HIGH.84) (#536)
- chore(test-harness): add Maestro flow that PTTs into a group end-to-end (#535)
- chore(backlog): TASK-HIGH.88 done — script shipped, BO already fixed by #529
- feat(android): single-swipe immersive + system-bars settings toggle
- feat(scripts): one-shot FL backfill matcher for un-linked flights
- chore(backlog): TASK-HIGH.88 — FL backfill (retro-link existing un-linked trips, follow-up to #529)
- chore(backlog): TASK-227 full plan — non-sticky immersive + Settings toggle, with outreach emails
- fix(map): recover MapLibre render loop on reentrancy error (TASK-HIGH.87)
- fix(sync): keep XC->FL writing reconciler disabled in auto_upload (TASK-326)
- chore(backlog): TASK-HIGH.87 — recover MapLibre render loop on suppressed reentrancy error (replay white-page bug)
- feat(ble): enrich diagnostic logs so failed connects are self-explaining
- chore(backlog): mark TASK-HIGH.86 done (PR #525)
- feat(ble): forget-device banner + exponential backoff for stuck connects
- fix(ble): probe data stream + reconnect on type change (TASK-HIGH.86)
- chore(backlog): TASK-MEDIUM.48/49 — BLE diagnostic enrichment + UX backoff (Kjell investigation follow-ups)
- fix(airspace): show GlidingSector (type 21) by default
- chore(backlog): TASK-HIGH.86 add Simon's XCTracer data point + reclassify-doesnt-reconnect insight
2026.5.9 May 9
- chore(release): bump versionCode 377 + release notes for v2026.5.8.1836 (#522)
- feat(realtime): per-user feature flag for worker transport (TASK-HIGH.84 phase 3) (#521)
- chore(backlog): triage May bug reports — TASK-HIGH.86 PTT misrouting + TASK-227 broaden to immersive mode
- fix(map): pin pilot/wind markers to top of stack, shrink buddy icon (#517)
- chore(backlog): sync follow-up tasks from today's work (#520)
- chore(test-harness): add Maestro flow that verifies realtime worker boot (#519)
- fix(realtime): bundle realtime worker as JS module on production builds (TASK-HIGH.84 phase 2 follow-up) (#518)
- feat(connectivity): hardening — relax probe + preflight JWT + fast reconnect recovery (#516)
- fix: airspace fetch retry + earlier launch detection (#514)
- fix(map): obstacles layer opacity actually applies + add thickness control (#515)
- chore(backlog): TASK-391 — bubble thermal assist overlay (3rd mode)
- perf(ogn): restrict fact table to PG/HG, larger flush batches (#513)
- chore(backlog): TASK-389/390 — false-offline detection + JWT auto-refresh
- chore(ogn): log process RSS and async task count in memory line (#512)
2026.5.8 May 9
- chore(release): bump versionCode 376 + release notes for v2026.5.6.2342 (#511)
- feat(realtime): web-worker transport behind flag (TASK-HIGH.84 phase 2) (#510)
- refactor(realtime): introduce RealtimeFacade seam (TASK-HIGH.84 phase 1) (#508)
- chore(backlog,skills): sync uncommitted task files and triage playbook update (#509)
- chore(fly): app vm to shared-cpu-2x / 3072mb (#507)
2026.5.7 May 7
- chore(release): bump versionCode 375 + release notes for v2026.5.6.1432 (#506)
- feat(comms): group-configurable PTT timing + busy-signal feedback (TASK-HIGH.79) (#503)
- fix(e2e): unblock #504 deploy by quarantining/retrying flaky e2e tests (#505)
- feat(ogn,xc): tile-sharded realtime + global ingest + 90d retention (#504)
- fix(ogn): cap _aircraft, purge _last_ogn_send TTL, fix sync/xcontest leaks (#502)
- fix(sync): merge across multi-platform-id physical flights (TASK-HIGH.83) (#501)
- fix(comms): drop per-PTT presence track to avoid Realtime rate-limit channel close (#499)
- fix(sync): gate FL auto-upload on first FL pull (TASK-HIGH.76) (#498)
- fix(voice): defer ptt_end broadcast until transport flushes trailing chunks (#497)
- fix(instruments): keep side action buttons square in wide-cell layouts (#495)
2026.5.6 May 6
- test(voice): stub HTTP-bound recon helpers so assembly path is deterministic
- chore(release): bump versionCode 373 + release notes for v2026.5.5.1648
- feat(voice): v2 universal fMP4/AAC-LC wire format (#489)
- feat(perf): emit charging_changed + dim_changed for battery analysis (TASK-MEDIUM.39) (#493)
- fix(android): probe BLUETOOTH permission via OS instead of scan state (TASK-HIGH.71) (#492)
- fix(sync): pre-upload FL dedup in auto_upload (TASK-HIGH.71) (#491)
- feat(forecast): cumulus base/top + cloud cover ingest (TASK-HIGH.74/.75) (#490)
- fix(windgram): mobile layout - decimate dense rows/cols, match map arrow (#488)
- fix(version): preserve what's new toast on first install + stop iOS update-loop (#481)
- feat(map): obstacles polish - thin red dashed cables, subtle towers, proximity boost (#480)
- feat(map): chunked line-gradient track renderer (TASK-HIGH.73) (#479)
- fix(forecast): bump retention throughput to outpace ingest (#478)
2026.5.5 May 5
- chore(release-notes): mention locked grid + responsive icons we forgot last time (#476)
- chore(release): 2026.5.2.1224 — obstacles overlay, windgram redesign, wind m/s (#469)
- chore(units): default wind speed to m/s and derive metric preset from defaults (#466)
- fix(landing): treat bit-identical heading as stale GPS to prevent thermal false-end (#441)
- docs(agents): forbid piling unrelated work onto stale feature branches (#461)
- chore(backlog): close TASK-HIGH.70 + TASK-MEDIUM.11 (#460)
- fix(map): faster track-up rotation in thermals (TASK-HIGH.70) (#459)
- chore(backlog): track stale and native-map PRs being closed (TASK-LOW.22)
- feat(windgram): UX overhaul — sticky day/time, day pills, pinch zoom, prominent button (#452)
- feat(layout): lock grid + responsive icons + remove col/row resize (TASK-HIGH.66) (#457)
- feat(map): obstacles overlay - cables and towers from openAIP + OSM (#458)
- chore(backlog): flip 12 shipped tasks from In Progress to Done (#456)
- fix(map): thermal auto-zoom centers on pilot when panned off-center (#454)
- fix(forecast): tile winds.mobi catalog fetch to fix missing Alps/Iberia stations (#453)
- docs(forecast): rewrite README with current architecture + ops guide (#451)
- feat(forecast): time-based retention via pg_cron (#450)
- fix(forecast): commit two retention-debugging migrations applied to remote (#449)
2026.5.2 May 2
- chore(release): v2026.4.30.1530 — locked grid + deadband follow + nav glide fix
- fix(nav): align navbox glide with map-point drawer (DEM elevation, no safety margin) (#448)
- feat(map): per-page deadband follow style (#447)
- fix(db): raise postgres-role statement_timeout to 10min for admin cleanup (#446)
2026.4.30 Apr 30
- chore(release): v2026.4.27.2100 — Vector Vario GNSS + forecast intensity
- fix(xc-score): unfin_triangle shows perimeter target, not scorable-now (#421)
- feat(forecast): three follow-ups - ICON OOM, GH cron timeouts, thermal velocity (#420)
- feat(flightlog): persist auth-mismatch warnings to events table for postmortem (#419)
- feat(forecast): thermal-top row + lazy windgram detail view (#416)
- fix(forecast): schedule ingest on cron + run MEPS and ICON-EU independently (#414)
- fix(flightlog): cache + verify platform user_id to prevent cross-user upload contamination (#418)
- feat(vector-vario): GNSS multi-constellation GPS fix + measured wind/heading (TASK-HIGH.61) (#417)
- refactor(settings): group settings into sections, move App mode and Log Out to safer positions (TASK-HIGH.60) (#415)
- fix(ogn): dedup traffic by address to stop synchronized marker blinking (#413)
2026.4.27 Apr 28
- chore(release): v2026.4.25.2012 — re-tag with E2E fixes
- fix(release): unblock v2026.4.25 E2E by fixing edit-mode ancestor guard + stale test selectors (#412)
2026.4.25 Apr 26
- chore(release): v2026.4.23.1504 — Forecast in the popup, cleaner settings
- feat(settings): unify Pilot Profile, add Connected services, move Local range to Comms (TASK-369) (#392)
- fix(edit-mode): Android multi-touch now cancels long-press (#390)
- fix(tests): disable cloud sync for shared test user to fix E2E race (task-358) (#391)
- fix(deploy): include old pending migrations; rename model labels to met.no / DWD (#389)
- feat(forecast): frontend flips to pgpilot /api/forecast (TASK-363 PR 3/3) (#384)
- chore(gitignore): exclude local scratch/research/reference dirs
- chore(ios): regenerate Podfile with camera/share/filesystem/barcode pods
- fix(forecast): use radius query for winds.mobi instead of bbox
- fix(edit-mode): use elementsFromPoint to block long-press under overlays (TASK-367) (#388)
- docs(claude): require committing and pushing new backlog tasks
- chore(backlog): flush 22 pending task files
- feat(onboarding): add layout preset picker to demo tour (#386)
- feat(layout): make Minimal preset genuinely minimal by pruning task/nav actions (#387)
- fix(page): break infinite render loop in cloud-sync effect after login (#385)
- fix(edit-mode): ignore secondary pointers to stop two-finger swipe from entering edit mode (#383)
- feat(profile): per-glider max glide ratio drives reachable-terrain outer contour (TASK-366) (#382)
- feat(forecast): preprocessing subpackage + Verda deploy (TASK-363 PR 2/3) (#380)
- feat(vario): redesign VarioBar (sqrt scale, dual indicators) + remove RoundVario (#381)
- feat(profile): multi-glider support + DB normalization (TASK-365) (#379)
2026.4.23 Apr 23
- chore(release): v2026.4.21.2023 — voice comms you can count on
- feat(ptt): chunk envelope + sender retransmit + receiver jitter buffer (TASK-356 Phase B, TASK-358 Phase 1-2) (#362)
- feat(ptt): detect mid-stream stalls and fall through to stored-blob replay (TASK-356 Phase A) (#361)
- fix(events): capture app_version from Capacitor App.getInfo() (#359)
- fix(tests): unblock main CI by fixing two E2E regressions (#363)
- feat(cloud-chunks): store GPS horizontal accuracy in live_track JSONB (TASK-357) (#360)
- feat(cloud-chunks): store vario and heading in live_track JSONB (TASK-340) (#356)
- fix(comms): stop voice replay on foreground via session_id correlation (#358)
- feat(mode): three-way Flight / Plan / Sleep toggle (TASK-355) (#357)
- feat(ios): Stop background tracking button (TASK-353) (#353)
- fix(comms): gate WS heartbeat watchdog on visibility (TASK-HIGH.56) (#355)
- feat(airspace): yellow "no data for this region" banner (TASK-352) (#354)
- feat(airspaces): add poaff source for French overseas territories (#352)
2026.4.21 Apr 22
- chore(release): v2026.4.20.2136 — bugfix roundup
- fix(flight): pass hasNetwork instead of undefined isOnline to useBuddyLiveTrackPositions (#348)
- fix(comms): WS retry circuit-breaker capped at 30s (#347)
- fix(ios): let the home-indicator swipe through PTT + action buttons (#346)
- Revert "chore(release): v2026.4.20.1902 — tougher comms + brighter screen"
- chore(release): v2026.4.20.1902 — tougher comms + brighter screen
- feat(connectivity): unified online detection + WS watchdog + aggressive retry (#345)
- feat(buddies): fall back to live_track HTTP when presence is stale (#344)
- fix(brightness): let Android HBM engage at slider=100% (#343)
- chore(backlog): add final-summary SHA to TASK-341
- feat(ios): multi-device BLE PTT plugin (TASK-341 PR 4/6) (#341)
- feat(settings): multi-device BLE PTT UI with per-device bindings (TASK-341 PR 5/6) (#340)
- feat(android): multi-device BLE PTT plugin (TASK-341 PR 3/6) (#339)
- feat(ble-ptt): device-specific binding matcher (TASK-341 PR 2/6) (#338)
- refactor(ble-ptt): versioned list storage with single-device migration (#337)
- fix(settings): stop BLE PTT rename input replacing text on each keystroke (#336)
2026.4.20 Apr 21
A big Bluetooth rework, a sharper Side View, and a thermal bubble you can put where you like
• We rebuilt how the app talks to your vario over Bluetooth. Connections come back far more reliably after a dropout, you can run more than one vario at once, and you choose per device whether to use the vario's own climb readings or the app's. If your vario reports temperature and humidity, you'll see those too.
• The Side View got a proper cleanup — it's one widget now, with a switch for whether it follows your heading or the route to your next waypoint. Airspaces, contrast, and waypoint markers are all easier to read at a glance.
• The thermal bubble is now a widget you can place wherever you like — it no longer has to sit in the middle of the map, so you can tuck it out of the way and keep your view clear.
• Tap a pilot on the map for a lot more: navigate straight to them, mark them as a buddy, jump to their group, or grab a share link.
• XContest does more than sync now — your flights upload to XContest straight from the app.
• The terrain hillshade is now lit by the real sun position for the time of day, so the relief looks the way it actually does out there.
• New true-black map style that's easier on the battery on OLED screens.
• The Side View is much smoother now. It was quietly redoing a lot of work several times a second, which could make the whole app feel sluggish with it open — that's sorted.
• When you replay a flight, your own marker shows as an arrow again instead of the walking icon.
• Auto-recenter behaves better — it backs off the moment you pan, and stays put while you've got a menu open.
• Voice you missed while the app was in the background now recovers properly instead of going quiet.
• Tapping the compass does the right thing whether you're in north-up or track-up.
• Vario connections rank devices more sensibly, so the app stops latching onto things that aren't your vario.
• A keyed-up wake tap no longer fires push-to-talk by accident.
more Version 2026.6.8 3d ago
Data Linked to You The following data may be collected and linked to your identity:
Location Contact Info User Content Identifiers Usage Data Diagnostics