November 7th, 2025

KinesteX v2.06.0: ✨ NEW CUSTOM WORKOUT INTEGRATION OPTION

This update introduces support for defining custom sequence of exercises and displaying the workout flow of KinesteX, allowing you to customize and handle the onboarding process, currently supporting only our React Native package version 1.2.5, all other packages will support it later next week as well!

Watch this update walkthrough here:

https://youtu.be/9W9G6j_Pv0U

Overview

The Custom Workout feature allows you to create and execute personalized workout sequences with custom exercises, repetitions, durations, and rest periods. This feature integrates with the KinesteX SDK via postMessage communication.


How Custom Workouts Work

1. Initial Setup

When integrating custom workouts, you need to:

  1. Initialize the KinesteX SDK with CUSTOM_WORKOUT as integrationOption

  2. Send initial configuration including your custom workout exercises

  3. Wait for the ready signal from the SDK

  4. Send the start command to begin the workout


Sending Custom Workout Data via PostMessage

Step 1: Initial Configuration

When initializing the SDK, send your custom workout exercises in the customWorkoutExercises field:

export interface WorkoutSequenceExercise {
  exerciseId: string;
  reps: number | null;
  duration: number | null;
  includeRestPeriod: boolean;
  restDuration: number;
}

Example usage:

const customWorkoutExercises: WorkoutSequenceExercise[] = [
    {
      exerciseId: "jz73VFlUyZ9nyd64OjRb", // exercise id from kinestex api or admin panel
      reps: 15, // reps for the exercise
      duration: null, // duration for the exercise (null if not applicable and person has unlimited time to complete specified number of reps)
      includeRestPeriod: true, // include rest period before the exercise
      restDuration: 20, // rest duration in seconds before the exercise
    },
    {
      exerciseId: "ZVMeLsaXQ9Tzr5JYXg29",
      reps: 10,
      duration: 30,
      includeRestPeriod: true,
      restDuration: 15,
    },
// duplicate of the exercise above to create a set
    {
      exerciseId: "ZVMeLsaXQ9Tzr5JYXg29",
      reps: 10,
      duration: 30,
      includeRestPeriod: true,
      restDuration: 15,
    },
    {
      exerciseId: "gJGOiZhCvJrhEP7sTy78",
      reps: 20,
      duration: null,
      includeRestPeriod: false,
      restDuration: 0,
    },
  ];

Step 2: Listen for Ready Signal

After sending the initial configuration, wait for the SDK to signal that it's ready and all resources are loaded:

const handleMessage = (type: string, data: { [key: string]: any }) => {
    switch (type) {
      ...
      case "all_resources_loaded":
        console.log("All resources loaded:", data);
        // display KinesteX view now
        setAllResourcesLoaded(true);
        // send an action to start the workout flow
        kinestexSDKRef.current?.sendAction("workout_activity_action", "start");
        break;
    }
  };

Exercise Configuration

WorkoutExerciseSequence Object

Each exercise in your custom workout is defined by the following properties:

PropertyTypeDescriptionRequired

exerciseId

string

Exercise identifier - can be exercise name or Firebase document ID

✅ Yes

reps

number | null

Number of repetitions to complete (use null for duration-based exercises)

✅ Yes

duration

number | null

Duration in seconds to perform exercise (use null for rep-based exercises)

✅ Yes

includeRestPeriod

boolean

Whether to include a rest period after this exercise

✅ Yes

restDuration

number

Duration of rest period in seconds (used if includeRestPeriod is true)

✅ Yes

Note: At least one of reps or duration must be non-null. You can also specify both if the exercise should track both metrics.


New Messages You'll Receive from the SDK

Message TypeDescriptionExample

custom_workout_ready

SDK is ready to receive custom workout data

{ type: "custom_workout_ready", message: "Ready to receive workout data" }

all_resources_loaded

All exercise models, audio, and assets are loaded

{ type: "all_resources_loaded", message: "Custom workout data loaded successfully" }

error_occurred

An error occurred during setup or execution

{ type: "error_occurred", severity: "critical", message: "Failed to load exercise data" }

workout_exit_request

Request to exit the workout

{ type: "workout_exit_request", location: "accelerometer" | "statistic" | "checkframe" }