Quick update post for the new v1.0.0-rc.4 release.

LiftTrace is a self-hosted lifting tracker I posted here a few days ago. It's an open, AGPL-3.0 alternative to subscription apps like Strong ($5/mo), Hevy ($6/mo Pro), Jefit ($7/mo Pro), Fitbod (~$80/yr), and the coaching tier of Trainerize / Caliber. Single Docker container, PWA plus a signed Android APK.

Repo: https://github.com/TraceApps/lifttrace Image: ghcr.io/traceapps/lifttrace Latest release (with APK): https://github.com/TraceApps/lifttrace/releases/latest Full changelog: https://github.com/TraceApps/lifttrace/blob/main/CHANGELOG.md

What's new in v1.0.0-rc.4

  • NutriTrace federation: if you also self-host my sister app (NutriTrace), each completed workout's estimated calories burned auto-logs to your NutriTrace diary. Wearable data (Fitbit / Garmin / Health Connect) still wins for overlap so you don't double-count. Set up in Settings → Integrations → NutriTrace with a personal access token.
  • Editable workout duration on the completion summary: the Duration tile is now a button. Tap to pick from quick presets (30 / 45 / 60 / 75 / 90 / 120 min) or enter a custom value. Useful for the "forgot to start the timer" case, and the kcal estimate updates live.
  • Fallback kcal estimate when no duration was tracked, derived from completed set count and badged "rough" so you know it's less precise than a timed session.
  • Persistent "Connected" pill on the federation card so you can tell at a glance the integration is still healthy, plus a shared loading spinner across Diary, Programs, Coaching, Exercise detail, Statistics, and the Workout editor.
  • Polish pass: stronger affordance on the editable Duration tile, title-case sweep across about 20 button and menu labels, better error surfacing for Settings → Backup and Radio when the upstream isn't reachable, and a small wizard celebration screen at the end of first-run setup.
  • Fixed: workout-complete notification firing on every set toggle when re-opening a completed workout's summary (rc.3 caught the main flow; this patches the toggle edge case).

What's in it (full feature list)

  • Diary with sets, reps, weights, RPE, persistent rest timer that survives navigation, supersets, warm-up generator, and natural-language Smart Add (e.g. "bench 3x5 @ 225, A1: curls 3x12 @ 30").
  • Programs: build mesocycles, assign templates by day, progress through weeks.
  • Exercises: full library from wger, free-exercise-db, and exercisedb, plus your own custom entries with images, GIFs, or YouTube links.
  • Statistics: volume, PRs, frequency, body stats trends, RPE overlays, sparklines.
  • Coaching: trainers can prescribe workouts to athletes, leave per-set feedback, two-way reply threads. Replaces a Trainerize or Caliber subscription for small training rosters.
  • Trace AI: optional chat coach, multi-provider (Claude, OpenAI, Gemini, or any OpenAI-compatible endpoint like Ollama, LM Studio, DeepSeek, Groq). BYOK, opt-in, disabled by default.
  • Radio: built-in music player for Subsonic, Jellyfin, Plex, and Emby libraries plus Icecast, Shoutcast, and HLS streaming stations. Lockscreen controls, now-playing metadata, frequency visualizer on the FAB.
  • OIDC SSO: Authentik, Keycloak, Pocket ID, Authelia, Auth0, Google, anything OIDC 1.0. Multi-provider supported.
  • Import from Strong, Hevy, FitNotes, and Jefit CSV exports so you can leave your existing app in about a minute.
  • Android: local SQLite mirror with optional server sync, native ExoPlayer for radio, biometric sign-in, signed release APK on every release.

Deployment

services:
  lifttrace:
    image: ghcr.io/traceapps/lifttrace:latest
    ports:
      - "3002:3003"
    volumes:
      - ./data:/data
    environment:
      JWT_SECRET: ${JWT_SECRET}        # required in production
      INSECURE_COOKIES: "1"            # only if not terminating TLS

docker compose up -d, browse to http://localhost:3002/, finish the first-run wizard. Full env-var reference, reverse-proxy examples (Caddy, nginx), OIDC setup, SMTP setup, and the four supported "connecting from Android" paths are in DEPLOY.md.

Signed APK SHA-256 is published with each GitHub Release for verification. Debug APK (accepts HTTP and self-signed certs) is npm run android:debug for LAN-only setups.

No telemetry, no analytics, no anonymous usage pings. The app phones home only to your own server, or doesn't phone home at all in Android local mode.

other discussions
 

Quick update post for the new v1.0.0-rc.4 release.

LiftTrace is a self-hosted lifting tracker I posted here a few days ago. It's an open, AGPL-3.0 alternative to subscription apps like Strong ($5/mo), Hevy ($6/mo Pro), Jefit ($7/mo Pro), Fitbod (~$80/yr), and the coaching tier of Trainerize / Caliber. Single Docker container, PWA plus a signed Android APK.

Repo: https://github.com/TraceApps/lifttrace Image: ghcr.io/traceapps/lifttrace Latest release (with APK): https://github.com/TraceApps/lifttrace/releases/latest Full changelog: https://github.com/TraceApps/lifttrace/blob/main/CHANGELOG.md

What's new in v1.0.0-rc.4

  • NutriTrace federation: if you also self-host my sister app (NutriTrace), each completed workout's estimated calories burned auto-logs to your NutriTrace diary. Wearable data (Fitbit / Garmin / Health Connect) still wins for overlap so you don't double-count. Set up in Settings → Integrations → NutriTrace with a personal access token.
  • Editable workout duration on the completion summary: the Duration tile is now a button. Tap to pick from quick presets (30 / 45 / 60 / 75 / 90 / 120 min) or enter a custom value. Useful for the "forgot to start the timer" case, and the kcal estimate updates live.
  • Fallback kcal estimate when no duration was tracked, derived from completed set count and badged "rough" so you know it's less precise than a timed session.
  • Persistent "Connected" pill on the federation card so you can tell at a glance the integration is still healthy, plus a shared loading spinner across Diary, Programs, Coaching, Exercise detail, Statistics, and the Workout editor.
  • Polish pass: stronger affordance on the editable Duration tile, title-case sweep across about 20 button and menu labels, better error surfacing for Settings → Backup and Radio when the upstream isn't reachable, and a small wizard celebration screen at the end of first-run setup.
  • Fixed: workout-complete notification firing on every set toggle when re-opening a completed workout's summary (rc.3 caught the main flow; this patches the toggle edge case).

What's in it (full feature list)

  • Diary with sets, reps, weights, RPE, persistent rest timer that survives navigation, supersets, warm-up generator, and natural-language Smart Add (e.g. "bench 3x5 @ 225, A1: curls 3x12 @ 30").
  • Programs: build mesocycles, assign templates by day, progress through weeks.
  • Exercises: full library from wger, free-exercise-db, and exercisedb, plus your own custom entries with images, GIFs, or YouTube links.
  • Statistics: volume, PRs, frequency, body stats trends, RPE overlays, sparklines.
  • Coaching: trainers can prescribe workouts to athletes, leave per-set feedback, two-way reply threads. Replaces a Trainerize or Caliber subscription for small training rosters.
  • Trace AI: optional chat coach, multi-provider (Claude, OpenAI, Gemini, or any OpenAI-compatible endpoint like Ollama, LM Studio, DeepSeek, Groq). BYOK, opt-in, disabled by default.
  • Radio: built-in music player for Subsonic, Jellyfin, Plex, and Emby libraries plus Icecast, Shoutcast, and HLS streaming stations. Lockscreen controls, now-playing metadata, frequency visualizer on the FAB.
  • OIDC SSO: Authentik, Keycloak, Pocket ID, Authelia, Auth0, Google, anything OIDC 1.0. Multi-provider supported.
  • Import from Strong, Hevy, FitNotes, and Jefit CSV exports so you can leave your existing app in about a minute.
  • Android: local SQLite mirror with optional server sync, native ExoPlayer for radio, biometric sign-in, signed release APK on every release.

Deployment

services:
  lifttrace:
    image: ghcr.io/traceapps/lifttrace:latest
    ports:
      - "3002:3003"
    volumes:
      - ./data:/data
    environment:
      JWT_SECRET: ${JWT_SECRET}        # required in production
      INSECURE_COOKIES: "1"            # only if not terminating TLS

docker compose up -d, browse to http://localhost:3002/, finish the first-run wizard. Full env-var reference, reverse-proxy examples (Caddy, nginx), OIDC setup, SMTP setup, and the four supported "connecting from Android" paths are in DEPLOY.md.

Signed APK SHA-256 is published with each GitHub Release for verification. Debug APK (accepts HTTP and self-signed certs) is npm run android:debug for LAN-only setups.

No telemetry, no analytics, no anonymous usage pings. The app phones home only to your own server, or doesn't phone home at all in Android local mode.

 

Just made LiftTrace public after months of development. It's a self-hosted weightlifting / training log that runs in a single Docker container on your own hardware, with a PWA frontend and a signed Android APK. Sister app to NutriTrace under the same TraceApps umbrella.

LiftTrace Diary

What it does:

  • Diary with sets, reps, RPE, warm-up flagging, supersets, rest timer
  • Smart Add — type or speak your workout ("bench 3x5 @ 225, A1: curls 3x12, A2: pushdowns 3x12") and the AI parses it into structured sets
  • Programs with mesocycles, weekly templates, coach prescriptions for trainer / athlete pairs
  • Exercise library seeded from wger + Free Exercise DB (~1,500 exercises with images), plus your own custom uploads
  • Statistics: volume, PRs, frequency heatmap, body weight trends
  • OIDC SSO for Authentik, Keycloak, Pocket ID, Authelia, Auth0, Google, etc.
  • Workout History Import from Strong, Hevy, FitNotes, and Jefit CSVs (so you don't lose your history switching over)
  • Radio player built in for Subsonic / Jellyfin / Plex / Emby plus internet stations (because lifting and lockscreen media controls > switching apps mid-set)
  • AI coach with live workout context — bring your own Claude / OpenAI / Gemini key, or point it at Ollama / LM Studio / any OpenAI-compatible endpoint
  • Android app with offline-first SQLite, biometric sign-in, native ExoPlayer, optional WorkManager reminders

Self-hosted principles:

  • AGPL-3.0, source is open, no telemetry, no central server, no analytics, no cloud sync to anybody else
  • Single Docker container + bind-mounted volumes for DB and uploads
  • Your data stays on your hardware. Back up with cp, restore with cp.

Quick start:

services:
  lifttrace:
    image: ghcr.io/traceapps/lifttrace:latest
    ports: ["3002:3003"]
    volumes:
      - ./data/db:/data/db
      - ./data/uploads:/data/uploads
    environment:
      - DB_PATH=/data/db/lifttrace.db
      - UPLOADS_PATH=/data/uploads
      - JWT_SECRET=change-me