Bracket

Bracket

WHAT IS IT?

Bracket is a self-hosted tournament system. You create a club, a tournament inside it, declare the teams and their players, then build the structure: several stages, each holding one or more groups or brackets. The backend is async Python with FastAPI, the frontend is Vite and Mantine, and PostgreSQL sits behind both.

WHY IS IT INTERESTING?

  • Three formats covered: single elimination, round-robin and swiss. Swiss is handled dynamically, with the following matches scheduled automatically as results come in.
  • Stage-based structure: a tournament chains several stages, and each stage carries its own groups or brackets. A group phase followed by a final bracket maps directly, with no workarounds.
  • Drag-and-drop scheduling: a match moves to another court or shifts to a different start time without going through a form.
  • Public pages: several dashboard views are meant to be projected or shared with participants, with a logo of your choice.
  • Multi-club: several clubs share one instance, each with as many tournaments as it needs, teams and their players declared per tournament.
  • One command to start: docker compose up -d brings up the backend, the frontend and PostgreSQL, with test credentials given in the README. A create-dev-db call then fills the database with demo data.

USE CASES

  • Run a club tournament over a weekend, with several courts to rotate through.
  • Chain a group phase and a knockout bracket inside the same tournament.
  • Put live results on a screen at the entrance of the venue.
  • Run a swiss tournament without recomputing the pairings by hand.
  • Host the tournaments of several clubs on a single instance.

Interface language is detected from browser settings, and there is no manual switcher yet; translations go through Crowdin. A public demo runs at bracketapp.nl/demo, with data wiped after thirty minutes.