Self-hosted weightlifting tracker — single Docker container, AGPL-3.0, no telemetry, no cloud sync.
Svelte
57
32 commits
updated Sep 20, 2026
Track Every Rep, Set, and PR
A self-hosted weightlifting tracker.
No accounts, no telemetry, no cloud sync unless you opt in.
iOS fund: the Trace apps have no iOS app yet, because building one needs a Mac and an iPhone. Chip in on Ko-fi. Self-hosting stays free either way.
Jump to: What it is · Features · Install · Env vars · Docs
LiftTrace runs entirely in a single Docker container on your own hardware, with a PWA for the browser and a native Android app for your phone. No accounts on external services, no data leaving your network, no subscriptions. Log workouts, run programs, browse a multi-source exercise library, and ask an AI coach for form checks, all against your own SQLite file.
cp, restore with cp, migrate to a new server by moving the volume.
Published to two registries with identical tag sets: ghcr.io/traceapps/lifttrace (primary) and traceapps/lifttrace on Docker Hub (mirror). The snippet below uses GHCR; swap in traceapps/lifttrace:latest if that suits your setup.
services:
lifttrace:
image: ghcr.io/traceapps/lifttrace:latest
container_name: lifttrace
ports:
- "3002:3002"
volumes:
- ./data/db:/data/db
- ./data/uploads:/data/uploads
environment:
- DB_PATH=/data/db/lifttrace.db
- UPLOADS_PATH=/data/uploads
- JWT_SECRET=change-me-to-a-long-random-string
restart: unless-stopped
docker compose up -d
Open http://localhost:3002 and you're lifting.
See DEPLOY.md for image tag conventions, reverse proxies, subpath mounting, Cloudflare Tunnel, Docker secrets, and the four Android HTTPS paths.
Pre-release testers can grab the rolling dev-latest APK; occasional milestone builds also get numbered -devNN pre-releases. See DEPLOY.md for details.
The essentials. Full reference in DEPLOY.md, .env.example, and the env vars docs page.
| Variable | Default | Purpose |
|---|---|---|
DB_PATH | ./lifttrace.db | SQLite database file path |
UPLOADS_PATH | ./uploads | Uploaded exercise media directory |
JWT_SECRET | (required in prod) | JWT signing secret; server refuses to start in prod with the dev default |
TOKEN_ENC_KEY | derived from JWT_SECRET | At-rest encryption key for OIDC client secrets |
PORT | 3002 | Server port inside the container (3003 before 1.3.0) |
LOG_LEVEL | info | error | warn | info | debug |
EXERCISE_SOURCES | wger,free-db | Sources to auto-seed on first boot (wger, free-db, exercisedb, exercisedb-oss) |
EXERCISEDB_OSS_URL | (upstream) | Point the OSS exercise source at your own mirror |
INSECURE_COOKIES | 0 | Set 1 only for non-HTTPS deployments |
BASE_URL | (none) | Mount at a subpath (e.g. /lifttrace) instead of root |
RECOVERY_TOKEN | (none) | Token for the "Disable user management" recovery endpoint |
SMTP_* | (none) | SMTP for password reset emails and user invites |
AI_* | (none) | Server-side AI proxy; AI_PROVIDER accepts claude | openai | gemini | oai-compat |
OIDC_* / OIDC_PROVIDER_N_* | (none) | OIDC SSO declared in env instead of the UI |
OIDC_ENABLE_EMAIL_PASSWORD_LOGIN | (none) | Set to 0 to disable password login server-wide (SSO-only) |
All data lives in two bind-mounted directories: /data/db/lifttrace.db (SQLite) and /data/uploads/ (exercise media and backup ZIPs). Back up both with cp -r, restore by stopping the container and putting them back. Update with docker compose pull && docker compose up -d; volumes persist across updates.
Part of the TraceApps family. Sister apps: CookTrace for recipes and pantry, NutriTrace for nutrition tracking. Full docs for all three at traceapps.github.io/docs.
LiftTrace is free to self-host and always will be. No paid tier, nothing behind a donation, no telemetry. It's built and maintained by one person.
The current goal is iOS. None of the Trace apps run properly on an iPhone, because building and testing for iOS needs Apple hardware, plus the developer accounts for both app stores. That comes to about $1,300, and the itemised breakdown is on the Support page.
Helping doesn't have to cost anything: starring the repo, reporting bugs with detail, and translating all count, and stars are how self-hosted projects get found.
LiftTrace is not medical, health, or fitness-professional software. Exercise library content, Trace AI coaching, program templates, rest-timer guidance, and any analytical output are for informational and self-tracking purposes only. Resistance training carries inherent injury risk; consult a qualified healthcare professional or certified coach before starting a new program, returning from injury, or making significant changes. Trace AI answers can be incorrect; treat them as a starting point, not a substitute for professional advice. Use at your own risk.
32 commits
Svelte
50.8%
JavaScript
46.1%
Java
1.9%
Self-hosted weightlifting tracker — single Docker container, AGPL-3.0, no telemetry, no cloud sync.
Svelte
57
32 commits
updated Sep 20, 2026
Track Every Rep, Set, and PR
A self-hosted weightlifting tracker.
No accounts, no telemetry, no cloud sync unless you opt in.
iOS fund: the Trace apps have no iOS app yet, because building one needs a Mac and an iPhone. Chip in on Ko-fi. Self-hosting stays free either way.
Jump to: What it is · Features · Install · Env vars · Docs
LiftTrace runs entirely in a single Docker container on your own hardware, with a PWA for the browser and a native Android app for your phone. No accounts on external services, no data leaving your network, no subscriptions. Log workouts, run programs, browse a multi-source exercise library, and ask an AI coach for form checks, all against your own SQLite file.
cp, restore with cp, migrate to a new server by moving the volume.
Published to two registries with identical tag sets: ghcr.io/traceapps/lifttrace (primary) and traceapps/lifttrace on Docker Hub (mirror). The snippet below uses GHCR; swap in traceapps/lifttrace:latest if that suits your setup.
services:
lifttrace:
image: ghcr.io/traceapps/lifttrace:latest
container_name: lifttrace
ports:
- "3002:3002"
volumes:
- ./data/db:/data/db
- ./data/uploads:/data/uploads
environment:
- DB_PATH=/data/db/lifttrace.db
- UPLOADS_PATH=/data/uploads
- JWT_SECRET=change-me-to-a-long-random-string
restart: unless-stopped
docker compose up -d
Open http://localhost:3002 and you're lifting.
See DEPLOY.md for image tag conventions, reverse proxies, subpath mounting, Cloudflare Tunnel, Docker secrets, and the four Android HTTPS paths.
Pre-release testers can grab the rolling dev-latest APK; occasional milestone builds also get numbered -devNN pre-releases. See DEPLOY.md for details.
The essentials. Full reference in DEPLOY.md, .env.example, and the env vars docs page.
| Variable | Default | Purpose |
|---|---|---|
DB_PATH | ./lifttrace.db | SQLite database file path |
UPLOADS_PATH | ./uploads | Uploaded exercise media directory |
JWT_SECRET | (required in prod) | JWT signing secret; server refuses to start in prod with the dev default |
TOKEN_ENC_KEY | derived from JWT_SECRET | At-rest encryption key for OIDC client secrets |
PORT | 3002 | Server port inside the container (3003 before 1.3.0) |
LOG_LEVEL | info | error | warn | info | debug |
EXERCISE_SOURCES | wger,free-db | Sources to auto-seed on first boot (wger, free-db, exercisedb, exercisedb-oss) |
EXERCISEDB_OSS_URL | (upstream) | Point the OSS exercise source at your own mirror |
INSECURE_COOKIES | 0 | Set 1 only for non-HTTPS deployments |
BASE_URL | (none) | Mount at a subpath (e.g. /lifttrace) instead of root |
RECOVERY_TOKEN | (none) | Token for the "Disable user management" recovery endpoint |
SMTP_* | (none) | SMTP for password reset emails and user invites |
AI_* | (none) | Server-side AI proxy; AI_PROVIDER accepts claude | openai | gemini | oai-compat |
OIDC_* / OIDC_PROVIDER_N_* | (none) | OIDC SSO declared in env instead of the UI |
OIDC_ENABLE_EMAIL_PASSWORD_LOGIN | (none) | Set to 0 to disable password login server-wide (SSO-only) |
All data lives in two bind-mounted directories: /data/db/lifttrace.db (SQLite) and /data/uploads/ (exercise media and backup ZIPs). Back up both with cp -r, restore by stopping the container and putting them back. Update with docker compose pull && docker compose up -d; volumes persist across updates.
Part of the TraceApps family. Sister apps: CookTrace for recipes and pantry, NutriTrace for nutrition tracking. Full docs for all three at traceapps.github.io/docs.
LiftTrace is free to self-host and always will be. No paid tier, nothing behind a donation, no telemetry. It's built and maintained by one person.
The current goal is iOS. None of the Trace apps run properly on an iPhone, because building and testing for iOS needs Apple hardware, plus the developer accounts for both app stores. That comes to about $1,300, and the itemised breakdown is on the Support page.
Helping doesn't have to cost anything: starring the repo, reporting bugs with detail, and translating all count, and stars are how self-hosted projects get found.
LiftTrace is not medical, health, or fitness-professional software. Exercise library content, Trace AI coaching, program templates, rest-timer guidance, and any analytical output are for informational and self-tracking purposes only. Resistance training carries inherent injury risk; consult a qualified healthcare professional or certified coach before starting a new program, returning from injury, or making significant changes. Trace AI answers can be incorrect; treat them as a starting point, not a substitute for professional advice. Use at your own risk.
32 commits
Svelte
50.8%
JavaScript
46.1%
Java
1.9%