JoyVelo

Internal · Decision aid

PRODUCT REQUIREMENTS

Comprehensive PRD covering all JoyVelo modules — JoyOne, JoyTravel, JoyFit, Training, JoyAnalyze, Reviews, News, WorldTour. Decision space and next-step options.

Generated 2026-06-22, last updated 2026-06-23. This page is a summary of the full document. For the unabridged version with file map and open questions, see the GitHub repo or download the markdown.

✨ Shipped 2026-06-23 sprint

A — F: all six decision-space options landed

All six "next-step" options from the original decision space are now implemented in code. Some need your action (run SQL, register vendor app, add env vars) before they go live; the rest are production-ready today.

A

Strava auto-sync + E2E tests

Cron at /api/cron/strava-sync (6 AM UTC daily, Hobby-plan compliant). Iterates users, refreshes access tokens, upserts to Supabase. Playwright suite covers public pages + cloud sync roundtrip with stub auth.

B

Polar / WHOOP / Fitbit OAuth

Generic /api/oauth/[provider]/{start,callback} routes + lib/oauth-providers.ts. SQL migration 0003 adds per-provider token columns. UI flips those platforms from coming-soon to oauth-ready.

C

JoyAnalyze DTW comparison

Replaces the placeholder. lib/joyanalyze-fit.ts is a pure-browser FIT stream parser; lib/joyanalyze-dtw.ts is Sakoe-Chiba-banded DTW. /joyanalyze/upload is the real interactive tool.

D

Per-review OG images

/reviews/[slug]/{opengraph-image,twitter-image}.tsx render 1200×630 PNGs with product name, brand, category, stars, and excerpt. Top 50 are statically generated.

E

JoyTravel map draw

Leaflet + OpenStreetMap + OSRM. Click waypoints, drag to fine-tune, right-click to remove, snap to roads, save to library. New /joytravel/draw page + CTA on /joytravel.

F

Self-hosted newsletter

Migration 0004 creates newsletter_signups. /api/newsletter/subscribe persists + dedupes. Footer gets a "The Warmup" signup form. /admin/newsletter is sign-in-gated with CSV export. Switch to Resend / Mailchimp later by changing one route.

0. Module map

Quick view of every module, where it lives, and current state.

Marketing site & content

Live — 47 reviews + ~12 news + 18 WorldTour teams + per-review OG images
  • · /
  • · /reviews
  • · /reviews/[slug]
  • · /news
  • · /news/[slug]
  • · /worldtour
  • · /worldtour/team/[id]
  • · /worldtour/race/[id]

JoyOne

Live — localStorage + cloud sync (awaiting your SQL run), Strava auto-sync cron (6 AM UTC daily), Polar/WHOOP/Fitbit OAuth routes (awaiting vendor app registration)
  • · /joyone
  • · /joyone/connect
  • · /login
  • · /account

JoyTravel

Live — GPX import + library + 2D detail + GPX builder v1 + interactive map draw (Leaflet + OSM + OSRM snap-to-roads)
  • · /joytravel
  • · /joytravel/routes
  • · /joytravel/routes/[id]
  • · /joytravel/builder
  • · /joytravel/draw

JoyFit

Calculator live; selection guides editorial only
  • · /joyfit
  • · /joyfit/calculator
  • · /joyfit/frame-selection
  • · /joyfit/handlebar-selection
  • · /joyfit/saddle-selection
  • · /joyfit/handlebar-adjustment
  • · /joyfit/saddle-adjustment
  • · /joyfit/ai

Training

Builder + 7 science articles live
  • · /training
  • · /training/builder
  • · /training/altitude-training
  • · /training/carb-periodization
  • · /training/cold-weather
  • · /training/heat-acclimation
  • · /training/mental-training
  • · /training/sleep-recovery

JoyAnalyze

Live — two-file FIT/GPX comparison with Sakoe-Chiba DTW alignment, per-second stream parser, click-to-mark event markers, summary cards
  • · /joyanalyze
  • · /joyanalyze/power-meter-comparison
  • · /joyanalyze/upload

Newsletter

Live — self-hosted email list, footer signup form, /admin/newsletter CSV export. Migration 0004 awaiting your SQL run
  • · /admin/newsletter
  • · /newsletter/unsubscribed

E2E tests

Live — Playwright with stub auth for CI, real Google OAuth for staging
  • · /e2e/public-pages.spec.ts
  • · /e2e/cloud-sync.spec.ts

8. Decision space — what to build next

Given everything above, here are the highest-impact options ranked by ROI. Pick one to focus on for the next sprint.

A

Ship cloud sync end-to-end

Recommended

Unblocks everything. Once users have cloud sync, they are sticky.

Effort

1-2 weeks (mostly your SQL migration + E2E testing)

Money

$0 (Supabase free tier covers up to 50K MAU)

B

Implement 2-3 OAuth integrations

Reduces manual export friction — biggest usability complaint.

Effort

1 week per vendor (dev account + OAuth + sync)

Money

$0 vendor cost, but 2-4 weeks vendor approval per platform

C

JoyAnalyze real upload + DTW

Differentiator. Power meter comparison is a popular topic.

Effort

2-3 weeks (DTW algorithm + UI + testing)

Money

$0 (client-side compute; Supabase for storage)

D

Per-review OG image generator

Share previews dramatically increase CTR on X/Reddit/cycling forums.

Effort

1-2 days

Money

$0 (Vercel edge function)

E

JoyTravel map drawing

Second-most-clicked button on JoyTravel page, but builder is GPX-only.

Effort

1 week (Leaflet + OSM + OSRM)

Money

$0 (OSM tiles free)

F

Newsletter + email capture

No email list yet = no way to re-engage non-signups.

Effort

2-3 days

Money

Resend $20/mo or Mailchimp $13/mo

Module highlights

JoyOne — 5-tab dashboard

The most important module. 5 tabs (Overview / Activities / Fitness / PDC / Profile), integrations grid with honest 3-state UX (oauth-ready / upload-only / coming-soon), pure-browser FIT parser (replaces broken @garmin/fitsdk SDK), rule-based AI Coach summary.

JoyTravel — GPX library

Library, 2D detail page (SVG polyline + elevation chart + POI editor), and GPX-only builder v1. Biggest gap: no map drawing yet — biggest planned improvement.

JoyFit — calculator + guides

6-step wizard calculator live with cloud sync. Selection tools and adjustment guides are editorial-only. AI fitting is a marketing stub pending roadmap.

Training — workout builder + science

Builder with zwo/erg/mrc export, 7 deep-dive science articles (altitude, carbs, heat, cold, mental, sleep).

JoyAnalyze — marketing-only

Power-meter / radar / HRM comparison framing, but the actual upload + DTW analyzer is 2-3 weeks of engineering we have not committed to yet.

Cross-cutting

  • · Auth: Supabase magic link + Google OAuth. Resend upgrade for @joyvelo.com sender — $20/mo.
  • · SEO: 31-URL sitemap, robots.txt, default OG image, OG image per page pending.
  • · Perf: homepage 3.6× faster (3.1s → 0.87s) via Suspense streaming + 5s Sanity timeout.
  • · Notifications: toast + ConfirmDialog live; email digest pending.

Open questions for you

  1. Cloud sync priority: willing to spend a few hours running SQL migrations this week?
  2. Resend upgrade: $20/mo worth it for @joyvelo.com sender, or keep Supabase default SMTP?
  3. JoyAnalyze priority: meaningful differentiator but 2-3 weeks of work — worth doing now or after JoyOne is sticky?
  4. JoyTravel map drawing vs JoyAnalyze — pick based on traffic (check Vercel analytics).
  5. Newsletter: when to start? 100 subscribers → useful for feedback on new reviews.
JoyAnalyze PRD deep-dive (V1 / V2 / V3)Browse the 2026 WorldTour hub