Garmin workouts & races / prototype

Near-live Garmin
workout telemetry.

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.

Bring your phone.

The planned watch-to-server path requires a paired phone with internet access. Phone-free use is not supported.

Updates can lag.

Watch upload intervals, phone and network delays, and client delivery affect what you see. Near-live is the goal; update latency is not guaranteed.

Simulator testing first.

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.

Three software components. A phone in the middle.

Watch → phone → server → terminal

  1. 01 / ON THE WATCH

    Transponder

    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 C
  2. 02 / ON YOUR SERVER

    Pitwall daemon

    A 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 / SQLite
  3. 03 / AT THE WALL

    CLI / TUI

    An 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 TUI

Features / Implemented prototype

What you can do today.

Verified with synthetic telemetry on local servers and Garmin’s simulator. Physical watch and phone delivery remain unverified.

Development build: delivery timing is not guaranteed. Backups contain credentials and are unencrypted. See remaining work

Supported uploads / Watch → service

What Transponder can send.

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.

Workout measurements
  • Heart rate, speed, cadence and power.
  • Distance, timer time, elapsed time and sampled timer state.
  • Elevation, total ascent and total descent.
  • Sport-specific heart-rate zone boundaries.
Activity & summary
  • Activity profile name and identifier, sport and sub-sport.
  • Garmin’s average and maximum heart rate, speed, cadence and power.
  • Calories, activity start time and start location.
Location & navigation
  • Latitude, longitude and Garmin’s GPS accuracy quality code.
  • Heading, bearing to destination, bearing from start and track angle.
  • Destination and next-point names, distances and elevations; off-course distance.
Pressure & effort
  • Ambient, raw ambient and sea-level pressure as separate readings.
  • Oxygen saturation, estimated energy expenditure per minute and aerobic Training Effect.
Swimming
  • Previous interval’s average stroke distance.
  • Previous length’s stroke type and SWOLF score.
Cycling
  • Observed front and rear gears: gear index, maximum index and tooth count.
Last-observed events
  • Timer start, pause, resume, stop or reset.
  • Lap notification and its trigger code; workout started or step completed.
  • Split start or end, type, distance, timer and elapsed time, ascent and descent, average and maximum speed.
  • Observation time and ordering for the latest event in each category, not a complete event history.
Device & delivery
  • Watch battery, reported phone connection, firmware and Connect IQ versions.
  • Queued, dropped and rejected sample counts; time since the last upload acknowledgment.
  • Sample timestamps, ordering and source/session identifiers.

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

The actual Garmin data field.

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.

Uploading Retry Stopped Earlier upload accepted

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

Map above. Instruments below.

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.

Actual Pitwall Live dashboard with a close-up map above six cycling widgets: speed, power, cadence, heart rate, active time and distance. Source average and maximum companions appear beside current readings; delivery status remains below. Synthetic telemetry at 110 columns by 48 rows; development build.
Actual Pitwall TUI · Live development build · synthetic · 110 × 48Read the Live map transcript
Actual Pitwall Replay dashboard with the selected historical GPS point above six cycling widgets, source average and maximum readings, and playback controls. Synthetic telemetry at 110 columns by 48 rows; development build.
Actual Pitwall TUI · Replay development build · synthetic · 110 × 48Read the Replay map transcript

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

Follow the plan, with the assumption visible.

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.

Actual candidate Pitwall Live instruments with synthetic readings: inferred stage 5 of 14, Recovery, repeat 2 of 6, no countdown because the stage boundary is unknown, and heart rate 145 bpm above the prescribed 100–130 bpm target.
Actual Pitwall TUI · Live · candidate capture · synthetic · 110 × 48Read the Live transcript
Actual candidate Pitwall Original Replay instruments preserving inferred Recovery, stage 5 of 14, repeat 2 of 6, unavailable progress and the above-target heart-rate comparison, paused at recorded input 3 of 4. The playback bar shows recorded input position, not workout completion.
Actual Pitwall TUI · Original Replay · candidate capture · synthetic · 110 × 48Read the Original Replay transcript

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

Bars for a glance. Dials with a fixed shape.

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.

Actual Pitwall Cycling bars showing current activity readings and explicit display scales. Synthetic telemetry, true colour, 110 columns by 36 rows; merged development build.
Bars · actual synthetic capture · on main · 110 × 36Read the bars transcript
Actual Pitwall Cycling dials with fixed 20-column by 5-row faces beside current readings and display scales. Synthetic telemetry, true colour, 110 columns by 36 rows; merged development build.
Fixed-size dials · actual synthetic capture · on main · 110 × 36Read the dials transcript
Actual Pitwall Cycling at 80 columns by 24 rows: narrow cards retain current numeric readings, display scales and indications instead of shrinking the dial face. Synthetic telemetry, true colour; merged development build.
Narrow numeric fallback · actual synthetic capture · on main · 80 × 24Read the compact transcript

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

Elevation at a glance.

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.

Actual Pitwall expanded Cycling instruments with speed, power, cadence and heart rate above an elevation readout of minus 12.5 meters, ascent of 120 meters and descent of 30 meters. Synthetic telemetry, true colour, 110 columns by 36 rows.
Actual Pitwall TUI · merged development build · synthetic · 110 × 36Read the terrain transcript

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

Front and rear gears, together.

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.

Actual Pitwall cycling context: front gear source index 1, maximum index 2, 34 teeth; rear gear source index 6, maximum index 12, 21 teeth. Synthetic telemetry, true colour, 110 columns by 36 rows.
Actual Pitwall TUI · merged development build · synthetic · 110 × 36Read the gear transcript

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

Pace leads. Cadence and power stay close.

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.

Actual Pitwall Running Replay dashboard with the selected historical point above six widgets: pace, heart rate, cadence, active time, distance and power. Synthetic telemetry, true colour, 110 columns by 48 rows; capture from the source now merged to main.
Actual Pitwall TUI · Running Replay · synthetic · 110 × 48Read the Running map transcript
Actual Pitwall expanded Running page with primary pace, heart rate, active time and distance, and secondary cadence, power and terrain instruments. Source average and maximum companions remain independent readings. Synthetic telemetry, true colour, 110 columns by 48 rows; merged development build.
Actual Pitwall TUI · expanded Running · on main · synthetic · 110 × 48Read the Running instruments transcript

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

Missing is different from zero.

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

What’s next.

Unfinished work only. No release dates set.

WORKOUT EXPERIENCE

More context during a workout.

  • More sport layouts

    Add hiking, swimming and strength views using the readings available for each activity.

  • Trends and trails

    Add bounded metric history, elevation profiles and GPS trails, keeping gaps visible.

  • Recalculate workout context / upcoming

    Compare interpretations from newer logic while preserving the original recorded view.

  • Inferred stage following / candidate

    Follow an explicitly selected plan from completion counts, with visible assumptions and correction when continuity fails.

  • Optional Bono advice

    Suggest reporting intervals while leaving the watch in control of collection and retries.

  • Completed-workout history

    Reconcile completed activities from other sources without duplicating recorded sessions.

PLATFORM & SOURCES

Connect and qualify the system.

  • Phone-reachable access

    Add authenticated HTTPS uploads, protected local control and device provisioning/recovery.

  • Source plugins / in progress

    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.

  • Operations and release checks

    Add retention and scheduled/online backups; qualify a fresh Docker release image.

  • Watch and phone testing — deferred

    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.