September 25th, 2025

Big Update v2.02.0: Migration of Challenges to backend, ✨ New Workout UI, New Components, Fixed Stats Events, and more

This is a big update that we have been preparing for the past 2 weeks. It includes migration of challenges to new backend (only the exercise part, not user stats yet), redesigned workout UI, improved feedback collection for low-engagement exercises, fixes to the data reports in the stats for “workout_overview”, “exercise_completed”, and “exercise_overview” events.

1. Challenges are now using our new backend system.

We migrated the data fetching for challenge, including all exercise details (description, video, tips, mistakes, etc.) to a new backend. This is second part out of 4 part process for full migration to a new and improved system.We are still in the process of migrating all of our features to a new infrastructure. We want to ensure a smooth transition, so all our updates are backwards compatible and we keep a close eye on any issues that might arise from our migration. By the end of the migration (+20-30 days to fully migrate all functionality) you will see faster response rates from APIs and faster loads with up to 80% improvements because of our new infrastructure with better data handling.

2. Improved workout UI:

We added pause button in the workout interface and also an exercise overview button so the user can see all exercises in the workout

3. Fixed report data for “exercise_overview”, “workout_overview” and “exercise_completed”

KEYS TO BE REMOVED:
(we will remove the following keys for snake_case consistency in the upcoming releases. Please ensure you move to snake case variables):

1. exercise_completed:

- exerciseTitle → exercise_title

- totalRepeats → total_reps

- totalCountdown → total_duration

- exerciseId → exercise_id

- averageAccuracy → average_accuracy

2. exercise_overview:

- accuracyReps → accuracy_reps

- averageAccuracy → average_accuracy

  1. exercise_completed

When Sent: After each individual exercise is completed (during rest periods when person navigates from an exercise (you get a snapshot of the completed exercise)).

Data Structure:

  {

    type: "exercise_completed",
    data: {
      exercise_title: string,        // Exercise name (e.g., "Squats")
      time_spent: number,            // Time spent on exercise in seconds
      repeats: number,               // Actual reps completed
      total_reps: number,            // Target/required reps
      total_duration: number,        // Target time in seconds
      calories: number,              // Calories burned (2 decimal places)
      exercise_id: string,           // Unique exercise identifier
      exercise: string,              // Same as exercise_id
      mistakes: Array<{              // Form mistakes detected
        mistake: string,             // Mistake description
        count: number                // Occurrence count
      }>,
      average_accuracy?: number      // Optional: 0-1 range accuracy score
    }

  }
  1. workout_overview

When Sent: On the statistics page after workout completion, provides complete workout summary.

{
    type: "workout_overview",
    data: {
      // Legacy fields (to be removed)
      workout: string,                        // Workout ID or null
      total_time_spent: number,               // Total seconds exercising
      total_repeats: number,                  // Total reps completed
      total_calories: number,                 // Total calories (2 decimal places)
      percentage_completed: number,           // Completion percentage (2 decimal places)
      total_max_reps: number,                 // Total target reps
      total_accuracy_score: number,           // Average accuracy (0-100)
      total_max_time: number,                 // Total target time in seconds

      // Current fields
      workout_title: string,                  // Workout name
      workout_id: string,                     // Unique workout ID
      target_duration_seconds: number,        // Target workout duration
      completed_reps_count: number,           // Total completed reps
      target_reps_count: number,              // Total target reps
      calories_burned: number,                // Calories burned (2 decimal places)
      completion_percentage: number,          // Workout completion % (2 decimal places)
      total_mistakes: number,                 // Total mistake count
      accuracy_score: number,                 // Overall accuracy (0-100)
      efficiency_score: number,               // Efficiency metric (0-100)
      total_exercise: number,                 // Number of exercises
      actual_hold_time_seconds: number,       // Time in correct position (timer-based)
      target_hold_time_seconds: number        // Target hold time (timer-based exercises)
    }
  }
  1. exercise_overview

    When Sent: On the statistics page, provides detailed breakdown of all exercises in the workout.

{
    type: "exercise_overview",
    data: Array<{
      exercise: string,                  // Exercise name
      exercise_title: string,            // Same as exercise
      exercise_id: string,               // Unique exercise ID
      time_spent: number,                // Time on exercise in seconds
      perfect_hold_position: number,     // Time in correct position (timer-based)
      repeats: number,                   // Reps completed
      total_required_reps: number,       // Target reps
      total_required_time: number,       // Target time in seconds
      calories: number,                  // Calories burned (2 decimal places)
      mistakes: Array<{                  // Detailed mistake breakdown
        mistake: string,                 // Mistake description
        count: number                    // Occurrence count
      }>,
      mistake_count: number,             // Total mistakes for exercise
      accuracy_reps?: number[],          // Optional: Per-rep accuracy scores (renamed from accuracyReps)
      average_accuracy?: number          // Optional: Average accuracy (0-100, renamed from averageAccuracy)
    }>
  }