LiftTrace logo

LiftTrace

Self-hosted weightlifting tracker with programs, PR tracking, and an AI coach

Alternative to: strong, hevy

LiftTrace screenshot

About Versions (42)

v1.0.2

2026-07-28

LiftTrace v1.0.2 lands with a substantial AI upgrade, a genuinely better statistics view, and a long-overdue standalone-mode expansion.

Added

  • Trace AI tool use. Trace now calls 18 typed tools (11 read + 7 write) instead of relying on a pre-stuffed context payload. Assistant can read workouts, exercises, programs, PRs, body stats, coach prescriptions, and take actions like log a workout, add an exercise to today’s diary, log a body stat, start a workout from a template, switch active program, or (as a coach) prescribe a workout to a trainee. System prompt trimmed to a small stable core; the model fetches on demand. Provider parity across Claude, OpenAI, Gemini, and any OpenAI-compatible endpoint.

  • Muscle Balance body-map on Statistics. The Volume metric’s “Volume by Muscle Group” horizontal-bar list is replaced with a shaded body-map view: front + back silhouettes with each of 18 muscles coloured 0–4 relative to the hardest-worked muscle in the current range. Below it, a Not Trained in This Period chip row spells out exactly which muscles the current window skipped. Counts effective sets (primary muscles = 1.0, secondary = 0.4) not weight lifted, since 100 kg of leg press vs 12 kg of lateral raise says nothing meaningful about which muscle worked harder. SVG geometry is fetched lazily on first render so nothing else in the bundle grows.

  • Public exercise catalogs import in standalone Android (#18). wger, Free Exercise DB, and ExerciseDB (open-source) all show up as Import cards in Settings → Exercise Catalog when the Android app runs in local-only mode. Tapping Import fetches the source directly via CapacitorHttp (no server needed, no CORS constraint) and writes to the on-device SQLite mirror. That’s roughly 3,000 exercises with images and GIFs available offline on day one. Previously the section returned 501 in standalone; anyone who imported public catalogs before switching to a server keeps them locally as a dormant cache, and the server’s catalog takes over in server mode. The paid ExerciseDB (RapidAPI) card still points at server mode for now.

Changed

  • AI proxy rate limit raised to 30 requests / 60 seconds per user to accommodate multi-round tool-use loops.
  • AI proxy payload caps raised to 60 messages / 8 MB (was 60 / 200 KB) to fit tool-result echoes.
  • Gemini default bumped to gemini-2.5-flash. Saved selections of retired gemini-1.5-* or gemini-2.0-* models are quietly remapped at request time so calls don’t 404 after Google’s retirement dates.

Fixed

  • OpenAI-compatible endpoints accept vision requests again. Image content blocks are normalised on both the server proxy and callAIProxy client wrapper before forwarding, so a request with an image attached goes through whether the block is a string URL or an object with image_url.url.
  • GPT-5.6-era chat parameters supported. The AI proxy translates the newer max_completion_tokens and reasoning_effort fields when talking to models that require them, so calls to GPT-5.6 and equivalents don’t 400 on the older max_tokens field name.
  • Full-backup restore no longer silently drops coach data. The coach_feedback and coach_activity tables were included in exports but missing from the restore INSERT column lists, so any coach comments or activity history vanished after a restore-from-backup. Both tables now round-trip cleanly.

Signed APK attached. Docker image is multi-arch (amd64 + arm64):

docker pull ghcr.io/traceapps/lifttrace:1.0.2
# or pin the minor line for auto-patch updates
docker pull ghcr.io/traceapps/lifttrace:1.0