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.4.0-dev02

2026-09-25

Second dev pre-release of 1.4.0. Almost all fixes: most came from testing dev01 on set videos, the rest from issues and a Reddit thread. Cardio-only days now count toward your streak.

Fixed

  • The updater can no longer offer a phone the watch build. Both APKs ship in one release under the same package id, and the updater took whichever was listed first. It now picks the phone’s build by name.
  • An OpenAI-compatible provider with /api in its address works in the Android app (#118, reported by @kgenerozov). The app claimed every request beginning /api/ as its own, so a base URL like https://openrouter.ai/api went to your LiftTrace server and came back 404. It also caught shared exercise links and music served from an /api/ path.
  • A cardio-only day counts toward your streak and week strip (#115, found and fixed by @benniemosher), for anyone with cardio turned on. A run with no lifting that day used to look like nothing at all, and the dot now appears as soon as the session is saved.
  • A FitNotes export in kilos no longer comes in as pounds. The unit is now read per row, so a file mixing the two imports both correctly. Reported on r/selfhosted.
  • A FitNotes export from a phone not set to English imports its workouts. Day-first dates were skipped, turning a whole history into an empty import. Both orders are read now, decided across the file.
  • The language picker shows the language the app is actually in, rather than claiming English on a phone set to something else. Reported on r/selfhosted.
  • The Load Type chooser opens next to the exercise you tapped (#116, reported by @kgenerozov). Far down a long workout it could open thousands of pixels off screen. The Diary and the editor now share one chooser, so the Diary’s options are translated too.
  • A Load Type or Tracked By choice made in the workout editor survives saving. The chip changed and the save sent the old value.
  • Filming a set in the app works again. The recording’s content type carries an unquoted comma, which the server’s parser could not read, so the upload was refused as “Videos only”. Picking an existing clip was never affected. Found by @backmind while testing #57.
  • A coach sees every set you filmed on an exercise, not just one. Each clip has its own button now, named for the set. Found by @backmind.
  • The set count sits at the right of an exercise again in Coaching, on exercises with no clip. Found by @backmind.
  • “Replied just now” no longer says hours ago. Server times are UTC and were read as local. Found by @backmind.
  • A clip picked from the phone records how long it runs, the same as one filmed in the app. Found by @backmind.
  • The play marker on an exercise card is a small chip again, rather than a bar across the card. Found by @backmind.

Security

  • No security fixes this cycle. npm audit reports 0 vulnerabilities for the app and the server, and there are no open Dependabot alerts.

Two APKs. lifttrace-v1.4.0-dev02.apk is the phone app and lifttrace-wear-v1.4.0-dev02.apk is the watch app. Both are signed with the same key, which the pairing depends on.

Testers: filming a set in the app is the one to try, since it failed outright in dev01. On Android, an OpenAI-compatible provider whose address ends in /api (OpenRouter, for one) should now connect. If you import from FitNotes on a phone not set to English, that’s worth another go too.

LiftTrace is free and always will be. The iOS fund goes toward a Mac and an iPhone, so the Trace apps can run properly on iPhone.