JoyVelo

Product Requirements · JoyAnalyze

JOYANALYZE PRD

Browser-native multi-source cycling data accuracy + performance analyzer. DC Rainmaker-grade UX, GoldenCheetah-grade metrics. Three-version rollout: V1 free, V2 Pro, V3 Pro+.

Generated 2026-07-08. V1 (R0), the full V2 rollout (R1–R16), the full V3 rollout (R18–R25), the full V4 Foundation rollout (R28–R33), the full V4.1 JoyOne V1 rollout (R35–R43), the full V4.2 JoyOne V2 rollout (R44–R49), the full V4.3 JoyOne V3 rollout (R50–R57), and the full V4.4 JoyOne V4 rollout (R58–R67) have shipped; 1094 unit tests passing. All eight V3 high-ROI gaps are closed, all six V4 Foundation rounds (auth + collab tables + sync + server-side Open API + realtime) are deployed, JoyOne is cloud-first across 8 surfaces, JoyOne V2 adds athlete-grade power analysis (CP / W′ / race predictions), multi-vehicle support, and the year-in-review report, JoyOne V3 layers forward-looking analytics (forecast / decay / taper), lab-grade metrics (CdA / L/R balance), the third-party connections panel, and the Insights hub, and JoyOne V4 closes the loop with auto-detected segments, terrain-aware race prediction, periodized training plans, plan-vs-actual adherence, and a weekly training calendar.

ShippedPlannedR0 = DTW baseline shipped 2026-06-23

1. Positioning & scope

JoyAnalyze is the professional core tool of the JoyVelo platform: a browser-native multi-source cycling data accuracy and performance analyzer. It replicates the lightweight web UX of DC Rainmaker's Analyzer plus GoldenCheetah's depth in power-segment analysis. Zero install, drop-and-compare, data-faithful, segment-precise.

Four design principles

Raw-data fidelity

Every curve and stat comes from the original samples. No interpolation, no fabricated points — same philosophy as DCR Analyzer.

Time + space dual alignment

Indoor rides align by timestamp; outdoor same-route rides align by distance / GPS track. Both scenarios covered.

Pro-grade, beginner-friendly

Sensible defaults so a newcomer can compare two devices in three clicks; advanced settings for power users.

Cross-module data flow

Upload once in JoyAnalyze; reuse from JoyOne, Reviews, and JoyTrain. One file, many surfaces.

Target users & scenarios

UserCore scenarioCore need
Hardware reviewerSide-by-side power meter / head unit / HR strap / radar taillight tests with deviation chartsMulti-device on-screen alignment, quantified bias, watermark-free export
Serious enthusiastSame-route repeats, compare power output and climb performance over timeAuto route matching, segment-level comparison, zone quantification
CoachCompare multiple athletes on the same workout, analyze pacing and execution qualityBatch import, interval auto-split, multi-dim stats table
Device R&DPrototype vs reference device, validate data consistency and response speedHigh-precision alignment, raw data export, transparent bias algorithms

Cross-module linkage rules

ModuleRule
JoyOneJoyOne activity detail shows an "Add to comparison" button that jumps into JoyAnalyze with the activity pre-loaded; analyzed segment data and core metrics sync back into the JoyOne archive.
ReviewsEvery data-comparison chart in a review article is generated by JoyAnalyze; in-article charts are clickable and lead to a public compare page where readers can zoom independently; reviewers can insert JoyAnalyze charts directly into the article editor.
JoyTrainAfter a JoyTrain interval session, one click sends the file to JoyAnalyze for interval-specific comparison; multi-session same-interval compare supports longitudinal tracking.

2. Information architecture

Five core sub-modules

Compare Project Management

Central hub for creating, classifying, file-managing, sensor-library linking, and global settings of every comparison project.

Data Preprocessing & Alignment Engine

File parsing, automatic data cleaning, timestamp + trajectory dual-mode alignment — the foundation of every analysis.

Visual Comparison Canvas

Multi-metric overlay, specialized charts, GPS trace overlay map — the core interactive analysis surface.

Segment Comparison System

Multiple segment-creation modes, segment management + template reuse, segment-deep analysis — the core of training review.

Statistics Export & Sharing

Multi-dimensional stats, bias analysis, all-format export, public sharing, in-site cross-link.

Three-column layout

ZoneWidthContents
Left sidebar240px, fixedCompare project list, current project files list, single-file settings (show/hide / offset / rename), segment management panel
Center canvasFlexible, main areaMulti-curve overlay canvas, metric Tab switcher, zoom controls, smoothing slider, map trace view
Right sidebar280px, collapsibleStats overview cards, current segment metrics, power-zone distribution, advanced settings panel
Bottom tableExpandable / collapsibleMulti-device full-metric comparison table, bias analysis table, segment comparison table

Core flow

  1. 1Land on JoyAnalyze home → choose a comparison mode to create a new project
  2. 2Bulk drag-drop FIT / TCX / GPX files, or one-click import activities from JoyOne
  3. 3System auto-cleans and aligns (time / trajectory) → default compare view rendered
  4. 4User selects / creates segments, switches analysis dimensions, opens specialized charts
  5. 5Review the bottom stats table and bias data, finish analysis
  6. 6Export charts / reports, or generate a public share link

3. Detailed feature breakdown

Each sub-section is annotated with shipped (✅) or planned (⬜) status against the V1/V2/V3 plan.

3.1.1 · Project list (JoyAnalyze home)

full
  • New-compare entry — three modes: device-accuracy / training-performance / specialized-device (Pro-only)
  • Card / list dual view showing project name, created, file count, mode, last edited
  • Filter + search by name, created time, file count
  • Edit / rename / delete / duplicate / public-private toggle (R7b)
  • Bulk delete + bulk raw-export (V3)
  • Per-project notes + tags + reference baseline device (V3)

3.1.2 · Project file management

full
  • Format support: .fit .tcx .gpx (R0) + .pwx .csv (R2) + .srm .zwiftlog (V3)
  • Drag-drop upload, file-picker batch select (R0)
  • Free: 2 files / project · Pro: 20 files / project (V2 cap)
  • Per-file: visibility toggle, color customizer, rename, delete, time offset (R0)
  • JoyOne one-click import (R9a) — multi-select sessionStorage bridge
  • ANT+ / BLE sensor library with auto-rename by ID (R12)

3.2 · Preprocessing & alignment

partial
  • Zero-power / zero-speed zeroing (R0) with auto exclude from stats
  • Outlier filter (power Δ > 300W in <2s, HR 40-220, HR Δ > 50bpm/s) — V3
  • Gap detection (>10s) rendered as broken line, stats skip gap duration — V3
  • Timestamp auto-align via time-intersection (R0, indoor default)
  • GPS trajectory spatial alignment with DTW over 5m grid (R8)
  • Manual time offset (R0) + timezone-fix shortcut (R0)
  • Barometric altitude priority + manual distance correction — V3

3.3 · Visual canvas

full
  • Metric tabs: power, HR, cadence, speed, elevation, radar detection (R2 added elevation + radar)
  • Dual-Y secondary metric overlay (R2)
  • Zoom (wheel), pan (drag), box-zoom (right-drag), double-click reset (R0)
  • Hover crosshair + delta-vs-reference tooltip (R0)
  • Smoothing 1/5/15/30/60s, raw vs smoothed toggle (R0)
  • MMP / Max-Mean curve (R1)
  • Cumulative distance curve (R1)
  • Power distribution histogram (R1)
  • L/R balance comparison (R2)
  • GPS trace overlay map with OpenStreetMap + Esri satellite dual-layer (R15)

3.4 · Segment system

partial
  • Canvas box-select create with naming dialog (R7a)
  • Map box-select create (V3)
  • Auto segment: climb (gradient ≥3% for ≥30s), interval (≥90% FTP ≥20s), sprint (>120% FTP <30s) — R10
  • Even-split segments by distance / time (V3)
  • Segment templates with share + auto-match on new data (V3)
  • Segment PR modal — manual marker that pulls best-time per JoyTravel route (R3 + R4)
  • Segment-deep analysis panel: avg/NP/peak/IF/TSS + HR/cadence/efficiency

3.5 · Statistics + bias analysis

full
  • Per-stream summary cards: NP / IF / TSS / EF / cadence (R3)
  • Ranking table across 9 metrics × N streams with medals (R3)
  • Bland-Altman scatter per candidate (R0)
  • Drift-over-time per candidate (R0)
  • Z1–Z7 zone distribution with user-configurable thresholds (R6)
  • PMC training-load dashboard (CTL/ATL/TSB EWMA + 28-day rhythm + weekly delta + risk signals) (R5)
  • Fatigue index v2 (ACWR-weighted) + recovery tracker (R6)
  • Bias-analysis report: OLS slope / intercept / R² / SEE / Pearson r / mean bias, dynamic-response latency + overshoot, Mahalanobis outliers (R20)
  • Radar taillight specialist stats — detection / accuracy / response latency (R14)

3.6 · Export & share

full
  • CSV export of comparison rows (R0)
  • PNG 1x/2x/4x export, SVG vector (R11a)
  • Segment data bulk export (custom-metric per-stream CSV) (R23)
  • PDF professional report — single stream cover + KPI table + charts + segment rows (R18)
  • Batch PDF report across loaded streams with master cover (R21)
  • PDF cover + footer honor brand / white-label settings (R22)
  • Public share link with 24h / 7d TTL + view / export permissions (R11b)
  • iframe embed for Reviews + 3rd-party blogs with size presets (R13)
  • Open API tokens (projects:read / projects:write / webhooks:read / webhooks:write) + HMAC-signed webhooks (R24)
  • Team collaboration: shared comments + activity log + tags + JSON merge with newer-edits-wins (R25)

4. Non-functional requirements

DimensionTarget
Render perf10 × 2-hour FIT files loading, smooth curve render, zoom/pan non-janky
Parse speedSingle 2h @ 1Hz FIT parses ≤ 2s
Browser supportChrome, Edge, Safari desktop; tablet landscape
Data securityRaw files encrypted at rest, private projects default hidden; share links revocable
Algorithm consistencyNP, TSS, IF, CP within ≤ 1% of GoldenCheetah
UsabilityCore compare flow ≤ 3 clicks; newbie can do basic compare without tutorial

5. Version rollout

Free tier for basic compare, Pro for full segment + export, Pro+ for enterprise review + team collab.

V1.0Free

Covers basic compare for free users. Two-device quick compare + simple training-data viewing.

  • ·Project basics: create / delete / public-private toggle
  • ·Upload + parse FIT / TCX / GPX, 2 files max per project
  • ·Default timestamp auto-align + manual per-file offset
  • ·Power / HR / cadence / speed core overlay, zoom / pan / smoothing
  • ·Single-segment manual marker + per-stream summary

Shipped so far

  • R0 baseline (2026-06-23) — upload + DTW + per-stream summary
  • R1 (Jul 3 2026) — MMP + distance + power histogram
  • R2 (Jul 3 2026) — GPS map + L/R + Z1–Z7 + per-stream FTP
  • R3 (Jul 3 2026) — NP/IF/TSS/EF + cadence + ranking + segment PR modal
  • R4 (Jul 3 2026) — activity archive + picker + JoyTravel route overlay
  • R5 (Jul 3 2026) — PMC training-load dashboard
  • R6 (Jul 3 2026) — custom zones + fatigue v2 + recovery tracker
  • R17 (Jul 6 2026) — README + PRD V2 closure documentation
V2.0Pro

For advanced amateurs, indie reviewers, coaches. Full-dim analysis + segment review + Pro export.

  • ·Files-per-project: 2 → 20; add PWX / SRM / CSV / Zwift log
  • ·GPS trajectory spatial alignment + reverse auto-flip
  • ·Advanced cleaning-rule thresholds, barometric alt priority, manual distance fix
  • ·MMP / distance / power-histogram / GPS map / L-R / zone histograms (R1+R2)
  • ·NP / IF / TSS / EF + cadence + ranking + segment-PR + activity archive (R3+R4)
  • ·PMC dashboard + custom zones + fatigue v2 + recovery tracker (R5+R6)
  • ·ANT+ / BLE sensor library with auto-rename
  • ·Unit + theme + decimal customization
  • ·JoyOne / Reviews / JoyTrain deep linking
  • ·PNG 2x/4x + SVG vector export, CSV / Excel, share link tiers + TTL, iframe embed

Shipped so far

  • R7a (Jul 5 2026) — canvas box-select user segments with naming dialog
  • R7b (Jul 5 2026) — project save / load / public-private toggle / localStorage persistence
  • R8 (Jul 5 2026) — time vs distance axis alignment with DTW over 5m grid
  • R9a (Jul 5 2026) — JoyOne multi-select → JoyAnalyze preload bridge
  • R10 (Jul 5 2026) — auto-detect climbs / intervals / sprints
  • R11a (Jul 5 2026) — PNG (1x/2x/4x) + SVG chart export
  • R11b (Jul 5 2026) — share tokens with 24h / 7d TTL + view / export permissions
  • R12 (Jul 6 2026) — ANT+/BLE sensor library + FIT device auto-rename
  • R13 (Jul 6 2026) — iframe embed code with size presets + HTML escape
  • R14 (Jul 6 2026) — radar-taillight specialist stats (FIT radar_threat parser)
  • R15 (Jul 6 2026) — GPS multi-track overlay + Esri satellite base layer
  • R16 (Jul 6 2026) — user preferences: units / theme / decimal places
V3.0Pro+

Pro reviewers, device R&D, professional coaches. Enterprise-grade review, batch, team collab.

  • ·One-click PDF professional report (cover, KPIs, key charts, bias, segment comparison)
  • ·Custom cover, review-conclusion notes, brand Logo white-label
  • ·Dynamic-response latency / overshoot analysis for power meters
  • ·R² / SEE / Mahalanobis outlier detection, CdA estimation on flat sections
  • ·Batch upload / batch project / batch segment / batch report
  • ·Team-shared projects + collaborative editing
  • ·Open API: bulk data import, analysis-result webhook
  • ·Custom metrics + custom chart styles

Shipped so far

  • R18 (Jul 6 2026) — one-click A4 PDF report (cover + KPI table + chart PNG + segments)
  • R19 (Jul 7 2026) — CdA drag-area estimation on flat / steady-state samples
  • R20 (Jul 7 2026) — bias lab: OLS slope/intercept + R² + SEE + dynamic-response latency + Mahalanobis outliers
  • R21 (Jul 7 2026) — batch PDF report, one section per loaded stream
  • R22 (Jul 7 2026) — brand / white-label settings threaded through PDF cover + footer
  • R23 (Jul 7 2026) — user-defined metric DSL with parser + 7 functions (mean/max/min/abs/rolling/delta/efficiency)
  • R24 (Jul 7 2026) — Open API tokens + HMAC-signed webhooks + project JSON schema (v1)
  • R25 (Jul 7 2026) — team collaboration: comments + activity log + tags + JSON merge with newer-edits-wins
  • R26 (Jul 7 2026) — README + PRD V3 closure documentation (777 unit tests)
V4.0Foundation

Cloud-backed JoyAnalyze: Supabase auth, RLS-protected collab tables, cloud sync, server-side Open API, realtime presence.

  • ·Auth via Supabase magic link + email/password (cookie sessions)
  • ·Multi-device sync via `profiles` + `activities` Postgres tables
  • ·Team projects + comments + activity log with member-based RLS
  • ·Server-side API tokens with SHA-256 hashing + scope checking
  • ·Webhook subscriptions with HMAC-SHA-256 signed payloads
  • ·Supabase Realtime: live comments, activity feed, presence indicators
  • ·Migration wizard `/migrate` pushes JoyOne localStorage to cloud
  • ·Open API endpoints under `/api/v1/*` for third-party integrations

Shipped so far

  • R28 (Jul 7 2026) — Supabase scaffold (client/server/provider + typed Database schema for 7 existing tables)
  • R29 (Jul 7 2026) — 4 collaboration tables (projects / project_members / comments / activity_log) with member-based RLS
  • R30 (Jul 7 2026) — auth UI verified: login page (Google OAuth + magic link + email/password) + /auth/callback + SiteUserMenu
  • R31 (Jul 7 2026) — cloud sync lib (`lib/sync/` pull/push/merge) + `/migrate` wizard UI + activity dedup via stableUuid
  • R32 (Jul 7 2026) — server-side Open API: `POST /api/v1/auth/token` issues bearer tokens, `GET /api/v1/projects` + `/api/v1/activities` with scope checking (replaces R24 localStorage trust)
  • R33 (Jul 7 2026) — Supabase Realtime channel `team:<projectId>` for live comments + activity log + presence (R25 upgrade)
  • R34 (Jul 7 2026) — README + PRD V4 closure documentation (813 unit tests)
V4.4JoyOne V4

JoyOne V4 ships segment detection, race-time prediction v2, training plans with adherence, and a training calendar: the user gets a closed-loop cycle from "what is my drag area" through "what is my form next week".

  • ·Auto-detected 0.5-5 km segments across all rides with polyline-shape fingerprint (≥80% match within 50 m), plus per-bike / per-window (4w / 12w / 52w / all-time) PR rankings and 7-day rolling PR-streak
  • ·Pure-SVG segment mini-map (equirectangular projection, < 0.1 % distortion at < 5 km), start / finish markers, north rose, and an approximated elevation profile
  • ·Year-over-Year comparison across 5 metrics (distance / time / elevation / TSS / ride count) with monthly delta % and a tone-coded headline card
  • ·Race predictor v2: terrain-aware time and IF prediction from distance + climb + surface, using Minetti 2002 climb cost and a Newton-inverted power-equation, plus per-segment climb / flat / descent pace guidance
  • ·Training plan builder: 4 templates (base / balanced / race / recovery) × 1-24 weeks, 7-workouts-per-week template with rest / recovery / endurance / tempo / intervals / race types and per-workout coach notes
  • ·Plan vs Actual adherence: matches each planned workout to the actual ride by date and TSS proximity (±50 %), reports matched / under / over / missed / rest status with a tone-coded headline
  • ·Training calendar: weekly 7-day grid overlaying planned workouts with actual rides, with status rings and weekly TSS / hours rollup
  • ·ActivityStream now carries leftRightBalance (FIT field 9), and a new V4.4-surfaces section on /joyone

Shipped so far

  • R58 (Jul 8 2026) — `lib/joyone-segments.ts` 0.5-5 km segment detection with polyline fingerprint; /joyone/segments top-30 table
  • R59 (Jul 8 2026) — `lib/joyone-segment-prs.ts` 4 PRs + per-bike + per-window rankings; /joyone/segments/[id] detail page with PR strip, per-bike table, window PRs, timeline
  • R60 (Jul 8 2026) — `lib/joyone-segment-geo.ts` pure-SVG mini-map; embedded in segment detail with start/finish markers + elevation profile
  • R61 (Jul 8 2026) — `lib/joyone-yoy.ts` year-over-year monthly + total comparison across 5 metrics; /joyone/yoy with year/metric chips and side-by-side monthly bars
  • R62 (Jul 8 2026) — `lib/joyone-race.ts` terrain-aware race-time predictor v2 with per-segment pace guidance; /joyone/race two-mode form (predict time / predict IF)
  • R63 (Jul 8 2026) — `lib/joyone-plan.ts` 4-template periodized plan generator (base / build / peak / taper); /joyone/plan builder with date / weeks / CTL / ATL / template / rest-day controls
  • R64 (Jul 8 2026) — `lib/joyone-plan-adherence.ts` Plan vs Actual TSS proximity match; /joyone/plan/adherence/[id] with tone-coded headline and day-by-day breakdown
  • R65 (Jul 8 2026) — `lib/joyone-calendar.ts` weekly 7-day grid overlay; /joyone/calendar with 4 window chips + 4 template chips
  • R66 (Jul 8 2026) — dashboard toolbar adds Segments / YoY / Race / Plan / Calendar chips; full test suite green at 1094 pass + 3 skip
  • R67 (Jul 8 2026) — V4.4 closure docs (10/10 rounds complete, 1094 unit tests)
V4.3JoyOne V3

JoyOne V3 ships forward-looking and lab-grade analytics: TSB forecast, detraining/taper what-if, drag-area estimation, L/R power balance, a third-party connections panel, and a top-level Insights hub.

  • ·Forward load forecast: pure forward Banister EWMA with 5 strategies (hold / build / taper / rest / arbitrary TSS) and 7-90 day horizons; stitched history + dashed future on a single SVG
  • ·Detraining + taper what-if on /joyone/load: piecewise 0.5/0.3/0.15 %/day FTP decay (Mujika & Padilla, 70% asymptote) plus a cut-and-ramp taper simulator; milestones for 10/20/30% FTP loss and peak-form day
  • ·Aero (CdA) dashboard at /joyone/aero: per-ride median / IQR / R² from power+speed+elevation streams, cross-ride trend, and 5-band classification (elite / aero road / typical / upright / very upright)
  • ·L/R power balance dashboard at /joyone/balance: mean / percentiles / dominance per ride, cross-ride trend with 50/50 reference line, 4-band classification (even / mild / strong / significant)
  • ·Third-party connections panel at /joyone/data: 8 providers (Strava / Polar / WHOOP / Fitbit / Garmin / Wahoo / Zwift / Google Fit) with per-provider status, expiry, last-sync, and Connect / Disconnect / Reconnect actions
  • ·Provider statuses cover the not-fetchable cases (Garmin / Wahoo / Zwift / Google Fit) with a ".fit upload only" badge so users don't try to connect what can't be connected
  • ·Insights hub at /joyone/insights: top-level landing page that surfaces compact headline numbers (CTL / forecast ΔCTL / FTP loss / CdA / balance / CP / year totals / connections) for every analytics surface, each card a deep link
  • ·FIT stream enriched: leftRightBalance field 9 now lands in `ActivityStream.leftRightBalance` via the in-house joyone-fit parser, so .fit uploads with a power-meter L/R feed the balance dashboard natively

Shipped so far

  • R50 (Jul 8 2026) — `lib/joyone-forecast.ts` forward Banister EWMA + 5-strategy plan + ForecastPanel on /joyone/load
  • R51 (Jul 8 2026) — `lib/joyone-decay.ts` predictFtpDecay + simulateDetraining + simulateTaper; DecayPanel on /joyone/load with mode toggle + horizon + cut chips
  • R52 (Jul 8 2026) — `lib/joyone-aero.ts` over joyanalyze-aero; /joyone/aero with per-ride CdA KPIs + cross-ride trend + 5-band classification
  • R53 (Jul 8 2026) — `lib/joyone-balance.ts` over joyanalyze-balance; /joyone/balance with per-ride L/R summary + trend with 50/50 reference line + 4-band dominance
  • R54 (Jul 8 2026) — `lib/joyone-connections.ts` + `JoyOneProfile.connections` map; /joyone/data "Connected sources" section replacing the single-provider Strava card
  • R55 (Jul 8 2026) — /joyone/insights: top-level hub with 8 deep-link cards (load / forecast / decay / aero / balance / CP / year / connections)
  • R56 (Jul 8 2026) — dashboard toolbar adds Aero / L/R Balance / Insights chips; full test suite green at 986 pass + 3 skip
  • R57 (Jul 8 2026) — V4.3 closure docs (8/8 rounds complete, 986 unit tests)
V4.2JoyOne V2

JoyOne V2 ships athlete-grade power analysis: per-bike CP curves, race-time predictions, monthly heatmap, and a year-in-review report.

  • ·WKO-style 2-parameter Critical Power (CP + W′) fit on the Power Duration Curve
  • ·Single-bike CP dashboard at /joyone/cp with PDC chart (all-time + last 30d overlay) + race-time table for 5s / 1m / 5m / FTP / 1h / 2h / 5h
  • ·Multi-vehicle model: bikes registry with type / brand / color, default-bike for auto-tagging imports, bike filter on the activities table
  • ·Per-bike CP surfaces + cross-bike comparison (up to 3 bikes overlaid on one PDC) at /joyone/cp
  • ·Year-in-review at /joyone/year/[year]: 12-month distance heatmap + 52-week activity histogram + per-bike breakdown + highlights (longest / most-elevated / best 20-min / best NP) + CP snapshot
  • ·PR "set on this ride" attribution per PDC duration via topContributorsFor

Shipped so far

  • R44 (Jul 8 2026) — `lib/joyone-cp.ts` windowed CP helpers: computePowerCurveWindowed, computeCPTrend (12-week rolling 90d fit), topContributorsFor, computeRaceTimeDelta
  • R45 (Jul 8 2026) — `/joyone/cp` Critical Power dashboard (CP / FTP / W′ / activity KPI tiles + PDC overlay + race-time table)
  • R46 (Jul 8 2026) — multi-vehicle: `lib/joyone-bikes.ts` localStorage CRUD + Activity.bikeId + `/joyone/bikes` manager + activities table bike filter
  • R47 (Jul 8 2026) — per-bike CP curves + cross-bike comparison overlay (up to 3 bikes) on the CP dashboard
  • R48 (Jul 8 2026) — `/joyone/year/[year]` year-in-review report (monthly heatmap + weekly histogram + per-bike + highlights + CP snapshot)
  • R49 (Jul 8 2026) — V4.2 closure docs (6/6 rounds complete, 904 unit tests)
V4.1JoyOne V1

JoyOne V1 ships cloud-first across 8 surfaces: activity list, single-activity detail, fitness dashboard, FTP settings, Personal Records, cloud-migration CTA, PR badges, and data & privacy controls.

  • ·Cloud-first activity list with 4 banner states (cloud / local / suggestsMigrate / cloudError)
  • ·Single-activity detail page with 8-KPI strip and secondary metrics
  • ·CTL/ATL/TSB 90-day fitness chart with status banner (Peak form / Fresh / Building fatigue / Heavy fatigue / Overreaching risk)
  • ·FTP / Max HR / LTHR / weight settings page with cloud+local save and "Estimate from recent rides"
  • ·Same-route Personal Records: auto-clustered routes with 4-metric PRs (elapsed time / avg power / NP / elevation), monthly trend chart, recent PRs timeline
  • ·Activities without GPS stream fall back to "approx" clusters with a lowConfidence flag
  • ·Cloud-migration CTA surfaces only when signed in but cloud is empty + local has data (one click → /migrate)
  • ·Per-activity PR badge in the activities table + "PRs set on this ride" panel on the single-activity detail page
  • ·JoyOne-level data & privacy controls at `/joyone/data`: export JSON, sign out of cloud, wipe local, request cloud-account deletion
  • ·Strava token-expiry classification: connected / willExpireSoon (< 7 days) / expired; UI guides the user to reconnect

Shipped so far

  • R35 (Jul 7 2026) — `/joyone` cloud-first activities list (`lib/joyone/activity-source.ts` resolution order + 4 banner states)
  • R36 (Jul 7 2026) — `/joyone/activities/[id]` single-activity detail page (`lib/joyone/activity-loader.ts` 4-step resolution chain)
  • R37 (Jul 7 2026) — `/joyone/load` CTL/ATL/TSB dashboard (pure SVG 3-line chart, no chart library)
  • R38 (Jul 7 2026) — `/joyone/settings` FTP/HR/LTHR/weight settings with cloud+local save
  • R39 (Jul 8 2026) — `/joyone/pr` Personal Records dashboard (GPS + bucket fingerprint clustering, 4-metric PRs, monthly trend)
  • R40 (Jul 8 2026) — V4.1 closure docs at 5/8 rounds (852 tests)
  • R41 (Jul 8 2026) — `useCloudSync` exposes `cloudActivitiesCount`; cloud-migration CTA + per-activity PR badges (compact + panel)
  • R42 (Jul 8 2026) — `/joyone/data` privacy controls (export + cloud sign-out + Strava disconnect + wipe + account-deletion email) + Strava token-expiry status
  • R43 (Jul 8 2026) — V4.1 final closure docs (8/8 rounds complete, 864 tests)
Back to JoyVelo top-level PRDTry JoyAnalyze now