FitTracker — Workout Log & Friend Challenges
A demo snapshot of a solo side project blending workout logging and friend challenges.
Demo Snapshot
This is a curated demo snapshot. Real project data is reviewed before publishing.
PRD
Section Layout ↔ Industry-Standard PRD Template
| Industry-Standard PRD Section | This Fixture's Section | Depth Notes |
|---|---|---|
| Problem Statement | Problem Definition | Fragmented logging tools; 3-week drop-off observed |
| Success Metrics | Success Metrics | 1,000 WAU (3 months); 7-day streak retention 35% |
| Non-Functional Requirements | Non-Functional Requirements | Median log entry under 30s; offline queue (expo-sqlite) |
| (Domain-specific) | Data Privacy | Minimum health-data collection + user deletion right |
Project Overview
FitTracker is a mobile app that pairs personal workout logging with friend challenges, turning solo fitness into a shared commitment. The core insight: people quit tracking within three weeks unless social accountability keeps them coming back. Built as a solo side project, the full product spec and sprint backlog were structured using Vooster in under 15 minutes. Target market is active adults in their 20s–40s who already exercise but lack a lightweight, social-first tracking tool. The north-star metric for launch is 1,000 WAU within three months and a 7-day streak retention of 35%. AI coding agents (Cursor, Claude Code, Windsurf) built the app directly from Vooster-generated tasks with no manual rewriting. Cutting recording friction and adding a social motivation layer together is the core product strategy for cutting churn in half.
Problem Statement
People who want to build a consistent workout habit run into two compounding barriers: fragmented tracking tools and vanishing motivation. Existing alternatives each have critical gaps that drive abandonment within three weeks. General-purpose note apps (Apple Notes, Notion) produce no stats — users have no way to answer "how much did I actually train this month?" Spreadsheets are clunky on mobile, offer no visualization, and require manual effort that erodes over time. Dedicated trackers like Strava or Garmin require GPS hardware and are overbuilt for indoor gym sessions. The result: users abandon their logs within three weeks, and once a streak breaks, the activation energy to restart is too high. Without social accountability — a friend who notices the silence — attrition accelerates further. FitTracker solves this with a "30-second log UX + streak dashboard + challenge social layer." Minimizing cognitive load at the moment of recording is the single most important design principle. The social layer is not a feature add-on but the primary mechanism for sustaining long-term retention.
Target Personas
Persona A — Solo Runner / Home Workout Enthusiast (alias: Jisoo)
Role: Full-time professional, early 30s, exercises 4× per week (morning runs or bodyweight workouts) Workout pattern: 3 years of exercising, but switches tracking tools 2–3 times per year with no continuity Daily pain:
- Logs workouts in a notes app but has no monthly summary — can't feel the progress
- Once a streak breaks, motivation to restart drops sharply
- Even opening a tracking app right after a workout feels like friction Usage context:
- Wants to log within 30 seconds of finishing a workout, on a sweaty phone
- Wants a one-glance home screen showing weekly goal status Current alternatives: Default iPhone Health app (step count only), occasional spreadsheet Adoption trigger: A friend's challenge invite is the first reason to open the app Core needs: Stats visualization + streak gamification + frictionless log UX
Persona B — Gym Club Organizer (alias: Minjun)
Role: Amateur gym club leader, late 20s–30s, manages a 15–20 person fitness group Workout pattern: Trains 5× per week, has run the group for 4 years Daily pain:
- Tracking member workout logs in a group chat buries information quickly
- Tallying monthly challenge completion rates requires 30+ minutes of manual work every time
- Asking all members to install an app is not realistic Usage context:
- Wants to declare monthly challenges, share a single link, and see a live leaderboard
- Non-app users must be able to view standings in a browser Current alternatives: Group chat + manual Google Sheets tallying Adoption trigger: Challenge sharing URL that non-installed recipients can view without the app Core needs: Challenge creation + real-time leaderboard + auto-aggregation
Persona C — Fitness Beginner (alias: Seoyeon)
Role: Graduate student, mid 20s, 3 months into gym training Workout pattern: Transitioned from paid PT sessions to self-directed training; at risk of dropping out Daily pain:
- Can't remember what she did or how much, so there's no sense of progress
- Exercising alone is easy to abandon without someone else watching
- Existing fitness apps look overwhelming and complex on first open Usage context:
- Needs a "I did it today" confirmation feedback loop
- A one-friend challenge is enough — doesn't need a big community Current alternatives: PT diary (paper), sporadic Instagram posts Adoption trigger: Sees a friend's streak badge on Instagram and installs the app Core needs: Low-barrier log UX + 1-on-1 friend challenge + instant achievement feedback
User Stories
-
US-001: As a solo exerciser, I want to log a workout in under 30 seconds, so that I can capture data immediately after exercise without friction. Acceptance Criteria:
- Entry-to-save flow requires 3 taps or fewer
- Workout type, duration, and intensity inputs are on a single screen
- Save succeeds in offline mode; records sync when connectivity returns
- Successful save is confirmed by a toast and the home screen reflects the new entry immediately
-
US-002: As a user, I want to see my current streak and weekly stats on the home screen, so that I stay motivated to maintain my workout habit daily. Acceptance Criteria:
- Current streak day count and this week's workout count are visible on home screen load
- A re-engagement banner appears when the streak is broken, showing the personal best streak
- Reaching a 7-day or 30-day streak triggers a celebratory animation and notification
- Weekly goal completion (user-set target) is shown as a progress badge on the home screen
-
US-003: As a gym club organizer, I want to create a 30-day challenge and share it via link, so that I can track group completion without relying on a group chat. Acceptance Criteria:
- Challenge creation generates a shareable URL in one tap
- Non-app users can view live standings via a web preview page
- Leaderboard updates in real time as participants log workouts
- The challenge creator receives a summary notification when the challenge ends
-
US-004: As a user, I want a push notification after 2 days without logging, so that I remember to keep my streak going. Acceptance Criteria:
- Push notification fires at 8 AM after 2 consecutive no-log days via Expo Push Notifications
- Tapping the notification deep-links directly to the workout log screen
- Users can disable or reschedule notifications from the settings screen
- A dedup table prevents the same notification from firing twice for the same event
-
US-005: As a user, I want to see monthly stats broken down by workout type, so that I understand my training balance across categories. Acceptance Criteria:
- Monthly chart shows total hours per workout category as a bar chart
- Month-over-month change percentage is displayed alongside each bar
- Empty months show a clear empty-state UI rather than a zero bar
- Tapping a workout type bar filters the detail list to that category's sessions
-
US-006: As a challenge participant, I want to see where I rank on the leaderboard, so that friendly competition keeps me engaged throughout the challenge. Acceptance Criteria:
- Leaderboard shows participant rank and completion percentage
- My own row is visually highlighted for quick self-identification
- A final results screen appears when the challenge ends, with a share button
- Top-ranked participant sees a crown icon for visual emphasis
-
US-007: As a user, I want my workout history available offline, so that I can review past records without network connectivity. Acceptance Criteria:
- The last 30 days of records are cached locally on-device
- Auto-sync runs on network reconnect; server timestamp wins on conflict
- An offline-mode banner is shown when the device has no connectivity
- A success toast confirms when sync completes after reconnecting
-
US-008: As a new user, I want to complete onboarding in under 2 minutes, so that I can start logging my first workout without feeling overwhelmed. Acceptance Criteria:
- Onboarding is 3 steps or fewer (goal selection → notification setup → first log prompt)
- Each step has a Skip option
- Completing onboarding lands the user directly on the workout log entry screen
- The weekly goal set during onboarding is immediately reflected in the home screen badge
Core Feature Specs
F1. Workout Logging & History
Purpose: Enable frictionless post-workout capture and historical review to reinforce habit formation Behavior:
- Select workout type (running / home / gym / swimming / etc.)
- Enter duration and intensity via sliders
- Optionally add a note, then save
- Calendar view shows per-day records at a glance with icons
- Offline mode: save locally to SQLite; sync to Supabase on reconnect
- Saved records are editable within 24 hours Priority: MUST Success signal: Median log entry time ≤ 30 seconds; 7-day return rate ≥ 60%
F2. Streak & Stats Dashboard
Purpose: Visualize consecutive workout days (streak) and weekly/monthly stats to sustain motivation Behavior:
- Home screen shows current streak count, personal best, and this week's workout count
- Weekly and monthly bar charts for workout duration by type
- Celebratory animation triggers on 7-day and 30-day streak milestones
- Re-engagement banner appears when the streak is broken
- Lifetime stats summary page shows cumulative data since sign-up Priority: MUST Success signal: 7-day streak retention ≥ 35%; 30-day streak retention ≥ 15%
F3. Friend Challenges
Purpose: Leverage social accountability as a retention lever and viral growth channel Behavior:
- Set challenge name, duration, and target workout count
- Generate a shareable link (one-tap copy, shareable via messaging)
- Participant leaderboard updates in real time with completion percentages
- Non-app users can view standings via a web preview page
- At 50% progress, all participants receive a motivational push notification Priority: SHOULD Success signal: Challenge creation/participation rate among active users ≥ 25%; completion rate ≥ 40%
F4. Push Notifications & Streak Reminders
Purpose: Timely nudges to prevent streak breaks and re-engage lapsed users Behavior:
- Expo Push Notifications fires after 2 consecutive no-log days
- Notification deep-links to the workout log entry screen
- Users can customize notification time and frequency in settings
- Full opt-out available
- Monthly streak recovery pass: one grace-period log per month keeps the streak alive Priority: SHOULD Success signal: Push opt-in rate ≥ 50%; same-day log conversion after notification ≥ 30%
F5. Offline-First Storage & Sync
Purpose: Guarantee workout record continuity in poor or absent network conditions Behavior:
- expo-sqlite caches all workout records locally on write
- Background sync to Supabase runs on network reconnect
- Server timestamp wins on conflict resolution
- Sync status shown to user via banner or indicator
- Failed syncs are queued and retried automatically on the next online session Priority: SHOULD Success signal: Post-offline sync success rate ≥ 99%
Success Metrics
-
7-Day Streak Retention: Percentage of new users maintaining a streak for 7 consecutive days after sign-up.
- Target: 35% (vs. fitness app industry baseline of 20–25%, aiming for +10 pp)
- Measurement: users with 7-day continuous log records / total new sign-ups on day 7
- Note: primary north-star metric validating the streak gamification hypothesis
-
30-Day Streak Retention: Percentage of new users reaching a 30-day consecutive streak.
- Target: 15%
- Measurement: users with 30-day continuous records / total new sign-ups on day 30
- Note: 30-day achievers are a priority segment for future paid tier conversion
-
WAU (Weekly Active Users): Users logging at least one workout per week.
- Target: 1,000 WAU within 3 months of launch
- Measurement: distinct users with ≥1 log entry in a Monday–Sunday window
- Note: DAU/WAU ratio tracked alongside to assess daily engagement depth
-
Challenge Creation & Participation Rate: Percentage of WAU who create or join a challenge.
- Target: 25%
- Measurement: (challenge creators + challenge joiners) / WAU (duplicates allowed)
- Note: challenge completion rate (40% target) tracked separately to assess social feature quality
-
Median Log Entry Time: Time from entering the log screen to tapping Save.
- Target: median ≤ 30 seconds
- Measurement: in-app event log delta between screen_enter and save_success events
- Note: P90 also measured to surface UX outliers causing unusually long entry flows
Non-Functional Requirements
- Performance: Workout save request server response target < 500 ms (P95, mobile 4G). App cold start must complete within 3 seconds. Profile image upload capped at 5 MB; JPG and PNG formats only.
- Offline-first: All workout records written to local SQLite first; background sync to Supabase on reconnect. Server timestamp policy resolves conflicts. Last-synced timestamp is shown in the settings screen for user visibility.
- Accessibility: VoiceOver (iOS) and TalkBack (Android) coverage for all primary interaction elements. accessibilityLabel and accessibilityHint required on every tappable element; WCAG 2.1 AA color contrast. Dynamic Type (user-defined font size scaling) support is required.
- Internationalization: Korean and English at launch via i18n keys. Adding a new locale requires no code changes — only translation file additions. RTL layout support deferred to V2.
- Security: All API calls authenticated via Supabase Auth JWT. Row Level Security policies prevent cross-user data access at the database layer. Sensitive screens are blurred when the app moves to background.
- Platform support: iOS 16+ and Android 13+. Pinned to latest Expo SDK stable release. JS-layer hotfixes delivered via Expo OTA (Over-the-Air) updates.
Data Privacy & Health Record Sensitivity
Workout records — including exercise type, duration, intensity, and optional location — reflect a user's physical activity patterns and constitute sensitive personal data. FitTracker handles this data under the following commitments.
- Data minimization:
- Only fields required to save a workout (type, duration, intensity) are collected by default
- Location data is opt-in only, collected solely when GPS tracking is explicitly enabled for outdoor runs
- Optional notes can be kept local-only (server upload is opt-in)
- Challenge sharing scope control:
- Only display name and completion percentage (%) are visible to other challenge participants
- Detailed workout logs (type, intensity, notes) remain private to the individual user
- Challenge visibility (invited participants only vs. anyone with the link) is user-configurable
- Retention and deletion policy:
- All personal workout data is deleted within 30 days of account termination
- Users can delete records for any date range at any time from within app settings
- Deletion requests are processed as soft delete followed by hard delete within 24 hours
- Data protection compliance:
- Privacy policy published in accordance with the Personal Information Protection Act (PIPA)
- Collecting health-related sensitive data triggers a separate explicit consent step, distinct from general terms of service
- Data portability:
- Full workout history is exportable as a CSV file at any time
- No platform lock-in: users can take their data to any other service
- Inclusion of workout data in iOS/Android system backups is user-configurable
Scope Boundaries
Not included in V1:
- Biometric integrations (heart rate, calorie burn, blood oxygen) via wearables, HealthKit, or Google Fit — hardware dependency and certification overhead deferred to V2
- Nutrition tracking or meal logging — separate domain; planned as a standalone module in V2+
- Paid personal trainer coaching or AI-generated workout prescriptions — requires expert credential verification; deferred until post-PMF
- Live-streaming workout classes — media infrastructure cost and safety management resources not available
- Team or organization subscription tiers with an admin management console — B2B pivot evaluated after validating consumer PMF
- Third-party fitness service import/export integrations (e.g. Strava, Apple Health sync) — API standardization cost is high; included in V2 roadmap
Tech Stack & Architecture
- Frontend: React Native (Expo) Expo managed workflow chosen to simplify the native build pipeline and avoid custom native module maintenance. EAS Build and Submit automate App Store and Play Store releases.
- Backend: Supabase (PostgreSQL + Auth + Storage) Supabase Auth provides email and Google OAuth login; Row Level Security enforces per-user data isolation at the DB layer. Storage bucket handles profile image uploads.
- Push notifications: Expo Push Notifications Single API abstracts iOS APNs and Android FCM, eliminating separate credential management. Notification scheduling runs server-side via Supabase Edge Function with a cron trigger.
- Local storage: expo-sqlite for offline-first caching. Supabase REST API handles batch sync on reconnect.
- Architectural constraint: Expo managed workflow prohibits adding arbitrary native modules. Advanced Bluetooth or biometric sensor integrations are deferred to V2, when a bare workflow migration will be evaluated.
태스크 트리
Sprint 1 — Auth & Basic Logging
Authentication system and basic workout logging
-
[TASK-001] User authentication
DONE(complexity: 3, urgency: 5, importance: MUST)Implement email/social login with Supabase Auth, including session management.
- ST-001-1: Login UI
DONE - ST-001-2: Supabase Auth integration
DONE
- ST-001-1: Login UI
-
[TASK-002] Workout CRUD
IN_PROGRESS(complexity: 4, urgency: 4, importance: MUST)Create workout records table in Supabase and implement CRUD operations.
- ST-002-1: DB schema design
DONE - ST-002-2: Workout logging screen
IN_PROGRESS
- ST-002-1: DB schema design
Sprint 2 — Social Features
Friend invitations and challenge system
-
[TASK-003] Friend challenge feature
BACKLOG(complexity: 5, urgency: 3, importance: SHOULD)Implement challenge creation, invitation, and completion rate comparison.