LiftTrace logo

LiftTrace

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

Alternative to: strong, hevy

LiftTrace screenshot

LiftTrace is a self-hosted weightlifting tracker that runs entirely in a single Docker container, with a PWA for the browser and a native Android app for your phone. It offers workout diary and set logging, multi-week training programs and templates, an exercise library sourced from multiple providers, progress charts and PR tracking, trainer/athlete coaching accounts, and an AI coach backed by Claude, OpenAI, or Gemini. All data stays in a local SQLite file and uploads folder, with no accounts, telemetry, or subscriptions.

LiftTrace Docker Compose example

Self-host LiftTrace on your own server, homelab, or VPS starting from this Docker Compose example. It runs LiftTrace in Docker containers using the official ghcr.io/traceapps/lifttrace:latest image, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  lifttrace:
    image: ghcr.io/traceapps/lifttrace:latest
    volumes:
      - db:/data/db
      - uploads:/data/uploads
    restart: unless-stopped
    environment:
      # Path to the SQLite database file (lives in the db volume). Keep in sync with the db volume mount.
      DB_PATH: "/data/db/lifttrace.db"
      # Directory for uploaded exercise media and backup ZIPs (lives in the uploads volume). Keep in sync with the uploads volume mount.
      UPLOADS_PATH: "/data/uploads"
      # Secret used to sign session JWTs; the server refuses to start in production with the dev default. Generate with: openssl rand -base64 48
      JWT_SECRET: "changeme"
      # Logging verbosity: error, warn, info, or debug.
      LOG_LEVEL: "info"
      # Mount the app under a URL subpath (must start with "/", no trailing slash), e.g. "/lifttrace". Leave empty to serve at the root.
      BASE_URL: ""
      # Set to "1" only when serving over plain HTTP on a trusted LAN; leave empty when behind an HTTPS reverse proxy.
      INSECURE_COOKIES: ""
      # AI coach (Trace): set to "true" to auto-enable the AI coach for all users.
      AI_ENABLED: ""
      # AI coach provider: claude, openai, gemini, or oai-compat.
      AI_PROVIDER: ""
      # AI coach: API key for the selected cloud provider.
      AI_API_KEY: ""
      # AI coach: override the provider's default model.
      AI_MODEL: ""
      # AI coach: base URL for a local or OpenAI-compatible provider.
      AI_BASE_URL: ""
      # Comma-separated exercise catalogs to auto-seed on first boot: wger, free-db, exercisedb, exercisedb-oss.
      EXERCISE_SOURCES: ""
      # SMTP host for outgoing email (password resets, invites); leave empty to disable email.
      SMTP_HOST: ""
      # SMTP server port.
      SMTP_PORT: "587"
      # Use an implicit TLS connection for SMTP (true) instead of STARTTLS (false).
      SMTP_SECURE: "false"
      # SMTP username.
      SMTP_USER: ""
      # SMTP password.
      SMTP_PASS: ""
      # From address for outgoing email, e.g. "LiftTrace <noreply@example.com>".
      SMTP_FROM: ""

volumes:
  db:
  uploads:

Values set to changeme are required — replace them with your own values before starting LiftTrace.

Prefer a managed setup? WinterFlow installs, configures, and updates LiftTrace for you using this same Docker Compose configuration.