Bracket logo

Bracket

Selfhosted tournament system

Alternative to: challonge, toornament

Bracket screenshotBracket screenshot

Bracket is a self-hosted tournament management system supporting single elimination, round-robin, and Swiss formats. Organizers can build multi-stage tournament structures with multiple groups and brackets, schedule matches by court and time with drag-and-drop, manage teams and players, and share customizable public dashboards.

Bracket Docker Compose example

Self-host Bracket on your own server, homelab, or VPS starting from this Docker Compose example. It runs Bracket in Docker containers using the official ghcr.io/evroon/bracket:latest, postgres:16 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:
  bracket:
    image: ghcr.io/evroon/bracket:latest
    depends_on:
      - postgres
    restart: unless-stopped
    environment:
      # Run mode. Use PRODUCTION for self-hosted deployments.
      ENVIRONMENT: "PRODUCTION"
      # Secret used to sign authentication (JWT) tokens. Replace with a long random string.
      JWT_SECRET: "changeme"
      # Serve the bundled frontend from this container.
      SERVE_FRONTEND: "true"
      # Path prefix under which the API is served.
      API_PREFIX: "/api"
      # Public base URL where users reach Bracket.
      BASE_URL: "http://localhost:8400"
      # Comma-separated list of allowed CORS origins. Use * to allow any origin.
      CORS_ORIGINS: "*"
      # PostgreSQL connection string.
      PG_DSN: "postgresql://bracket:bracket@postgres:5432/bracket"
    volumes:
      - static_data:/app/static

  postgres:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_DB: "bracket"
      POSTGRES_USER: "bracket"
      POSTGRES_PASSWORD: "bracket"
    volumes:
      - pg_data:/var/lib/postgresql/data

volumes:
  pg_data:
  static_data:

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

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