Bring your phone.
The planned watch-to-server path requires a paired phone with internet access. Phone-free use is not supported.
Garmin workouts & races / prototype
See your Garmin workout from a terminal: heart rate, pace, distance, timer status, activity context and the latest observed workout events. Transponder sends readings to your own server. The intended watch connection uses a paired phone; the current verified path uses Garmin’s simulator.
The planned watch-to-server path requires a paired phone with internet access. Phone-free use is not supported.
Watch upload intervals, phone and network delays, and client delivery affect what you see. Near-live is the goal; update latency is not guaranteed.
Rich synthetic activity data now passes a five-minute Garmin simulator run, including interrupted uploads and recovery. A small ring buffer keeps recent readings and reports overwritten samples. Physical watch and phone delivery, including HTTPS access, remain unverified.
Watch → phone → server → terminal
A Garmin Connect IQ data field that samples activity measurements and observes timer, lap and workout callbacks alongside native activity recording. The intended upload path uses your paired phone. Every field size shows upload and acknowledgment status. Use Garmin’s native fields for workout measurements.
Connect IQ / Monkey CA Linux daemon packaged with the CLI and TUI in one Docker image. It saves readings to SQLite before acknowledging uploads; a persistent volume keeps data across container replacement. Bono works without a source plugin. It combines readings with an imported plan revision you explicitly select, retaining the original interpretation for Replay.
Docker / SwiftNIO / SQLiteAn agent-friendly CLI and an F1-style Chio workout console with Running, Cycling and General layouts and visible data freshness. Choose Live or Replay at startup; the map and six measurement widgets follow the selected feed, with a separate expanded-instrument view. Separate views keep activity context and delivery diagnostics close by. Poll or receive server-pushed snapshots locally, or run the client over SSH.
Scriptable CLI / Chio TUIFeatures / Implemented prototype
Verified with synthetic telemetry on local servers and Garmin’s simulator. Physical watch and phone delivery remain unverified.
Watch incoming readings or replay recorded samples with pause and step controls.
See the dashboardRunning, Cycling and General layouts pair a selected-point map with bars, dials and readable compact views.
See the instrumentsInspect navigation, terrain, gears, swimming and effort readings when Garmin supplies them.
See supported uploadsOpt into Fixed, Significant or Auto reporting, with upload status and dropped-sample counts.
Script JSON queries, poll or receive server-pushed readings, and run local clients over SSH. Terminal cleanup passes local macOS and Linux checks.
Run on Linux with Docker, retain readings in SQLite, and back up or restore while the daemon is stopped. No network ports are exposed by default.
Bono works without a source plugin. Import a plan, select a stage and repeat, anchor progress to the current reading and compare absolute targets. Original interpretations stay available across corrections, restart and Replay. This is implemented on main.
See recorded contextDevelopment build: delivery timing is not guaranteed. Backups contain credentials and are unencrypted. See remaining work
Supported uploads / Watch → service
The telemetry service accepts these readings when Garmin provides them. The watch field shows delivery status; the uploaded data contains much more.
Availability varies by activity, device, navigation and sensors. Missing readings stay missing. Rich uploads are verified with synthetic data in Garmin’s simulator; physical watch and phone delivery remain unverified.
Phone connection and an earlier acknowledgment do not prove current delivery.
Calculated in the viewerPace comes from speed. The displayed heart-rate zone comes from heart rate and the uploaded zone boundaries.
Not supplied by the data fieldNative workout-step names, targets and repeat numbers. A timer stop or silence does not confirm a finished or saved workout.
01 / On the watch
Transponder rendered in Garmin’s Forerunner 970 simulator. Every size shows telemetry delivery: sending, retrying, queued samples and the last acknowledgment. Use Garmin’s native fields for workout measurements.
Delivery state at a glance. Last acknowledgment and queue count stay separate.
Upload symbols, acknowledgment age and queued samples.
The same status symbols in smaller slots. No measurement values.
Actual simulator captures · synthetic telemetry · Garmin SDK 9.2 · October 8, 2026. Captured directly from the production renderer after a verified synthetic upload and lost-ACK retry. Phone delivery and physical-watch behavior remain unverified.
The simulator repeats Transponder in each native field slot; cyan lines mark its layout dividers. A green check and age describe an earlier accepted upload, not current connectivity. Ages differ because the screens were saved in sequence. Select a capture to view it at full size.
GPS / Main dashboard
Live or Replay, with a map above six measurement widgets and a compact status footer. Both follow the same selected observation. These actual synthetic captures show source average/max companions now on main following their October 10 merge. This remains a development build with open release gates.
Development status. The console on main passes sustained-update resize/quit, all 96 shutdown cases and polling/pushed Replay checks on macOS and Linux. Terminal cleanup preserves unread input. This remains a development build, not a release. Source time, missing readings and historical playback stay explicit. There is no workout trail or accuracy radius.
Current, average and maximum. The merged dashboard adds Src avg and max to speed, heart rate, power and cadence. These are Garmin-reported values from the same selected sample, not estimates from uploads. They can differ independently; a dash means unavailable. Small terminals prioritize current readings. Pace remains derived from current speed.
These captures use online street tiles. Pitwall defaults to public-domain Natural Earth outlines for coarse offline context without streets. Explicit --map-online enables OpenFreeMap tiles from the TUI host and reveals the viewed region to that provider. --map-source selects another configuration; remote sources require HTTPS. Tile credits include OpenMapTiles, OpenStreetMap contributors, ODbL and OpenFreeMap. This web page makes no map requests.
Control the view. Live or Replay opens this dashboard. Arrows pan, +/− zoom, c follows, and e retries loading. i opens expanded instruments; o/a returns here; g toggles bars / dials and opens expanded instruments; v cycles the activity layout and returns here; m returns to the menu. Small terminals and polar coordinates retain location summaries. These recordings use no watch or phone. Replay uses Space to play or pause, [/] to step, b to return to the beginning, and r to reopen history. Its bar shows retained sequence position, not workout completion. Chio’s separate map demo ↗
Stage following / Candidate
Explicitly select a starting stage, then opt into --follow-stages to assume each later completion means one forward step through that plan. Bono labels the position Inferred, shows the next prescribed stage and compares absolute targets. These actual candidate recordings show Recovery, stage 5 of 14, repeat 2 of 6, with 145 bpm above the 100–130 bpm target.
No invented countdown. Completion counts do not establish stage-start times or distances. This is not native watch position: gaps, duplicate or reverse transitions may require correction. Detectable continuity failures make position uncertain; counts never confirm workout completion.
The original stays available. Following keeps earlier recordings and your original selection available in history and Original Replay. Bono needs no source plugin. Explicit alignment is on main; inferred following is a candidate, not merged or released. Physical watch/phone delivery and fresh release-image qualification remain open.
Expanded instruments / On main
Pitwall’s merged audit recovery adopts Chio’s merged instruments. Dials keep a fixed 20-column by 5-row face; when fewer than 20 columns fit, the view retains a numeric reading, scale and indication. This is on main following the October 11 merge.
Current readings, explicit scales. Bars and dials use observed values and display ranges. Numerical source average/max companions remain independent source facts, with missing and zero kept distinct. These instruments add no targets, workout completion or history-derived measurements.
Audit recovery / on main. The October 11 merge combines the independently recovered audit fixes with Chio’s merged fixed-size dials. The full Swift suite, original layout interaction deadline and bounded client/process checks pass on macOS and Linux. These actual client captures use synthetic telemetry, with no watch or phone. Physical watch and phone validation and release qualification remain open.
Shelved reference-mark experiment. The earlier source average/max gauge marks remain shelved. Their recordings and original audit results are preserved as historical evidence in capture provenance and Git history; they are separate from the numerical source companions already on main.
Expanded instruments / On main
The terrain panel pairs a large elevation reading with Garmin-reported ascent and descent. Press i for expanded instruments. Each value follows the selected Live or Replay sample; a missing reading stays missing.
Source readings, not an elevation profile. Negative elevation and zero totals remain valid observations. Ascent and descent are independent source totals, not calculated from uploaded samples. This panel adds no grade, route, target or completion estimate. It keeps the existing panel height; small terminals continue to prioritize primary readings. This panel is on main following its October 10 merge; release qualification remains open.
Cycling context / On main
Press 6 to see both reported gear indexes in large digits, beside their maximum indexes and tooth counts. Both readouts use the selected Live or Replay sample. Smaller terminals keep the existing field-by-field view.
Exactly what Garmin reported. Indexes are shown without adding one or assuming a gear order. Each maximum index and tooth count remains a separate fact. Missing values stay missing; zero is retained. These readings do not prove sensor connectivity or provide shifting advice. The instrument view needs at least 100 × 32 terminal cells. These instruments are on main following their October 10 merge; release qualification remains open.
Running / On main
The existing Running dashboard shows a map and six widgets from the selected Live or Replay observation. The expanded page keeps pace, heart rate, active time and distance first, then adds cadence and power beside terrain at 100 × 44 or larger. At 100 columns, secondary dial cards keep numeric readings and scales; from 101 columns, complete 20-column by 5-row dial faces fit.
One selected observation. Cadence stays in source rpm, with independently supplied average and maximum values; power retains its own source companions. Pace comes from current speed. Shorter terminals retain the existing primary-instrument layout. Replay keeps historical values while new Live uploads arrive. The six-widget Running map is already on main; the expanded cadence/power presentation is also on main following the October 11 merge.
Development limits remain. These static captures use synthetic observations and no watch or phone. The original bounded layout interaction check now passes on macOS and Linux. See the development status above for current console qualification. Online map credits, when shown, belong to the actual TUI capture; this page makes no map requests.
Reading the measurements
Absent measurements stay absent; zero remains a reading. Gauges label values below or above their display range while retaining the measured number. Speed uses 0–60 km/h, power 0–600 W and cadence 0–180 rpm: display ranges, not workout targets. Heart rate uses supplied zone bounds and labels missing bounds. Failed reads stay visible. Live views keep source age and read status visible; replay shows its own historical timestamp and sequence. Swimming describes the previous interval or length; gear readings do not prove sensor connectivity. A last-observed recovery split does not prove the athlete is still recovering. Silence never means a workout finished.
Roadmap / In progress & upcoming
Unfinished work only. No release dates set.
WORKOUT EXPERIENCE
Add hiking, swimming and strength views using the readings available for each activity.
Add bounded metric history, elevation profiles and GPS trails, keeping gaps visible.
Compare interpretations from newer logic while preserving the original recorded view.
Follow an explicitly selected plan from completion counts, with visible assumptions and correction when continuity fails.
Suggest reporting intervals while leaving the watch in control of collection and retries.
Reconcile completed activities from other sources without duplicating recorded sessions.
PLATFORM & SOURCES
Add authenticated HTTPS uploads, protected local control and device provisioning/recovery.
Refresh dated steps, distance, sleep and resting heart rate through a private CLI. Synthetic integration is tested. Blackbox integration, scheduled-workout lookup and athlete-relative targets remain upcoming; Bono needs no plugin.
Add retention and scheduled/online backups; qualify a fresh Docker release image.
Check physical delivery, locked-phone behavior, native recording and battery impact when device testing resumes.
Plugins remain optional. Blackbox remote sync is disabled; additional providers, including Runna, need verified access.