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
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
}
}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)
}
}exercise_overviewWhen 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)
}>
}