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.