Ein vollständiges Turnierverwaltungssystem mit Event-basiertem Meisterschafts-Punktesystem, entwickelt mit brackets-manager.
- Single Elimination - K.O.-System
- Double Elimination - Doppel-K.O. mit Winner & Loser Bracket
- Optional: Grand Final (Simple oder Double)
- Automatische BYE-Generierung für Power-of-2
- Round-Robin - Jeder gegen Jeden
- Multi-Turnier Events - Mehrere Turniere pro Event
- Zufällige Paarungen - Fisher-Yates Shuffle beim Turnier-Start
- Event-Filter - Turniere nach Events filtern
- Gesamt-Rankings - Event-übergreifende Ranglisten
- Platzierungsbasierte Punkte:
- Platz 1: 30 Punkte
- Platz 2: 22 Punkte
- Platz 3: 16 Punkte
- Platz 4: 12 Punkte
- Platz 5: 9 Punkte
- Platz 6: 7 Punkte
- Platz 7: 5 Punkte
- Platz 8: 3 Punkte
- Platz 9-12: 2 Punkte
- Platz 13-16: 1 Punkt
- Platz 17+: 1 Punkt
- Korrekte Double Elimination Platzierung - Basierend auf erreichten Runden, nicht nur Wins/Losses
- Event-Meisterschaft - Gesamtpunkte über alle Turniere eines Events
- Einzelturnier-Rankings - Detaillierte Statistiken pro Turnier
- Interactive Brackets mit brackets-viewer.js
- Dark Theme - Vollständig angepasstes Farbschema
- Click-to-Win - Gewinner direkt im Bracket auswählen
- Smart Validierung - Unterscheidung zwischen BYE und TBD Matches
- Scroll-Preservation - Position bleibt bei Updates erhalten
- Auto-IDs - Automatische Turnier-ID-Vergabe
- Teilnehmer bearbeiten - Mit automatischer Bracket-Regeneration
- Bracket zurücksetzen - Mit neuer zufälliger Auslosung
- Match-Filter - Nur offene Matches, TBD ausblenden
- Collapsible Sections - Aufgeräumte Benutzeroberfläche
npm installMit vorgebautem Image von GitHub Container Registry:
docker pull ghcr.io/lordimac/mcd.brackets:latest
docker run -d -p 3000:3000 -v $(pwd)/data:/app/data ghcr.io/lordimac/mcd.brackets:latestMit Docker Compose:
# Bearbeite docker-compose.yml und kommentiere die image-Zeile ein
docker-compose up -dLokales Build:
docker build -t mcd-brackets .
docker run -d -p 3000:3000 -v $(pwd)/data:/app/data mcd-bracketsnpm run serverÖffne http://localhost:3000 im Browser.
npm run server:watch- Event auswählen oder neues erstellen
- Turnier-Name eingeben
- Typ wählen (Single/Double Elimination)
- Teilnehmer eingeben (einer pro Zeile)
- Optional: Grand Final Type für Double Elimination
Features:
- ✅ Automatische BYE-Generierung für Power-of-2
- ✅ Zufällige Paarungen (Fisher-Yates Shuffle)
- ✅ Auto-generierte Turnier-IDs
- Gewinner auswählen: Klick auf Match → Wähle Gewinner
- Smart Validierung:
- 🚫 BYE-Matches: "Dieses Match hat einen BYE und wird automatisch entschieden"
- ⏳ TBD-Matches: "Dieses Match ist noch nicht spielbar. Warte auf die vorherigen Matches"
- Einzelturnier: Rangliste für ein spezifisches Turnier
- Event-Gesamt: Kombinierte Rangliste über alle Turniere eines Events
- Top-3 Highlighting: Gold/Silber/Bronze Hintergrund und Medaillen
- Filter: Nach Stage/Event filtern
- Nur offene Matches: Zeige nur spielbare Matches
- TBD ausblenden: Verstecke noch nicht bestimmte Paarungen
GET /api/stages- Alle Stages abrufenPOST /api/stages- Neue Stage erstellen (mit Event-Namen)DELETE /api/stages/:id- Stage löschen (inkl. Teilnehmer-Cleanup)
GET /api/matches- Alle Matches abrufenPUT /api/matches/:id- Match-Ergebnis aktualisieren
GET /api/participants- Alle Teilnehmer abrufenDELETE /api/participants/:id- Teilnehmer löschen
GET /api/viewer-data/:stageId- Komplette Turnierdaten für Bracket-Viewer- Enthält: stage, matches, participants (gefiltert nach tournament_id)
GET /api/standings/:stageId- Korrekte Platzierungen basierend auf Bracket-Struktur- Berücksichtigt Double Elimination korrekt
- Sortiert nach erreichter Runde und Ergebnis
curl -X POST http://localhost:3000/api/stages \
-H "Content-Type: application/json" \
-d '{
"tournamentId": 1,
"name": "Woche 1",
"type": "double_elimination",
"seeding": ["Player1", "Player2", "Player3", "Player4", "Player5"],
"settings": { "grandFinal": "simple" },
"eventName": "Herbst Liga 2025"
}'- Node.js 18+
- Express 5.1.0
- TypeScript 5.3.2
- ts-node für Development
- nodemon für Auto-Reload
- Vanilla JavaScript - Keine Frameworks
- HTML5 & CSS3
- brackets-viewer.js für Visualisierung
- brackets-manager 1.8.1
- brackets-json-db 1.0.2
- Dark Theme (#0f172a Background)
- Custom CSS (1089 Zeilen)
- Responsive Design
- Collapsible Sections
Die Daten werden in db.json gespeichert mit folgenden Tabellen:
- participant:
{id, tournament_id, name} - stage:
{id, tournament_id, name, type, event_name, settings} - match:
{id, stage_id, round_id, group_id, opponent1, opponent2} - group: Bracket-Gruppen (Winner/Loser/Finals)
- round: Runden innerhalb der Gruppen
Die Platzierung wird nicht nur durch Wins/Losses bestimmt, sondern durch:
- Erreichte Gruppe (Finals > Loser Bracket > Winner Bracket erste Runde)
- Gewonnen/Verloren in der letzten Runde
- Gesamte Wins als Tiebreaker
- Gesamte Losses (weniger = besser) als finaler Tiebreaker
Beispiel:
- Grand Final Gewinner (kam aus LB mit 2 Losses) = Platz 1 ✅
- Grand Final Verlierer (kam aus WB mit 1 Loss) = Platz 2
- LB Final Verlierer = Platz 3
Einfache Sortierung nach Wins → Losses.
mcd.brackets/
├── src/
│ └── server.ts # Express Server mit REST API
├── public/
│ ├── index.html # Webinterface (243 Zeilen)
│ ├── app.js # Frontend-Logik (1162 Zeilen)
│ └── styles.css # Dark Theme Styling (1089 Zeilen)
├── db.json # Turnierdaten (JSON-Datenbank)
├── package.json
└── README.md
- TypeScript für Backend
- ES6+ für Frontend
- Kein Framework - Pure Vanilla JS
- Modularer Aufbau mit klaren Funktionen
Turniere:
createTournament()- Turnier mit Random Seeding erstellenresetBracket()- Bracket neu ausloseneditParticipants()- Teilnehmer bearbeiten + regenerierendeleteStage()- Turnier inkl. Participants löschen
Visualisierung:
viewBracket()- Bracket anzeigen mit Scroll-PreservationshowQuickWinnerSelection()- Gewinner-Modal mit Validierung
Rankings:
viewRankings()- Einzelturnier-RanglisteviewEventRankings()- Event-Gesamt-Rangliste mit Punkten
Events:
displayEvents()- Events-ÜbersichtupdateEventDropdown()- Event-Auswahl aktualisieren
Platzierungsberechnung:
calculatePlacements()- Korrekte Platzierung für DE/SE- Trackt letzte gespielte Runde und Ergebnis
- Berücksichtigt Bracket-Struktur (Groups/Rounds)
ISC