September 25th, 2025
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.
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.
We added pause button in the workout interface and also an exercise overview button so the user can see all exercises in the workout





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