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.
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.
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.
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.
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.
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.
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.
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.
Ship cloud sync end-to-end
RecommendedUnblocks everything. Once users have cloud sync, they are sticky.
1-2 weeks (mostly your SQL migration + E2E testing)
$0 (Supabase free tier covers up to 50K MAU)
Implement 2-3 OAuth integrations
Reduces manual export friction — biggest usability complaint.
1 week per vendor (dev account + OAuth + sync)
$0 vendor cost, but 2-4 weeks vendor approval per platform
JoyAnalyze real upload + DTW
Differentiator. Power meter comparison is a popular topic.
2-3 weeks (DTW algorithm + UI + testing)
$0 (client-side compute; Supabase for storage)
Per-review OG image generator
Share previews dramatically increase CTR on X/Reddit/cycling forums.
1-2 days
$0 (Vercel edge function)
JoyTravel map drawing
Second-most-clicked button on JoyTravel page, but builder is GPX-only.
1 week (Leaflet + OSM + OSRM)
$0 (OSM tiles free)
Newsletter + email capture
No email list yet = no way to re-engage non-signups.
2-3 days
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
- Cloud sync priority: willing to spend a few hours running SQL migrations this week?
- Resend upgrade: $20/mo worth it for @joyvelo.com sender, or keep Supabase default SMTP?
- JoyAnalyze priority: meaningful differentiator but 2-3 weeks of work — worth doing now or after JoyOne is sticky?
- JoyTravel map drawing vs JoyAnalyze — pick based on traffic (check Vercel analytics).
- Newsletter: when to start? 100 subscribers → useful for feedback on new reviews.