Skip to main content

MoSettings

"The Customizer" — "I remember how you like things"

Status: ✅ Built

MoSettings manages user training preferences including equipment level, units, session duration targets, and warmup settings.


Purpose

  • Store training preferences
  • Configure equipment availability
  • Set preferred units (lbs/kg)
  • Define session duration targets
  • Control warmup behavior
  • Enable/disable auto-progression

Implementation

Code Location

/lib/mo-self/preferences/settings.ts

Key Functions

// Get user preferences (creates defaults if none exist)
export async function getPreferences(userId: string): Promise<UserPreferences>

// Update preferences
export async function updatePreferences(
userId: string,
updates: UpdatePreferencesInput
): Promise<UserPreferences>

// Get equipment level shorthand
export async function getEquipmentLevel(userId: string): Promise<EquipmentLevel>

Usage

import { getPreferences, updatePreferences } from '@/lib/mo-self';

// Get preferences
const prefs = await getPreferences(userId);

// Update preferences
await updatePreferences(userId, {
equipmentLevel: 'home_gym',
preferredUnits: 'kg',
sessionDurationTarget: 60
});

Data Model

interface UserPreferences {
id: string;
userId: string;

// Equipment
equipmentLevel: EquipmentLevel;

// Units
preferredUnits: 'lbs' | 'kg';

// Session
sessionDurationTarget: number; // minutes
restTimerEnabled: boolean;

// Warmup
warmupEnabled: boolean;
warmupDuration: number; // minutes

// Progression
autoProgressionEnabled: boolean;

createdAt: Date;
updatedAt: Date;
}

type EquipmentLevel = 'full_gym' | 'home_gym' | 'bodyweight';

Database Table

CREATE TABLE user_preferences (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id) UNIQUE,
equipment_level equipment_level DEFAULT 'full_gym',
preferred_units VARCHAR(10) DEFAULT 'lbs',
session_duration_target INTEGER DEFAULT 60,
rest_timer_enabled BOOLEAN DEFAULT true,
warmup_enabled BOOLEAN DEFAULT true,
warmup_duration INTEGER DEFAULT 10,
auto_progression_enabled BOOLEAN DEFAULT true,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);

API Endpoints

GET /api/preferences

Returns user preferences.

{
"equipmentLevel": "full_gym",
"preferredUnits": "lbs",
"sessionDurationTarget": 60,
"restTimerEnabled": true,
"warmupEnabled": true,
"warmupDuration": 10,
"autoProgressionEnabled": true
}

PATCH /api/preferences

Updates preferences.

{
"equipmentLevel": "home_gym",
"preferredUnits": "kg"
}

Equipment Levels

LevelDescriptionExample Equipment
full_gymCommercial gymAll machines, cables, barbells
home_gymHome setupBarbell, dumbbells, bench, rack
bodyweightNo equipmentBodyweight exercises only

Equipment level affects exercise suggestions in MoSuggest.


Integration Points

Provides to:

  • MoSuggest (equipment filtering)
  • MoWarmup (warmup settings)
  • Workout UI (rest timer, units)
  • MoProgress (auto-progression flag)

Receives from:

  • Settings UI
  • Onboarding flow

Default Values

New users get these defaults:

SettingDefault
equipmentLevelfull_gym
preferredUnitslbs
sessionDurationTarget60
restTimerEnabledtrue
warmupEnabledtrue
warmupDuration10
autoProgressionEnabledtrue