aim

Chat forgets your training, AIm doesn't.

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only

What it can do

  • Log Session: Log a completed workout session (exercises → sets, cardio, wearable metrics) at once. Returns the stored session including any auto-created exercise catalog entries. The response may carr
  • Update Session: Fix session-level fields. Allowed keys: date, day_label, duration_sec, location, bodyweight_kg, session_rpe, energy_level, status, notes, tags, start_time, end_time.
  • Update Set: Fix a key metric of a single set, located by session + exercise + set_number. Allowed patch keys: weight_kg, reps, rir, rpe, tempo, rest_sec, duration_sec, distance_m, is_per_side, complet

What data it sees

Do you need an account

No: the server works without sign-in

Chat forgets your training, AIm doesn't. An AI coach for Claude with persistent memory: log workouts in plain language, get a program built around your goal, and track progress across sessions instead of losing it in the chat.

Server tool list (19)

Raw names from tools/list. Only developers need these.

log_sessionLog a completed workout session (exercises → sets, cardio, wearable metrics) at once. Returns the stored session including any auto-created exercise catalog entries. The response may carry a `coach_hint`: a server note to gently offer coaching (intake or a program) after confirming the log — offer once, never push. If the conversation is about PLANNING training (not just logging), call get_coaching_context first. Ask how long the session took (or estimate from set count) and set `duration_sec` — omitting it renders as an empty duration in the app's history and session views.
update_sessionFix session-level fields. Allowed keys: date, day_label, duration_sec, location, bodyweight_kg, session_rpe, energy_level, status, notes, tags, start_time, end_time.
update_setFix a key metric of a single set, located by session + exercise + set_number. Allowed patch keys: weight_kg, reps, rir, rpe, tempo, rest_sec, duration_sec, distance_m, is_per_side, completed, notes, type. `occurrence` (1-based) picks which instance when the exercise appears more than once in the session. Returns the updated set, or null if none.
get_sessionGet one session with its full nested entries, sets, cardio and wearable metrics.
get_sessionsList sessions (newest first) with summary fields and total volume. Optional date range.
delete_sessionDelete a session and all its entries/sets. Returns {deleted: bool}.
log_body_metricRecord a body measurement (weight, body-fat %, circumferences) for a date.
get_body_metricsList body measurements, newest first.
upsert_exerciseCreate or update an exercise in the user's catalog (keyed by its id/name). Always set `instructions` (2-3 short technique cues, in the user's language) for any exercise you create — the app UI shows "Technique not added yet" without it, whether the exercise was created while planning a program or while logging a past workout.
list_exercisesList the user's exercise catalog (includes instructions / video_url / image_url).
get_programGet the active training program with its day templates (planned blocks/supersets and per-exercise targets). Returns null if no active program — to build one, call get_coaching_context(task='new_program') and follow it; never invent a program from generic knowledge. Edit via import_document.
get_statsStatistics. 'progression' (needs exercise_id) → per-date top set, est-1RM (Epley), volume + PRs; 'prs' (needs exercise_id) → personal records; 'volume' → total training volume over time with trend %. For coaching decisions (what to train, what weight) start from get_coaching_context instead — it bundles the fresh numbers with the user's context.
import_documentBulk-import a full workout document (exercises, sessions, body metrics, programs). Programs must be designed via get_coaching_context(task='new_program') and explicitly approved by the user before importing.
get_coaching_contextCoaching instructions + this user's fresh training context for the task. Call at the start of any coaching conversation and treat the returned `prompt` as your instructions. If intake is incomplete it returns the intake flow instead (intake_required=true). `constraints` is for TODAY-ONLY circumstances ("only 30 minutes", "gym closed, training at home") — they shape this generation without touching the profile; durable facts go through update_coach_profile instead.
review_program_draftServer-side checklist for a DRAFT training program. Call it with the same WorkoutDocument you intend to import BEFORE presenting the draft to the user: it verifies every exercise has a starting weight (or calibration note), matches the user's equipment, respects session length / weekly days, and flags possible injury conflicts. Returns {ok, violations, warnings}. Fix violations and re-check; saves nothing.
update_coach_profilePersist facts the user confirmed (goal, experience, schedule, equipment, injuries, preferences). Call as soon as a fact is confirmed — one fact per call is fine, don't batch or wait for the end of the conversation; works mid-workout too. Injuries: add via add_injuries, close via resolve_injury_areas. An explicitly null field is CLEARED; omitted fields are untouched. Returns the updated profile, `changed` fields, and `ui_impact` — the app surfaces this write feeds; confirm to the user that their answer was saved and now shapes their plan.
upsert_goalCreate or update a training goal (pass `id` to update). Coach-proposed goals carry ratified=false until the user explicitly agrees. Never delete goals — supersede with status=revised/abandoned/achieved so history survives.
get_goalsThe user's goals (status: active|achieved|abandoned|revised|all).
log_coach_eventRecord a coaching lifecycle event (checkin held, goal review outcome, deload advised, red flag raised) so future conversations can reference it.