$$\ $$\ $$\
$$ | \__| $$ |
$$$$$$\ $$$$$$\ $$$$$$\$$$$\ $$$$$$$\ $$\ $$$$$$\
$$ __$$\ \____$$\ $$ _$$ _$$\ $$ __$$\ $$ |\_$$ _|
$$ / $$ | $$$$$$$ |$$ / $$ / $$ |$$ | $$ |$$ | $$ |
$$ | $$ |$$ __$$ |$$ | $$ | $$ |$$ | $$ |$$ | $$ |$$\
\$$$$$$$ |\$$$$$$$ |$$ | $$ | $$ |$$$$$$$ |$$ | \$$$$ |
\____$$ | \_______|\__| \__| \__|\_______/ \__| \____/
$$\ $$ |
\$$$$$$ |
\______/
$$\ $$\
\__| \__|
$$$$$$\ $$$$$$\ $$\ $$$$$$\ $$\ $$$$$$$\ $$$$$$\
$$ __$$\ \____$$\ $$ |$$ __$$\ $$ |$$ __$$\ $$ __$$\
$$ / $$ | $$$$$$$ |$$ |$$ | \__|$$ |$$ | $$ |$$ / $$ |
$$ | $$ |$$ __$$ |$$ |$$ | $$ |$$ | $$ |$$ | $$ |
$$$$$$$ |\$$$$$$$ |$$ |$$ | $$ |$$ | $$ |\$$$$$$$ |
$$ ____/ \_______|\__|\__| \__|\__| \__| \____$$ |
$$ | $$\ $$ |
$$ | \$$$$$$ |
\__| \______/
___ __
/ _ \ / /_
| | | | '_ \
| |_| | (_) |
\___(_)___/
Important: Gambit Pairing is in alpha development. Features and stability are not guaranteed.
Gambit Pairing is a desktop application for managing Swiss-system chess tournaments. It provides a modern graphical user interface (GUI) built with PyQt6, supporting USCF-style pairings, tiebreaks, and tournament management.
-
Modern User Interface
- Polished, high-contrast, accessible UI with custom style-sheets.
- Tabbed interface: Players, Tournament Control, Standings, Cross-Table, History Log.
- Tooltips, context menus, and responsive layouts.
- Print preview dialogs for pairings and standings.
-
Player Management
- Add, edit, withdraw/reactivate, and remove players.
- Manage detailed player info: name, rating, gender, date of birth, phone, email, club, federation.
- Import/export player lists/details from/to CSV or text files.
-
Tournament Setup
- Configure number of rounds and tiebreak order (Median, Solkoff, Cumulative, etc.).
- Save/load tournaments to/from disk (
.json
files, JSON format). - Full tiebreaker configuration with drag-and-drop order in settings.
-
Swiss Pairings
- Automated pairings for each round, avoiding rematches and balancing colours.
- Manual adjustment of pairings before results are entered (with dialog).
- Bye assignment according to USCF rules, including handling of inactive/withdrawn players.
-
Results Entry
- Enter round results via an interactive table with quick result buttons.
- Auto-set results for inactive players.
- Undo last round's results.
-
Standings & Tiebreaks
- Standings table with configurable tiebreak columns.
- Cross-table view showing all results.
- Tiebreaker legend in printouts.
- Support for Median, Solkoff, Cumulative, Sonnenborn-Berger, Most Blacks, and more.
-
Print & Export
- Print pairings, standings, or player lists directly from the application.
- Print preview and printer selection supported.
- Export standings and player lists to CSV or text.
-
History & Logging
- Detailed history log of actions, pairings, and results.
- Exportable log.
- Logging to file and console for debugging.
-
Update Checker
- Built-in update checker for packaged releases.
- Modern dialogs for update prompts and progress.
- Automatic and manual update checks.
- Program Structure
- Installation Guide
- Before you commit
- Developer Hacking Guide
- Manual Pairing Guide
- GitHub Actions Build System
Pre-built executables and installers are automatically created for each release:
- Windows MSI Installer - Full installation with Start Menu shortcuts
- Windows Portable - Single-file executable, run directly
- Windows Directory - Faster startup, extract and run
- Linux - Executable for Linux x64 systems
- macOS - App bundle for macOS x64 systems
Visit the Releases page to download the latest version.
To install with pip, there is a helper sh script, ensure-all-dependancies.sh
it will parse the pyproject.toml and install all the runtime and development dependancies.
- Install the application:
- see: installing.md
-
Create or Load a Tournament:
- Use "File > New Tournament..." or "File > Load Tournament..." to start.
- Configure rounds and tiebreaks in "Settings".
-
Add Players:
- Enter player details (name, rating, gender, etc.) and click "Add New Player...".
- Import players from CSV via "File > Import Players from CSV...".
- Edit, withdraw/reactivate, or remove players via right-click context menu.
-
Start Tournament:
- Click "Start Tournament" when ready.
- No further player additions/removals after starting.
-
Pairings and Results:
- Prepare next round and enter results in the pairings table.
- Use quick result buttons or select from the dropdown.
- Manually adjust pairings if needed (right-click pairing row).
- Undo last round's results if necessary.
-
Standings & Cross-Table:
- View current standings and tiebreaks in the Standings tab.
- View all results in the Cross-Table tab.
-
Print:
- Print pairings, standings, or player lists via the "File > Print..." menu.
- Use print preview and select your printer before printing.
-
Export & Save:
- Export standings or player lists via the File menu.
- Save or load tournaments at any time.
-
History:
- Review all actions and results in the History Log tab.
-
Check for Updates:
- Use "Help > Check for Updates..." to check for new versions (packaged releases only).
- The pairing algorithm follows USCF-style Swiss rules, including color balancing and bye assignment.
- Tiebreak order is fully configurable and reflected in the standings and printouts.
- Manual pairing adjustments are logged and cannot be undone automatically.
- Tournament data is saved in
.json
files (JSON format). - This is still an alpha; please report bugs or suggestions via Discord or make an issue on Github
This project is open source and available under the GPL-3.0-or-later
Below are some example screenshots of Gambit Pairing in action.
↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑ ↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑ ↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑ ↑↑↑ ↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑ ↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑ ↑↑ ↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑