Warracker logo

Warracker

Open-source warranty tracker to monitor expirations and store receipts

Alternative to: sortly


Warracker helps individuals and teams organize product warranties in one place, tracking purchase dates, durations, serial numbers, and vendor details. It sends proactive expiration alerts by email or 100+ push services such as Discord and Slack through Apprise, and manages warranty claims end-to-end with statuses and resolutions. Receipts, invoices, and manuals can be attached to each warranty, with optional storage in Paperless-ngx.

Warracker Docker Compose example

Self-host Warracker on your own server, homelab, or VPS starting from this Docker Compose example. It runs Warracker in Docker containers using the official ghcr.io/sassanix/warracker/main:latest, postgres:15-alpine images, 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:
  warracker:
    image: ghcr.io/sassanix/warracker/main:latest
    depends_on:
      warrackerdb:
        condition: service_healthy
    volumes:
      - warracker_uploads:/data/uploads
    restart: unless-stopped
    environment:
      # Hostname of the PostgreSQL service (matches the warrackerdb service name).
      DB_HOST: "warrackerdb"
      # PostgreSQL port.
      DB_PORT: "5432"
      # Application database name.
      DB_NAME: "warranty_db"
      # Application database user.
      DB_USER: "warranty_user"
      # Application database password. Must match POSTGRES_PASSWORD on the warrackerdb service.
      DB_PASSWORD: "warranty_password"
      # Secret key used to sign Flask sessions and JWTs. Change this to a long random value.
      SECRET_KEY: "changeme"
      # Public URL where users reach Warracker (used for links and OIDC redirects).
      FRONTEND_URL: "http://localhost:8005"
      # Public base URL of the application (keep in sync with FRONTEND_URL).
      APP_BASE_URL: "http://localhost:8005"
      # Maximum upload size in megabytes.
      MAX_UPLOAD_MB: "32"
      # Nginx client_max_body_size; keep in sync with MAX_UPLOAD_MB.
      NGINX_MAX_BODY_SIZE_VALUE: "32M"
      # Memory profile: optimized, ultra-light or performance.
      WARRACKER_MEMORY_MODE: "optimized"
      # SMTP server hostname for email notifications and password resets (leave blank to disable).
      SMTP_HOST: ""
      # SMTP server port.
      SMTP_PORT: "587"
      # SMTP username.
      SMTP_USERNAME: ""
      # SMTP password.
      SMTP_PASSWORD: ""
      # Use TLS for SMTP (true/false).
      SMTP_USE_TLS: "true"
      # From address for outgoing email.
      SMTP_SENDER_EMAIL: ""
      # Enable OIDC single sign-on (true/false).
      OIDC_ENABLED: "false"
      # Display name of the OIDC provider.
      OIDC_PROVIDER_NAME: "oidc"
      # OIDC client ID.
      OIDC_CLIENT_ID: ""
      # OIDC client secret.
      OIDC_CLIENT_SECRET: ""
      # OIDC issuer URL.
      OIDC_ISSUER_URL: ""
      # OIDC scopes.
      OIDC_SCOPE: "openid email profile"
      PYTHONUNBUFFERED: "1"

  warrackerdb:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped
    environment:
      # Application database name.
      POSTGRES_DB: "warranty_db"
      # Application database user.
      POSTGRES_USER: "warranty_user"
      # Application database password. Must match DB_PASSWORD on the warracker service.
      POSTGRES_PASSWORD: "warranty_password"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
  warracker_uploads:
  postgres_data:

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

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