Beta to main#123
Merged
Merged
Conversation
Main to beta
Add a Chart Scale setting that plots the analysis charts against track distance instead of elapsed time, so laps line up corner-for-corner the way pro tools (Race Studio, MoTeC) work. Distance is the new default. - New pure helper lib/chartAxis.ts (buildChartAxis): maps each sample to an x-fraction (elapsed-time or cumulative-distance via calculateDistanceArray), supplies tick labels (distance unit follows the speed unit: MPH->ft/mi, KPH->m/km), and an indexAt inverse for scrubbing. Falls back to a linear index ramp when the quantity has no span. Unit-tested. - chartXAxis setting wired through useSettings -> SettingsContext -> Index, with a Time|Distance toggle in SettingsModal. - TelemetryChart and SingleSeriesChart plot at the axis fraction, relabel the X axis, and invert scrub clicks through the axis. Reference/pace overlays already align by distance, so they sit correctly on either axis. - CHANGELOG + CLAUDE.md updated.
Per review feedback: the axis must not renormalize to the crop window. Cropping still zooms the graph (window fills the canvas), but tick labels now read in absolute distance/time measured from the lap start (start-finish line) instead of resetting to 0 at the window start. - buildChartAxis gains optional fullSamples + rangeStart: positions stay [0..1] over the visible window (zoom preserved) while labels add the window's absolute offset from the lap origin. - TelemetryChart + SingleSeriesChart take allSamples + rangeStart, wired from RaceLineTab and GraphPanel (filteredSamples + visibleRange[0]). - The range-slider crop handles now follow the chart scale too: absolute cumulative distance from the lap start in distance mode (formatRangeLabel rebuilt in Index), elapsed time otherwise. - Tests for absolute distance/time labeling; CHANGELOG + CLAUDE.md updated.
…lignment-OB7LZ feat(charts): distance/time X-axis toggle, default to distance
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
dovesdataviewer | 1cf375d | Commit Preview URL Branch Preview URL |
Jun 04 2026, 04:21 AM |
|
This pull request has been ignored for the connected project Preview Branches by Supabase. |
Coverage SummaryLines: 39.47% (2921/7399) · Statements: 38.68% · Functions: 33.41% · Branches: 40.27% Per-file coverage
|
A new pro-mode graph plotting lateral vs longitudinal G as a scatter, so drivers can see how much of the tyre's grip envelope they're using (the classic MoTeC / Race Studio friction-circle view). - lib/ggDiagram.ts (pure, unit-tested): pickGForcePair honors the gForceSource setting (GPS lat_g/lon_g preferred, logger-native pair for HW); computeGGPoints pairs + per-axis smooths the values aligned to sample index; computeGGAxisMax gives a symmetric, 0.5 g-rounded, [1.5,3.0]-clamped axis. Raw IMU accel_* is excluded (not grip-aligned). - GGDiagram.tsx: canvas view with concentric grip rings, the session cloud, the reference-lap cloud (when selected), the live scrub point, and ACCEL/BRAKE/LAT hints + a g readout. - Wired into GraphPanel as the '__gg__' picker entry, shown only when a lateral/longitudinal g pair is present; persists in graph-prefs like other graphs. - CHANGELOG + CLAUDE.md updated. Note: visual verification could not run in this environment (headless browser download blocked by network policy); logic is covered by unit tests and the build/lint/typecheck gate is green.
…-circle feat(graphview): add G-G diagram (friction circle)
Adds a "Manage Tracks" button to the landing page (below the datalogger download) that opens the track manager without a datalog loaded, via new TrackEditor `triggerButton` + `startInManage` props. Opens up track drawing to all users: - The manual "Draw" tool is no longer admin-only; it shows wherever `showDrawTool` is set (the `isAdminEditor` gate is removed). - User-drawn / lap-generated outlines persist on `Course.layout` and ride the normal track-storage CRUD (cloud-sync + submissions later). - Create-flow dialogs (AddTrack/AddCourse) now expose location search, Draw, and Generate-from-lap; the edit flow prefers the course's own saved layout over the built-in drawings.json outline.
Drawings now travel with a "Submit to DB" contribution: - SubmissionCourse carries the course `layout`; SubmitTrackDialog sends it as `layout_data` (the edge fn already persisted it; now validates point shape and caps at 5000 points). A "+ drawing" badge marks such courses. - `courseContentHash` folds in the drawing, so adding/editing an outline re-flags an otherwise-unchanged course for upload. - Admin Submissions tab previews the outline (thumbnail) and adds an "Apply to course layout" action that matches the DB course and saves the layout, feeding the existing drawings.json export. - DbSubmission now types `has_layout`/`layout_data` (drops the cast). Also makes "Submit to DB" always visible, greyed out (with a pending count) when the upload diff finds nothing new to send.
"Generate from lap" copied every raw GPS sample in the lap — the full logger rate (hundreds–thousands of unevenly-spaced points), which bloats Course.layout and the submission layout_data and over-weights slow corners. Run the generated polyline through the existing tested resamplePolyline() at a fixed ~5 m spacing, yielding a clean, compact, evenly-spaced outline.
Replace the fixed 5 m resample spacing with a length-aware curve: 5 m under 2 miles (karting), ramping linearly to 10 m by 4 miles and capped there, so long road courses don't produce an over-dense outline. Length is taken from the selected lap's distance. New pure helper generatedDrawingSpacing() in trackUtils (unit-tested).
…uploads-MtQVe Home-screen track manager + user drawings in community submissions
Phase 1 of the map line-overlay feature: overlay multiple current-session laps and saved snapshots on the GraphView MiniMap at once, each a distinct color, to compare racing lines through a corner. - lib/lapOverlays.ts (pure, unit-tested): stable overlay ids (lap:<n> / snap:<id>), a cool-hued palette distinct from the speed heatmap + grey reference, resolveOverlayLines(selections) -> OverlayLine[] (resolving laps to sample slices and snapshots to clean-lap samples, colored by visible index), and unionBounds() to fit overlays running outside the active lap. - useLapOverlays hook: selection state (cleared on new file), toggle, and derived overlayLines. - SessionContext carries overlayLines + onToggleOverlay; wired through Index. - MiniMap: new overlay layer beneath the active heatmap (one polyline per line), union-bounds fit, and a remove-able on-map legend. - Selection: a 'Map' toggle column in LapTable + a per-snapshot Spline toggle in LapSnapshotControls. Phase 1 draws raw absolute GPS (same-session laps share a receiver and need no correction). Cross-session drift-alignment and external/cross-logger sources are deferred follow-ups (docs/plans/multi-lap-overlay.md). CHANGELOG + CLAUDE.md updated; plan saved under docs/plans/.
Cloudflare preview deployments (non-main branches) should hit a Supabase preview-branch database, not production. Since Supabase creds are baked in at build time by Vite, the switch has to happen during the build. vite.config.ts pick() now detects non-production builds via WORKERS_CI_BRANCH (Workers Builds) / CF_PAGES_BRANCH (Pages) and prefers a parallel *_PREVIEW value (VITE_<KEY>_PREVIEW or HTT_<KEY>_PREVIEW) for each key before the normal value/fallback. main builds and local dev never read the _PREVIEW vars. Docs: README "Preview-branch backend" deployment section, .env.example, CLAUDE.md env notes, CHANGELOG.
…oudflare-t767g Route non-main branch builds to Supabase preview-branch DB
Expands the multi-lap overlay from the pro MiniMap to every data view, per maintainer feedback — selected laps/snapshots are now full comparison lines everywhere, current lap always on top. - RaceLineView (simple map): overlay layer beneath the current heatmap, union-bounds fit, on-map legend — mirrors the MiniMap. - TelemetryChart (simple speed chart) + SingleSeriesChart (every pro graph): draw each overlay lap's series as a distance-aligned trace in its color, beneath the current line, with per-lap values added to the cursor tooltip (current lap listed first). Overlays apply to speed + measured channels; the synthetic pace / brake-% series don't overlay. - referenceUtils.alignByDistance(): generic distance-alignment of any channel from one lap onto another's distance axis (generalizes calculateReferenceSpeed); unit-tested. Overlays align over the full lap then slice to the visible window, so they stay anchored at start-finish. - Threaded overlayLines through RaceLineTab and GraphPanel/GraphViewPanel. CHANGELOG + CLAUDE.md + plan doc updated for the expanded scope.
Bake the app version (package.json), short git commit hash, and build date into the bundle at build time via vite `define`, and surface them in the landing-page footer as a "v2.0.0 · <hash>" stamp so it's easy to tell which revision is deployed and when something changed. The hash links to the commit on GitHub; the build date shows on hover. The git hash prefers CI-provided commit SHAs (Cloudflare Workers Builds / Pages, GitHub Actions) so it's correct even on shallow checkouts, falling back to a local `git` call and then "unknown". - vite.config.ts: inject VITE_APP_VERSION / VITE_GIT_HASH / VITE_BUILD_DATE - src/lib/buildInfo.ts: pure helpers (label, hasCommit, commitUrl) + tests - LandingPage footer renders the stamp - Docs: README env table, CLAUDE.md, CHANGELOG https://claude.ai/code/session_01L92jSQDgbWbFxCFNGctW2D
… external sources + drift alignment
…ommit-hash-1uLx0 Add build version + commit hash stamp to home-page footer
The track/course selector's dropdowns rendered behind the dialog they open inside (Select content z-[10001] vs Dialog z-[10010]/[10011]), so after loading a log you could never pick a different track. Bump the Select content above the dialog layer. Also simplify track creation everywhere: a track is now just a name + short name, with no up-front course/start-finish step. Courses are added afterwards from the track's course list. The post-load "unknown track" prompt walks through it in two steps — create the bare track, then add its first course so lap timing still works. Drops the now-dead course-creation props from AddTrackDialog and the unused short-name field from CourseForm.
…inimap feat(map): multi-lap racing-line overlay on the pro-mode MiniMap (phase 1)
…down-7Un02 Fix track dropdown behind dialog; make adding a track name-only
The home-screen track manager opens straight into manage mode with no session, so "Back to Selection" only led to an empty track/course picker. Hide it unless a selection context exists (onSelectionChange is provided). The course-list preview thumbnail only consulted community-DB drawings, so a course outline you drew/generated yourself never produced a thumbnail. Prefer the course's own layout, falling back to the public drawing for built-ins.
…ment Phase 2 of the multi-lap overlay — closes the 'align data from different loggers' gap. External sources: - New overlay id kind file:<lap>\x1f<name>; useLapOverlays loads + parses other saved files on demand (cached), computes laps for the current course, and exposes loadOverlayFile/addExternalOverlay. resolveOverlayLines resolves file: ids from an external-samples cache. - OverlayFilePicker: two-stage (file → laps) additive picker, mounted in the header beside Snapshots; shows which external laps are active + their colors. Drift alignment: - lib/lapAlignment.ts (pure, unit-tested): 2D closed-form Kabsch rigid registration (rotation+translation, with a rotation guard) over arc-length correspondences; resampleToCount + computeRigidTransform + alignLapToReference. - An 'Align lines' toggle on both map legends (default on) registers cross-session overlays (snap:/file:) onto the current lap; same-session lap: overlays are never transformed (shared receiver, no drift). Map-only — the graphs compare by distance and are transform-invariant. Threaded alignOverlays + external loader/adder through SessionContext to the header picker and both map legends. CHANGELOG + CLAUDE.md + plan doc updated.
…sistent hint Removes the Manual/Visual editor toggle (a dev fallback) across every track manager — the visual map editor is now the only path. Deletes the now-unused EditorModeToggle and CourseForm components and the editorMode form state. The course-outline Draw/Generate tools now auto-save on every edit (click, undo, clear, generate) via a points ref, matching the line tools that already save on drag-release — so the editor's Done/Close footer button is removed. Adds a persistent hint in the editor across all managers: "Drawing an outline helps on-device course detection. Click to place points."
…down-7Un02 Track manager polish: gate "Back to Selection", fix thumbnail, visual-only auto-saving editor
…ps-alignment feat(overlay): external-file lap overlays + cross-session drift alignment
Rename the header "Overlay file" button to "Overlays" and turn it into a two-section menu: - Current overlays: lists active overlay lines, each promotable to the comparison reference lap (same-session laps set the in-session reference; cross-session overlays feed the external-reference slot) or removable. - Add from other logs: the other saved sessions tagged with the current course, shown by date/time (never raw file names) via a new pure filesTaggedWithCourse() helper in fileBrowserTree.ts. External-file overlay labels now use the session date/time display name instead of the raw file name. The old External Ref bar at the top of the lap list is hidden behind SHOW_EXTERNAL_REF_BAR (kept, not removed); references are still settable from the per-row Ref buttons. Snapshots menu is unchanged. Adds unit tests for filesTaggedWithCourse and updates CHANGELOG + CLAUDE.md.
- Fix the "lost reference" visual bug: the Current overlays list now highlights which overlay is the active reference (matching the in-session referenceLapNumber or the external reference label), so reopening the menu shows the selection persisted instead of looking cleared. - Add a "Current session laps" collapsible section so laps from the current session can be toggled on/off as overlays straight from the menu, without going to the lap page (the per-row lap-list toggles still work too).
Mirror the _PREVIEW backend switch in the footer version stamp. A `main` build keeps the "v<version> · <hash>" form; any other branch now shows "<branch> · <hash> · <commit time>" so a beta/preview deployment makes clear which branch it's running and when that commit landed. - vite.config.ts: bake in VITE_GIT_BRANCH (CI branch vars → git → unknown) and VITE_GIT_COMMIT_DATE (git committer date) - buildInfo.ts: isPreviewBuild() + formatCommitTime() drive the two-mode formatBuildLabel(); an unknown branch falls back to the prod stamp - tests cover both modes + the UTC commit-time formatting - docs: README env note, CLAUDE.md, CHANGELOG https://claude.ai/code/session_01L92jSQDgbWbFxCFNGctW2D
…ew-stamp Footer stamp: branch + hash + commit time on non-main builds
…Wc1j Overlays menu: set references + add laps from course logs; hide external-ref bar
Give preview builds visible flare so nobody mistakes a beta for prod. On any non-main build the footer now turns amber (a new --warning semantic token, tuned to stand out in both light and dark mode) and shows a notice below the version stamp: the branch runs on a preview database, accounts can be wiped at any time, don't rely on non-local data, and never enter real payment information if payments are activated. - index.css: add --warning / --warning-foreground (amber) for light + dark - tailwind.config.ts: map the `warning` color - LandingPage: gate footer color + warning note on isPreviewBuild() - docs: CHANGELOG, CLAUDE.md https://claude.ai/code/session_01L92jSQDgbWbFxCFNGctW2D
Footer: amber preview-database warning on non-main builds
- Overlays menu: note overlays are separate from the reference lap (where deltas are calculated from). - Snapshots menu: note one snapshot per engine per course, capturing the full lap plus the session's setup info. - Pro-view Vehicle tab: add an 'Open Garage' button below 'Save Selection' (shown when no vehicle is linked) that opens the drawer straight to the Vehicles tab when there are no vehicles, or Setups when one exists. Threads a new onOpenGarage handler through SessionContext and an optional initial garage sub-tab through useFileManager/FileManagerDrawer.
Add a subtle helper line to the VideoPlayer 'No video loaded' state stating that segmented videos are not yet supported.
…ssages-vJyni UI tweaks: helper messages + Open Garage shortcut
On large (desktop) screens, surface text labels next to the icons for the header controls that previously showed an icon alone, using the extra real estate: - Settings button → "Settings" - Garage (file manager) button → "Garage" - Track selection (pencil) button → "Select track" - Snapshots control → label now appears at lg+ only (was sm+), so tablet/mobile stay icon-only while keeping the count bubble Tablet and mobile keep the icon-only treatment via a `hidden lg:inline` label span, so the compact layouts are unchanged below the desktop breakpoint. https://claude.ai/code/session_011sirMKvEoqp9t5onArZVmt
When the loaded session has no setup assigned, glow an exclamation icon just right of the Coach tab to nudge the driver toward recording setup data for historical comparisons. - Red (urgent) when no setup exists to assign yet: clicking opens the Garage to Vehicles (or Setups if a vehicle already exists). The empty states in those tabs now read in red. - Orange (reminder) when setups exist but this session isn't linked: clicking opens the Garage Notes tab, which now shows an orange reminder below Save Selection. The tone/target decision is a pure helper (getSetupIndicator) with unit tests; the tab-bar button owns only the glow + click wiring.
The multi-lap overlay system already feeds selected laps/snapshots into the Pro-view charts and G-force fields, but two computed surfaces ignored them: 1. The computed Brake % chart only drew the current lap + reference. Now each active overlay lap derives its own brake % (computeBrakingGSeriesSG + gToBrakePercent) and is distance-aligned onto the current lap, matching how the reference brake line is drawn. New pure helper alignValuesByDistance aligns a derived parallel series (not stored on the sample) by distance; alignByDistance now delegates to it. 2. The G-G diagram only ever showed the reference cloud. Added a header Ref / Overlays toggle (shown when both exist) that swaps the comparison cloud beneath the session — overlays render one cloud per lap in its line color, and the axis extent follows the active comparison set. https://claude.ai/code/session_011faKrsV6CSepcnmVrvJqAC
Narrowing the range slider cropped the active lap's heatmap line (and the charts, via alignByDistance) to the selected section, but the overlaid laps/snapshots on the race-line map and Pro mini-map stayed drawn at full lap length. Add a pure cropOverlayLinesToWindow helper that slices each overlay to the same cumulative-distance window as the active lap, and apply it (plus the bounds fit) in RaceLineView and MiniMap, threading rangeStart from the callers. https://claude.ai/code/session_0116WfgRYsHCZsJ3wjRFpiEE
Each Pro-view graph (and the G-G diagram) now has a drag handle along its bottom edge for adjusting its height individually. Heights persist per session via graph-prefs (and ride the existing cloud-sync of that store), keyed by series so a tuned layout returns when the log is reopened. - New reusable GraphResizeHandle component (pointer-drag, clamped 120-800px) - SingleSeriesChart / GGDiagram take optional height + onHeightChange, restructured to a flex column so the handle never overlaps axis labels - GraphPanel owns the height map, persists on drag release, prunes on remove - graphPrefsStorage stores graphHeights; pure migrateGraphPrefs helper migrates legacy display-name keys in both the list and the height map - Tests for the migration helper; CHANGELOG updated
Match the Snapshots control: the Overlays button label now appears at the lg+ (desktop) breakpoint only instead of sm+, so tablet and mobile stay icon-only while keeping the count bubble at every size. https://claude.ai/code/session_011sirMKvEoqp9t5onArZVmt
…tor-87tfW Glowing setup-status indicator in the tab bar
…els-UXVhO Desktop-only text labels on header controls
…g-XD7kb Crop map overlay racing lines to the playback window
Adds a bottom-right info box to the G-G diagram listing the live G value for every cloud at the scrub point — the session plus the active comparison set (reference or overlays), each row in its cloud color. Comparison values are distance-aligned onto the current lap so one scrub index reads the same track position across all clouds. Two toggles sit above the box: - Ref / Overlays — relocated here from the header; swaps the comparison cloud. - Lat G / Lon G — switches the readout axis (lateral by default), since showing both axes for every cloud gets noisy fast. The old canvas-drawn current-point Lat/Lon readout is replaced by this box; the red current-point dot stays. https://claude.ai/code/session_011faKrsV6CSepcnmVrvJqAC
On touch, the window-level pointermove/up listeners lost the gesture as soon as the finger left the 8px handle — the browser reclaimed it as a scroll and fired pointercancel, so the drag only nudged a few pixels at a time. Capture the pointer on the handle element and handle move/up/cancel on the element itself so the drag tracks the finger anywhere on screen.
…overlays-wvTSH Overlay braking on the brake-% chart + G-G diagram ref/overlays toggle
…ht-resize-uIJTH # Conflicts: # CHANGELOG.md # src/components/graphview/GGDiagram.tsx
…size-uIJTH Add per-graph height resize handles in Pro mode
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Beta → main
This rolls the current
BETAline up intomain— 20 merged PRs since thelast promotion (#120 → #142). Highlights below, grouped by theme; this mirrors
the
[Unreleased]section ofCHANGELOG.md.✨ New features
Analysis & charts
laps/snapshots and they draw everywhere at once — racing lines on both the
simple Race Line map and the pro mini-map, and distance-aligned traces on
every telemetry chart, with each lap's value in the cursor tooltip. Add a lap
from the lap list's Map column or a snapshot from the snapshot list; each
gets a distinct color + on-map legend. The current lap always renders on top.
Pull laps from other saved logs via the Overlays menu and toggle them onto
the maps + graphs. An Align lines toggle rigidly registers cross-session
overlays (snapshots + external-file laps) onto your current lap so the lines
actually sit on top of each other; same-session laps are left untouched.
Closes the "align data from different loggers" gap.
vs. longitudinal G as a scatter, with 0.5 g grip rings, your session's cloud,
the reference cloud, and the live scrub point — the classic MoTeC / Race Studio
"are you using the whole circle" view.
bottom-right info box lists the live G value for every cloud at the scrub point,
with Ref / Overlays (swap the comparison cloud) and Lat G / Lon G
(switch the readout axis) toggles.
chart draws a distance-aligned line per active overlay lap/snapshot, matching
the reference brake line.
track distance instead of elapsed time so laps line up corner-for-corner.
New Chart Scale toggle in Settings; Distance is the default, anchored at
the start-finish line with absolute-distance tick labels.
drag handle on its bottom edge to set its height individually; heights persist
per session and ride cloud sync.
Overlays / reference management
The header Overlays button opens a three-section menu: current overlays
(promote any to the comparison reference / remove), current-session laps
(toggle on/off), and Add from other logs (other sessions on the current
course, listed by date/time). Replaces the old "External Ref" bar.
Track management & community DB
Tracks button opens the track manager with no datalog loaded — search a
location, drop start/finish & sector lines, and draw the outline by clicking
the map. The Draw tool is now available to everyone; Generate from lap still
builds the outline from a GPS trace when a log is loaded. Drawings save with the
course and travel via cloud sync + community submissions.
outline rides along with a submitted course (flagged + drawing); the admin
Submissions tab previews it with Apply to course layout.
Footer / build transparency
version and short git hash (e.g.
v2.0.0 · 837b514, linked to the commit), andon non-
mainbuilds reads<branch> · <hash> · <commit time>.mainbuilds turn thefooter amber with a warning that the branch runs on a preview database and data
can be wiped.
🔧 Improvements / changed
(pencil) button, Snapshots, and Overlays show text labels on large screens;
icon-only on tablet/mobile.
glows red (nothing to assign) or orange (setups exist but session unlinked) next
to the Coach tab, deep-linking into the right Garage tab.
Overlays/Snapshots menus, and an empty-video-panel note about segmented
video (UI tweaks: helper messages + Open Garage shortcut #137).
toggle removed; dragged lines and drawn outlines save on release, so the
Done/Close step is gone (Home-screen track manager + user drawings in community submissions #126).
added afterward; unknown-track prompts walk through it in two steps (Home-screen track manager + user drawings in community submissions #126).
the community list, shows a review screen (New/Edited, New/Modified course),
sends as one batched upload, and remembers what was already submitted. The
button is always visible, disabled when nothing's pending, with a pending count
(Home-screen track manager + user drawings in community submissions #126).
a clean, compact polyline (Home-screen track manager + user drawings in community submissions #126).
🐛 Bug fixes
(Crop map overlay racing lines to the playback window #141) — overlaid laps/snapshots used to stay full-length while the active lap
cropped.
longer renders behind the dialog.
now prefers your own drawn outline, not just community-DB drawings.
session is loaded (Home-screen track manager + user drawings in community submissions #126).
🚀 Infra / deployment
non-production branch builds prefer
*_PREVIEWbuild variables so beta URLspoint at a branch DB instead of production.
main+ local dev unaffected. Seethe README "Preview-branch backend" section.
Full merged-PR list (#120 → #142)
#120, #121 (distance/time axis), #124 (main conflict merge), #125 (G-G diagram),
#126 (track mgmt + drawing uploads), #127 (multi-lap overlay), #128 (Supabase
preview backend), #129 (footer version stamp), #130/#132 (track-selector
dropdown fix), #131 (external-lap overlays + alignment), #133 (Overlays menu UI),
#135 (footer branch/preview stamp), #136 (footer preview warning), #137 (UI
tweaks + helper messages), #138 (desktop text labels), #139 (setup-status
indicator), #140 (GPS braking + G-G overlays), #141 (map overlay crop fix),
#142 (resizable pro graphs).
https://claude.ai/code/session_01HgXe3sxpDpQXrGpn981u8n