Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesExercisesExercises — code map

Exercises — code map

API

Controllers

FileBase pathNotes
apps/api/src/exercises/exercises.controller.ts/organizations/:orgId/exercisesStandard CRUD + library + overrides
apps/api/src/exercises/exercise-search.controller.ts/exercisesGET /search — hybrid search, optional ?orgId
apps/api/src/exercises/admin-canonical.controller.ts/admin/exercises/canonicalPlatform-admin: seed, enrich, jobs

Services

FileResponsibility
apps/api/src/exercises/exercises.service.tsCRUD, library list, single-read
apps/api/src/exercises/exercise-overrides.service.tsUpsert/reset overrides; exports mergeExerciseWithOverride
apps/api/src/exercises/exercise-search.service.tsRRF lexical + trgm + semantic search
apps/api/src/exercises/canonical-seed.service.tsR2 JSON → canonical upsert + Voyage embed
apps/api/src/exercises/canonical-seed.processor.tsBullMQ processor for seed jobs
apps/api/src/exercises/canonical-enrich.service.tsAnthropic Haiku Hebrew/Russian alias enrichment
apps/api/src/exercises/canonical-enrich.processor.tsBullMQ processor for enrichment jobs
apps/api/src/exercises/canonical-utils.tsSlug / equipment / muscle normalization helpers

DTOs (apps/api/src/exercises/dto/)

  • create-exercise.dto.ts, update-exercise.dto.ts, upsert-exercise.dto.ts
  • canonical-seed.dto.ts, canonical-enrich.dto.ts

Routes

RouteMethod
GET /organizations/:orgId/exercisesfindAll (legacy org-only list)
GET /organizations/:orgId/exercises/libraryfindAllForLibrary (merged + paginated)
GET /organizations/:orgId/exercises/library/:idfindByIdForLibrary
GET /organizations/:orgId/exercises/:idfindById (accepts canonical)
POST /organizations/:orgId/exercisescreate org-custom
PATCH /organizations/:orgId/exercises/:idupdate org-custom
DELETE /organizations/:orgId/exercises/:idremove org-custom (soft)
POST /organizations/:orgId/exercises/upsertupsert by case-insensitive name
PUT /organizations/:orgId/exercises/:id/overrideupsertOverride
DELETE /organizations/:orgId/exercises/:id/overridedeleteOverride (reset)
GET /exercises/searchHybrid search; ?orgId optional
POST /admin/exercises/canonical/seedPlatform admin
POST /admin/exercises/canonical/enrichPlatform admin
GET /admin/exercises/canonical/jobsPlatform admin
GET /admin/exercises/canonical/jobs/:queue/:idPlatform admin

Web

Components

  • apps/web/src/components/overview/workouts/exercise-library-browser.tsx — coach library tab
  • apps/web/src/components/overview/workouts/exercise-autocomplete.tsx — in-builder picker
  • apps/web/src/components/overview/workouts/exercise-video-dialog.tsx — preview demo
  • TODO: verify — likely a dedicated movement library detail/edit page.

E2E

  • apps/web/e2e/specs/coach-movements-library.spec.ts — library browse + override flow.

DB

libs/db/src/lib/schema/workouts.ts (same file as workouts):

  • exercises — both canonical (org_id null) and org rows.
  • exercise_org_overrides — JSONB diff per (org, exercise).
  • exercise_comments — comments on a workout_movement (lives in comments.ts).

Indexes (exercises):

IndexColumns / clause
exercises_slug_unique_idxUNIQUE on slug WHERE slug IS NOT NULL AND organization_id IS NULL
exercises_search_tsv_idxGIN on search_tsv
exercises_name_trgm_idxGIN on name gin_trgm_ops (pg_trgm, migration 0039)
exercises_embedding_idxHNSW on embedding (vector_cosine_ops)
exercises_movement_pattern_idxpartial on movement_pattern WHERE not null
exercises_org_id_idxon organization_id
exercises_forked_from_id_idxpartial WHERE not null

Indexes (exercise_org_overrides):

  • exercise_org_overrides_org_exercise_unique UNIQUE on (organization_id, exercise_id)
  • exercise_org_overrides_org_idx on organization_id

Shared

  • libs/shared/src/lib/schemas/exercise.schema.ts — Zod schemas for read responses, category/kind enum values.
  • libs/shared/src/lib/exercise-overrides.tsoverridableExerciseFieldKeys (the allowlist), OverridableExerciseFields type, EffectiveExercise type, MovementSourceFilter enum. TODO: verify exact filename.
  • libs/shared/src/lib/agent-schemas/read.ts — agent-facing exercise search query schema (exerciseSearchQuerySchema).

Tests

FileType
apps/api/src/exercises/exercise-overrides.service.unit.spec.tsUnit — merge logic, override upsert
apps/api/src/exercises/exercise-search.int.spec.tsIntegration — RRF, lexical/semantic/hybrid modes
apps/web/e2e/specs/coach-movements-library.spec.tsE2E — library browse + override