v1.1.0
First minor release. User-facing polish: cardio session logging, library-level exercise load-type, in-app self-updater, full internationalization foundation, sync UX overhaul.
⚠ Upgrade requires re-signing in (Android)
The Android app-identifier change (app.lifttrace.local, see the CHANGELOG "Changed" section) orphans the WebView's cached auth cookie. Server-connected Android users will need to re-enter their server URL and sign back in once after upgrading. Standalone Android users lose theme / accent / display prefs but keep all workout, program, and exercise data (that lives in local SQLite, unaffected). PWA and browser users are not affected.
Added
- Cardio session logging (#23). Opt-in via Settings → Workout → Track Cardio (off by default so pure lifters aren't cluttered). Log a session with activity, duration, optional distance / avg HR / notes; a new Cardio metric on Statistics tracks weekly minutes with an optional target line. All cardio is excluded from volume, PRs, and rest-timer firing so it never corrupts the lifting side. Manual entry only by design; device sync (Fitbit / Garmin / Health Connect) lives in NutriTrace via federation and is not planned for LiftTrace.
- Pin cardio sessions as quick-log templates. Tap the pin on any cardio session to save it as a one-tap template; pinned templates render as chips at the top of the Cardio card so the next "same-as-yesterday" run / bike / row is a single tap instead of re-filling the form. Templates carry activity, duration, distance, HR, and notes forward. Matches NutriTrace's Activities quick-log flow.
- Library-level
load_typeon exercises (#24). New Load type field in the Exercise Editor (Unset / Bilateral / Per side / Alternating) so the setting travels with the exercise instead of being buried per-workout-instance. Batch-imported catalogs (Strong / Hevy / FitNotes / Jefit CSV) can now be fixed up per-exercise once instead of having to re-select per session. Statistics, muscle-group volume, per-exercise progress, share cards, and CSV export all resolve through a new four-tier chain: per-instance override → library value → per-user Diary preference → 'bilateral'. Historical volume numbers for imported unilateral / alternating exercises will change on first render; that's the fix. - In-app updates. New Settings → Updates panel checks GitHub Releases for a newer version and, on Android, downloads the signed APK and hands off to the system installer via FileProvider. One primary button drives the whole flow (Check Now → Download & Install → Downloading X%). Skip This Version link when an update's available. Collapsible "What's new" panel renders the release notes inline. Silent shade notification when the OS notification permission is granted; top-of-app banner as fallback. Opt-in Stable or Dev channels.
- Pull-to-refresh sync (Android). In native server mode, swipe down from the top of any page to trigger a manual sync. Matches NutriTrace's behavior for family consistency.
- Smart connection banner. When sync fails, the banner explains what actually went wrong (no network vs cellular-only vs server unreachable vs HTTP error) with a Retry button, instead of a generic "sync error". Structured classification via
describeConnectionIssuemirrors NT. - Cloud icon in hamburger menu goes red on server disconnect. Previously never lit up; now driven by a real reachability probe + browser online/offline events + server-side classifier, matching NT's behavior.
- Optional email on the "Create Admin Account" form. Shows up only when SMTP is configured via environment variables. Stored on the admin's user record for password-reset and invite emails later.
- Accent-tinted browser chrome. The browser tab bar / address strip picks up your current accent color via
<meta name="theme-color">. Favicon stays the branded LiftTrace mark.
Changed
- Full i18n retrofit across the app. Every hardcoded UI string extracted into
src/i18n/en.jsonand read viasvelte-i18n. Covers Settings (all sections), Diary + WorkoutEditor + WorkoutSummary + SupersetCard + ExerciseCard + SmartLog, Coaching + Programs + ProgramDetail + TemplateSpecRow, Exercises + ExerciseDetail + ExerciseEditor + ExerciseInfo, Statistics charts + MuscleRecovery, Radio (station library + dialogs), Profile, Login, NativeSetup, Trace AI, and shared UI (TimePicker). ~500 new keys, Weblate-ready. Chicago-style title case for labels/buttons/headings, sentence case for body prose / errors / placeholders / toasts. - Bitwarden / password managers now show a real app identifier instead of "localhost" (Android). LiftTrace identifies itself as
app.lifttrace.local, which reads clearly in autofill dialogs and in your saved-credentials list. - SMTP "Username" field relabeled to "Email or Username". Most SMTP providers want the full email as the username; label change removes the guesswork.
Fixed
- Server-connection banner no longer covers the phone's notification bar. The red "server unreachable" banner used to sit edge-to-edge at viewport top:0, which on Android meant it slid up over the status bar / clock / hamburger. Now floats as a rounded card below the status bar and the app's compact header, matching NutriTrace.
- Exercise picker sheet on Statistics rendered off-screen for some browsers (#25). The Statistics → Exercise Progress picker had its own inline bottom-sheet CSS that had drifted from the shared Sheet component the rest of the app uses; on Vivaldi's persistent-web-app mode the divergent viewport-height + safe-area math pushed the sheet body below the visible area. Consolidated onto the shared Sheet.
- App icon no longer shows a white halo. Icon PNGs had ~15px of solid white padding baked into their corners. Corners now clear cleanly. Icon URLs cache-busted with the app version so shipped icon fixes take effect without users needing to clear their browser cache.
- Create Admin form layout aligned with NT/CT (parity with NT #122). Two-column layout replaces the prior stacked single-column layout.
Security
adm-zipbumped to 0.6.0 (GHSA-xcpc-8h2w-3j85).brace-expansionbumped to 5.0.7 (CVE-2026-13149, high).body-parserbumped (CVE-2026-12590).fast-uribumped (transitive CVE fix).
services:
lifttrace:
image: ghcr.io/traceapps/lifttrace:1.1.0
# …