Analysis runs in this browser. Source files stay local unless you
sign in and explicitly upload them to the private archive.
Local by default
01 / Inputs
Load the matching activity files
Private VM storage · browser-side analysis
Analysis archive
Uploads are explicit. The selected MP4 remains local for playback; its retained copy is stored separately.
Source files stay local until you sign in and choose an upload action.
Sign in to view retained analysis runs.
Load local files to inspect source coverage and telemetry.
Elevation comparison
Ascent by source
Paired comparison: load both activities to assess shared coverage.
Garmin TCX
Raw-sample ascent
—
1-second median ascent
—
Source not loaded.
RaceBox CSV
Raw-sample ascent
—
1-second median ascent
—
Source not loaded.
Paired difference requires both sources and independently verified timing.
Each source's ascent uses its own recorded coverage; the totals are not a synchronized comparison when their windows differ.
The difference below uses only the verified shared interval, not the standalone totals above.
Raw-sample ascent sums positive changes when distance advances (or is unavailable); filtered ascent uses median altitude in each 1-second bin.
RaceBox distance is integrated from speed. Gaps over 2.5 seconds are omitted.
The RaceBox − Garmin difference is withheld until independent timing residuals pass this POC's ≤100 ms gate.
Neither grade estimate is ground truth; RaceBox altitude datum and absolute accuracy are unverified.
04 / Terrain mesh
LiDAR terrain and recorded position
Deferred to save resources
data/fusion/racebox-lap-1-lidar-terrain-trail-200mm.stl38,544,084 bytes · SHA-256 25a38a63b89aa2e4f79c0767164b07e715850f847c73066eabeb228f9a3f5ff6EPSG:3071 local easting/northing on X/Y, centered at the footprint origin; Z is up from the 0 in base plane · inches · 7.87 × 7.87 in footprint · 3× terrain relief · 0.12 in base · 0.04 in raised trail
Terrain is not loaded on startup to reduce memory and GPU use. Load it from the repository when needed.
No mesh loadedMeasured bounds will appear after verification.
Load terrain to enable the verified Garmin terrain cursor.
Choose a local video file to begin. Repository video is not loaded automatically.
SYNC LOCKED · video telemetry is withheld until independent timing evidence passes the 100 ms gate and remains limited to the validated anchor span.
How to work with overlay data
Load a video and telemetry from the same ride in 01 / Inputs.
For another ride, add new video-to-Garmin anchors; do not reuse the current
mapping unless the saved source identity matches. Video telemetry remains locked until the same event is paired independently in both timelines
and residuals pass the 100 ms gate. A matcher candidate alone is not accepted.
Use the checkboxes above to select available HUD channels and choose a layout
below. The Ride HUD shows source-backed values, power-zone time using the default
250 W FTP, heart-rate-zone time using the age-based max-HR estimate (220 − age by
default or Tanaka), and the upcoming Garmin elevation profile. Enter an age above
before heart-rate zones can be calculated. When selected and synchronized, the HUD
also shows lean angle, color-zoned integer Garmin and RaceBox grades side by side,
gear, cadence, satellite, breathing-rate, and heart-rate widgets. Display units are
switched globally above.
Gyroscope channels start unchecked.
The comparison in
01 / Inputs compares raw and 1-second median ascent over the shared
timestamp interval; gaps over 2.5 seconds are omitted. The Garmin and RaceBox grade
comparison in 03 / Garmin timeline uses centered 10-second windows,
but both grade and ascent results stay hidden until independent Garmin↔RaceBox
timing evidence passes 100 ms. Neither device grade is treated as ground truth.
RaceBox grade uses 1-second median altitude and distance integrated from speed. Both
source pairings are provisional until independently verified. The separate Grade over
time widget then plots each source's
actual grade percentage—not their difference—over the preceding 60 seconds of verified coverage. The metric
rows below show each metric's name, value, unit, and chart of observed samples without
interpolation.
To add a field in code, parse it and document its evidence in
web/src/telemetry.js, map its label and color in
web/src/main.js, and add specialized visuals in
web/src/hud-chart.js only when needed. Update
tools/hud-server-render.js if it should also appear in the
offline FFmpeg render, then add parser tests. Keep inferred units and
unverified semantics explicit.
Power-zone time, selected source-backed values, ride totals, and upcoming terrain.
The worker draws charts locally; video decode and HUD text stay in the browser.
59.94 fps source frame step
03 / Garmin timeline
Activity position and metrics
Waiting for TCX
GarminRaceBoxCurrent position
RaceBox CSV cross-checkSpeed and Lap unavailable
Waiting for timestamped RaceBox data
SYNC NOT VERIFIED · UTC/GPS proximity is diagnostic only; paired RaceBox values require independent residuals ≤100 ms and are limited to verified coverage.
SYNC LOCKED · Pair the same visible event independently in video and Garmin; one anchor cannot verify timing.
Grade comparison
Garmin vs RaceBox
Independent estimates · neither source is ground truth
Garmin Grade—
RaceBox Grade—
RaceBox − Garmin—
60 seconds before cursorGarmin activity cursor
Grade comparison is locked until Garmin↔RaceBox synchronization is independently verified to ≤100 ms for the displayed interval.
Actual grade (%)
Grade over time
Previous 60 seconds · current cursor at 0 s
Garmin GradeRaceBox GradePower (W)
Grade uses the left percentage axis; power is red on the right watt axis.
Metric display objects
One row per metric
Name · value · unit · 60 s source-sample chart.
05 / Trail discovery fixture
Find route systems near a ZIP code
Fixture-backed · not ranked
This local slice demonstrates the intended discovery flow. It uses a catalog-backed result
when configured, otherwise a fixture; it does not call a live provider from the browser.
Analyzes the configured repository RaceBox CSV and three GoPro LRV chapters, not replacement files selected above.
Metadata only; no video decoding, uploads, or alignment changes. Pause video and unload terrain first if memory is tight.
Offsets below mean GoPro sensor time minus RaceBox elapsed time, not Garmin offsets.
Correlation is not probability or validated accuracy. A candidate can be wrong.
Not started. Requires the local development server and ffprobe.
POC boundaries
Open validation gates
Video-to-Garmin values stay locked until independent visual evidence verifies the 100 ms limit,
and are unavailable outside the validated anchor span.
RaceBox values aligned to Garmin stay locked until independent clock residuals verify the 100 ms
limit, and remain unavailable outside verified coverage.
Respiration and rear pressure retain FIT gaps; unsupported lateral G is not shown as measured.
The terrain cursor uses verified original Lap=1 observations; RaceBox-to-Garmin timing is
unavailable until independently verified. Final-video rendering is in scope but is not implemented
or accepted yet.
Browser HEVC playback, orientation, color, dropped frames, and workstation performance still need local validation.