# sTvOS v1

Multi-tenant fitness operating system for studios, trainers, and partners.

The multi-tenant fitness operating system that powers white-label fitness applications. One platform -- unlimited studios, trainers, and partners.


# What is sTvOS?

sTvOS is a backend-as-a-service for fitness and wellness brands. Each client (studio, gym chain, or wellness company) gets an isolated, fully branded environment with its own content library, trainers, users, and partner access -- all powered by a single API.


# Platform Capabilities

Stream on-demand fitness classes with full session tracking, progress persistence, and auto-completion. Schedule and launch live classes powered by LiveKit video rooms with real-time participant management.

  • Content discovery with search, categories, and filtering
  • Session tracking with 30-second progress heartbeats
  • Auto-completion at 90% viewed
  • Live class scheduling and participant management
  • Per-client category scoping

Generate personalised workout, nutrition, and class plans from user profiles using AI. Plans are saved to user accounts and combined into a unified daily view.

  • AI workout plan generation with exercise selection
  • AI nutrition plan generation with dietary restriction support
  • AI class plan matching users to optimal schedules
  • Combined daily plan view (workouts + meals + classes)
  • Shopping list generation for nutrition plans

A full trainer ecosystem: discovery, services, availability calendars, 1-on-1 booking, group classes, and structured programmes with subscription lifecycle management.

  • Trainer profiles with services and specialisations
  • Calendar-based availability and time slot management
  • 1-on-1 session booking with video launch via LiveKit
  • Group classes with capacity management
  • Programmes with pause/resume/cancel lifecycle

Conversational AI coaching powered by Hume's Empathic Voice Interface. The voice agent can query plans, recommend classes, check coach availability, and book sessions -- all through natural conversation.

  • Per-client and per-trainer voice configurations
  • Tool-calling support for real-time data queries
  • LiveKit token generation for voice rooms
  • Anonymous voice sessions during onboarding

Partners (gyms, corporates, resellers) manage member access through voucher codes. A dedicated portal provides member oversight, usage analytics, and billing reports.

  • Voucher generation (bulk up to 500 per request)
  • Member management with activity tracking
  • Watch time and content analytics
  • Monthly billing reports with CSV export

# How It Works

---
config:
  theme: base
  themeVariables:
    primaryColor: "#dbeafe"
    primaryTextColor: "#1e3a5f"
    primaryBorderColor: "#60a5fa"
    secondaryColor: "#f0fdf4"
    secondaryTextColor: "#166534"
    secondaryBorderColor: "#86efac"
    tertiaryColor: "#f8fafc"
    tertiaryTextColor: "#475569"
    tertiaryBorderColor: "#cbd5e1"
    lineColor: "#94a3b8"
    fontFamily: "Inter, system-ui, sans-serif"
    fontSize: "13px"
---
graph TB
    subgraph platform["sTvOS Platform"]
        direction LR
        API["REST API  /api/v1"]
        AI["AI Engine"]
        LIVE["LiveKit"]
        STORE[("Content Store")]
    end

    subgraph clients["Isolated Client Tenants"]
        direction LR
        subgraph client_a[" Boutique Studio "]
            A_KEY[/"API Key"/]
            A_DATA["Users, Classes, Trainers"]
        end
        subgraph client_b[" Gym Chain "]
            B_KEY[/"API Key"/]
            B_DATA["Users, Classes, Trainers"]
        end
        subgraph client_c[" Corporate Wellness "]
            C_KEY[/"API Key"/]
            C_DATA["Users, Classes, Trainers"]
        end
    end

    platform --- clients
    API ~~~ AI
    API ~~~ LIVE
    API ~~~ STORE

Each client operates in complete isolation. A user registered under "Boutique Studio" only sees that studio's classes, trainers, and content. Partners distribute voucher codes that map new users to their client on registration.


# Quick Start

Every request to sTvOS requires a Client API Key sent via the X-API-Key header. API keys are provisioned by the platform admin and scoped to a single client.

curl -H "X-API-Key: your-client-api-key" \
  https://api.studiostv.net/api/v1/health
const response = await fetch('https://api.studiostv.net/api/v1/health', {
  headers: { 'X-API-Key': 'your-client-api-key' }
});
const data = await response.json();
import requests

response = requests.get(
    'https://api.studiostv.net/api/v1/health',
    headers={'X-API-Key': 'your-client-api-key'}
)
print(response.json())

Create a user account under your client. Optionally include a voucher code for partner-managed registration.

curl -X POST https://api.studiostv.net/api/v1/auth/register \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-client-api-key" \
  -d '{
    "email": "user@example.com",
    "password": "securepassword",
    "name": "Jane Doe"
  }'
const response = await fetch('https://api.studiostv.net/api/v1/auth/register', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-API-Key': 'your-client-api-key'
  },
  body: JSON.stringify({
    email: 'user@example.com',
    password: 'securepassword',
    name: 'Jane Doe'
  })
});
const { data } = await response.json();
response = requests.post(
    'https://api.studiostv.net/api/v1/auth/register',
    headers={'X-API-Key': 'your-client-api-key'},
    json={'email': 'user@example.com', 'password': 'securepassword', 'name': 'Jane Doe'}
)
data = response.json()['data']

The response includes accessToken and refreshToken for authenticating subsequent requests.

Fetch the home screen content feed for your client -- featured classes, continue watching, upcoming live, and categories.

curl https://api.studiostv.net/api/v1/content/discover \
  -H "X-API-Key: your-client-api-key" \
  -H "Authorization: Bearer <access-token>"

Create a personalised workout plan and save it to the user's account.

curl -X POST https://api.studiostv.net/api/v1/users/me/workout-plan \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-client-api-key" \
  -H "Authorization: Bearer <access-token>" \
  -d '{ "preferences": { "daysPerWeek": 4, "intensity": "medium" } }'

# Explore the Docs


# Built With

Component Technology Purpose
API Server Hono on Node.js High-performance REST API with TypeScript
Database PostgreSQL + Drizzle ORM Multi-tenant data store with client isolation
AI Generation Google Vertex AI Gemini Workout, nutrition, and class plan generation
Food Scanning Google Vertex AI Gemini Image-based nutritional analysis
Voice AI Hume EVI + LiveKit Empathic conversational coaching
Live Video LiveKit Real-time video rooms for live classes and 1-on-1 sessions
File Storage ImageKit Image and media CDN with on-the-fly transformations