Skip to main content

MoExercises

"The Encyclopedia" — "I know every movement"

Status: ✅ Built

MoExercises provides the comprehensive exercise database with 200+ exercises, movement patterns, and intelligent alternatives.


Purpose

  • Store exercise definitions and metadata
  • Categorize by movement pattern
  • Provide equipment requirements
  • Enable exercise alternatives
  • Support search and discovery

Implementation

Database Schema

// From schema.ts
export const exercises = pgTable("exercises", {
id: text("id").primaryKey(),
name: text("name").notNull(),
movementPattern: text("movement_pattern").notNull(),
equipment: text("equipment").notNull(),
primaryMuscles: text("primary_muscles").array().notNull(),
secondaryMuscles: text("secondary_muscles").array(),
isCompound: boolean("is_compound").default(true),
difficulty: text("difficulty"),
instructions: text("instructions"),
tips: text("tips").array(),
createdAt: timestamp("created_at").defaultNow(),
});

Seed Data Structure

// From seed-exercises.ts
const exercises = [
{
id: "barbell-bench-press",
name: "Barbell Bench Press",
movementPattern: "horizontal_push",
equipment: "barbell",
primaryMuscles: ["chest", "triceps"],
secondaryMuscles: ["front_deltoids"],
isCompound: true,
difficulty: "intermediate",
instructions: "Lie on bench, grip bar slightly wider than shoulders...",
tips: ["Keep shoulder blades retracted", "Drive feet into floor"]
},
// ... 200+ more exercises
];

Movement Patterns

PatternCodeDescription
Horizontal Pushhorizontal_pushChest-focused pressing
Horizontal Pullhorizontal_pullBack rowing movements
Vertical Pushvertical_pushOverhead pressing
Vertical Pullvertical_pullPulldowns and pull-ups
SquatsquatKnee-dominant legs
HingehingeHip-dominant legs
LungelungeSingle-leg patterns
CarrycarryLoaded carries
CorecoreTrunk stability
Arm Isolationarm_isolationBiceps/triceps
Shoulder Isolationshoulder_isolationDelt work
Leg Isolationleg_isolationQuads/hams/calves

Equipment Types

EquipmentCodeExamples
BarbellbarbellBench, Squat, Deadlift
DumbbelldumbbellDB Press, Rows
CablecablePushdowns, Flyes
MachinemachineLeg Press, Pec Deck
BodyweightbodyweightPull-ups, Dips
KettlebellkettlebellSwings, Goblet Squat
EZ Barez_barCurls, Skullcrushers
BandsbandsBand Pull-aparts

API Endpoints

EndpointMethodDescription
/api/exercisesGETList all exercises
/api/exercises?pattern=XGETFilter by pattern
/api/exercises?equipment=XGETFilter by equipment
/api/exercises/search?q=XGETSearch by name
/api/exercises/:idGETGet single exercise
/api/exercises/alternativesGETGet alternatives

Alternatives Endpoint

GET /api/exercises/alternatives?exerciseId=X&pattern=Y

Response:
{
"alternatives": [
{
"id": "incline-dumbbell-press",
"name": "Incline Dumbbell Press",
"equipment": "dumbbell",
"score": 0.85,
"reason": "Same pattern, different equipment"
},
...
]
}

Code Location

/lib/db
├── seed-exercises.ts → Exercise seed data
└── schema.ts → Exercise table schema

/app/api/exercises
├── route.ts → List/search exercises
├── [id]/route.ts → Get single exercise
└── alternatives/route.ts → Get alternatives

Alternative Scoring

function scoreAlternative(original: Exercise, candidate: Exercise): number {
let score = 0;

// Same movement pattern (required)
if (candidate.movementPattern !== original.movementPattern) {
return 0;
}

// Primary muscle overlap
const muscleOverlap = intersect(
original.primaryMuscles,
candidate.primaryMuscles
).length;
score += muscleOverlap * 0.3;

// Same difficulty level
if (candidate.difficulty === original.difficulty) {
score += 0.2;
}

// Equipment availability bonus
if (isEquipmentAvailable(candidate.equipment)) {
score += 0.2;
}

return Math.min(score, 1);
}

Implementation Status

FeatureStatus
Exercise database✅ 200+ exercises
Movement patterns✅ 12 patterns
Equipment types✅ 8 types
Search endpoint✅ Built
Filter by pattern✅ Built
Alternative scoring✅ Built
Form instructions⚠️ Partial
Video references❌ Future