Sport Configurations

Dutchie's Brackets supports multiple sports out of the box, each with customized settings and terminology.

Supported Sports

SportIDVenue TermStatus
Pool/BilliardsPOOLTableActive
PickleballPICKLEBALLCourtActive
BasketballBASKETBALLCourtActive
CornholeCORNHOLEBoardActive
CustomCUSTOMVenueActive

Pool / Billiards

Overview

Pool (8-ball, 9-ball, etc.) tournaments with table-based play.

Configuration

{
  id: 'POOL',
  name: 'Pool / Billiards',
  description: 'Classic pool tournaments - 8-ball, 9-ball, straight pool',
  venueLabel: 'Table',
  defaultFormat: 'Double Elimination',
  isActive: true
}

Scoring Options

Race Format:

  • Race to 3
  • Race to 5
  • Race to 7
  • Race to 9

Game Types:

  • 8-Ball
  • 9-Ball
  • 10-Ball
  • Straight Pool
  • One Pocket

Typical Settings

{
  "scoringType": "RACE_TO_X",
  "raceCount": 5,
  "gameType": "8_BALL",
  "breakType": "ALTERNATING",
  "timeLimit": null,
  "tableCount": 3
}

Match Format Examples

Race to 5 (8-Ball):

First to win 5 games wins the match
Games are individual 8-ball racks
Loser breaks (standard) or alternating breaks

Best of 9:

Play 9 games maximum
First to 5 wins (must win by 1)

Common Tournament Structures

Bar Tournament:

  • 16-32 players
  • Double Elimination
  • Race to 3 or 4
  • 2-4 tables
  • 3-4 hours

Championship:

  • 8-16 players
  • Double Elimination
  • Race to 7-9
  • 3-5 tables
  • 6-8 hours

Pickleball

Overview

Fast-growing paddle sport with court-based play.

Configuration

{
  id: 'PICKLEBALL',
  name: 'Pickleball',
  description: 'Fast-paced pickleball tournaments',
  venueLabel: 'Court',
  defaultFormat: 'Double Elimination',
  isActive: true
}

Scoring Options

Game Formats:

  • Games to 11 (win by 2)
  • Games to 15 (win by 2)
  • Games to 21 (win by 2)

Match Formats:

  • Best of 1 game
  • Best of 3 games
  • Best of 5 games

Typical Settings

{
  "scoringType": "POINTS",
  "gamePoints": 11,
  "winByTwo": true,
  "matchFormat": "BEST_OF_3",
  "timeLimit": 60,
  "courtCount": 2
}

Match Format Examples

Best of 3 to 11:

Game 1: First to 11 (win by 2)
Game 2: First to 11 (win by 2)
Game 3: First to 11 (if needed)

Win 2 games = win match

Rally Scoring:

Both teams can score
Play to 11, win by 2
Switch sides at 6

Common Tournament Structures

Recreation League:

  • 8-12 teams
  • Round Robin
  • Games to 11
  • Best of 1
  • 2-3 courts
  • 2-3 hours

Competitive Tournament:

  • 16-32 players
  • Double Elimination
  • Games to 11
  • Best of 3
  • 4-6 courts
  • 4-6 hours

Basketball

Overview

Court-based basketball tournaments, including 3-on-3, 5-on-5.

Configuration

{
  id: 'BASKETBALL',
  name: 'Basketball',
  description: '3-on-3, 5-on-5, and tournament basketball',
  venueLabel: 'Court',
  defaultFormat: 'Single Elimination',
  isActive: true
}

Scoring Options

Game Types:

  • 3-on-3 (to 21)
  • 5-on-5 (timed quarters)
  • H-O-R-S-E
  • Around the World

Time Formats:

  • Timed (4 quarters)
  • Untimed (to X points)
  • Running clock
  • Stop clock

Typical Settings

{
  "scoringType": "POINTS",
  "winCondition": 21,
  "winByTwo": false,
  "gameType": "3_ON_3",
  "timeLimit": 20,
  "courtCount": 2
}

Match Format Examples

3-on-3 to 21:

First to 21 points wins
2-pointers = 2 points
3-pointers = 3 points
Make it take it or change possession

5-on-5 Timed:

4 quarters of 10 minutes
Highest score wins
Overtime if tied (5 min)

Common Tournament Structures

3-on-3 Street Ball:

  • 8-16 teams
  • Single Elimination
  • Games to 21
  • 2-3 courts
  • 3-4 hours

5-on-5 League:

  • 6-8 teams
  • Round Robin
  • 4x10 minute quarters
  • 1-2 courts
  • Full day

Cornhole

Overview

Bag toss game with board-based play.

Configuration

{
  id: 'CORNHOLE',
  name: 'Cornhole',
  description: 'Cornhole tournaments and leagues',
  venueLabel: 'Board',
  defaultFormat: 'Double Elimination',
  isActive: true
}

Scoring Options

Game Points:

  • Games to 21
  • Games to 15
  • Games to 11

Scoring Rules:

  • Bag on board = 1 point
  • Bag in hole = 3 points
  • Cancel scoring (subtract opponent's score)

Typical Settings

{
  "scoringType": "POINTS",
  "gamePoints": 21,
  "cancelScoring": true,
  "matchFormat": "BEST_OF_1",
  "boardCount": 4
}

Match Format Examples

Standard Game to 21:

First to 21 points wins
Cancel scoring (subtract opponent)
Must win by 1
Alternate throwing rounds

Tournament Match:

Best of 3 games
Each game to 21
Switch sides between games

Common Tournament Structures

Casual Tournament:

  • 16-32 players/teams
  • Double Elimination
  • Games to 21
  • 4-6 boards
  • 3-4 hours

Competitive League:

  • 8-12 teams
  • Round Robin + Playoffs
  • Games to 21
  • Best of 3
  • 4-6 boards
  • 4-6 hours

Custom Sport

Overview

Create your own sport configuration for any activity.

Configuration

{
  id: 'CUSTOM',
  name: 'Custom',
  description: 'Create your own sport configuration',
  venueLabel: 'Venue',
  defaultFormat: 'Double Elimination',
  isActive: true
}

Customization Options

Define:

  • Sport name
  • Venue terminology
  • Scoring system
  • Match format
  • Time limits
  • Rules

Example Custom Sports

Darts:

{
  "name": "Darts",
  "venueLabel": "Board",
  "scoringType": "COUNTDOWN",
  "startingScore": 501,
  "matchFormat": "BEST_OF_5"
}

Foosball:

{
  "name": "Foosball",
  "venueLabel": "Table",
  "scoringType": "POINTS",
  "gamePoints": 5,
  "matchFormat": "BEST_OF_3"
}

Video Game Tournament:

{
  "name": "Super Smash Bros",
  "venueLabel": "Station",
  "scoringType": "STOCK",
  "stocks": 3,
  "matchFormat": "BEST_OF_3"
}

Chess:

{
  "name": "Chess",
  "venueLabel": "Board",
  "scoringType": "WIN_LOSS",
  "timeControl": "10+0",
  "matchFormat": "SINGLE_GAME"
}

Configuration Details

Venue Labels

The venueLabel determines terminology throughout the app:

LabelPluralUsed In
TableTables"Match 1 - Table 3"
CourtCourts"Match 2 - Court 1"
BoardBoards"Match 3 - Board 2"
StationStations"Match 4 - Station 5"
VenueVenues"Match 5 - Venue 1"

Scoring Types

Available Scoring Systems:

type ScoringType =
  | 'SIMPLE_WIN_LOSS'    // Just track winner
  | 'POINTS'              // Point-based (basketball, pickleball)
  | 'GAMES_WON'           // Game count (pool, tennis)
  | 'RACE_TO_X'           // First to X wins
  | 'TIME_BASED'          // Timed matches
  | 'STOCK'               // Lives/stocks (video games)
  | 'COUNTDOWN'           // Start at X, count to 0 (darts)
  | 'CUSTOM'              // Define your own

Default Formats

Recommended by Sport:

SportRecommended FormatWhy
PoolDouble EliminationFair for skill-based game
PickleballDouble EliminationEveryone gets multiple matches
BasketballSingle EliminationMatches are longer
CornholeDouble EliminationSocial + competitive
CustomDependsBased on sport characteristics

Sport-Specific Settings

Settings Schema

Each sport can define custom settings:

interface SportSettings {
  // Scoring
  scoringType: ScoringType;
  pointsToWin?: number;
  winByTwo?: boolean;
  gameCount?: number;

  // Time
  timeLimit?: number;        // Minutes
  hasOvertimehaOVERTIME?: boolean;

  // Format
  matchFormat: 'BEST_OF_1' | 'BEST_OF_3' | 'BEST_OF_5';
  rackFormat?: string;       // Pool-specific

  // Venues
  venueCount: number;
  venueLabel: string;

  // Rules
  customRules?: string;
  tiebreaker?: string;
}

Accessing Settings

In Tournament Creation:

const sport = getSportConfig('POOL');
console.log(sport.venueLabel); // "Table"
console.log(sport.defaultFormat); // "Double Elimination"

In Match Management:

const settings = JSON.parse(tournament.settings);
console.log(settings.scoringType); // "RACE_TO_X"
console.log(settings.raceCount); // 5

Adding New Sports

For Developers

To add a new sport to Dutchie's Brackets:

  1. Create Sport Config
// src/lib/sport-configs/[sport-name].ts

export const TENNIS_CONFIG: SportConfig = {
  id: 'TENNIS',
  name: 'Tennis',
  description: 'Tennis tournaments with sets and games',
  venueLabel: 'Court',
  defaultFormat: 'Single Elimination',
  isActive: true,
  scoringOptions: {
    scoringType: 'GAMES_WON',
    setsToWin: 2,
    gamesPerSet: 6,
    tiebreakAt: 6
  }
};
  1. Add to Sport Index
// src/lib/sport-configs/index.ts

import { TENNIS_CONFIG } from './tennis';

export const MVP_SPORTS = [
  POOL_CONFIG,
  PICKLEBALL_CONFIG,
  BASKETBALL_CONFIG,
  CORNHOLE_CONFIG,
  TENNIS_CONFIG, // Add here
  CUSTOM_CONFIG
];
  1. Test Configuration
  • Create test tournament
  • Verify all features work
  • Check terminology appears correctly

Sport Categories

Grouping Sports

Sports can be categorized:

export const SPORTS_BY_CATEGORY = {
  RACKET_SPORTS: [
    PICKLEBALL_CONFIG,
    TENNIS_CONFIG,
    BADMINTON_CONFIG
  ],
  TABLE_GAMES: [
    POOL_CONFIG,
    FOOSBALL_CONFIG,
    PING_PONG_CONFIG
  ],
  COURT_SPORTS: [
    BASKETBALL_CONFIG,
    VOLLEYBALL_CONFIG
  ],
  OUTDOOR_GAMES: [
    CORNHOLE_CONFIG,
    HORSESHOES_CONFIG
  ]
};

Category Labels

export const CATEGORY_LABELS = {
  RACKET_SPORTS: 'Racket & Paddle Sports',
  TABLE_GAMES: 'Table Games',
  COURT_SPORTS: 'Court Sports',
  OUTDOOR_GAMES: 'Outdoor Games'
};

Best Practices

Choosing Sport Configuration

Best Practices:

  • Select appropriate venue term - Use familiar terminology that matches physical setup and is clear to participants
  • Set realistic defaults - Time limits based on actual play, reasonable point/game counts, tested format recommendations
  • Consider tournament length - Match duration × total matches, venue availability, participant endurance

Customizing Sports

Best Practices:

  • Document custom rules - Clear scoring explanation, tiebreaker procedures, special circumstances
  • Test before tournament - Create practice tournament, enter test results, verify calculations
  • Communicate to participants - Share rules in description, explain scoring system, answer questions upfront

Future Sports

Planned Additions:

  • Tennis (sets and games)
  • Volleyball (rally scoring)
  • Table Tennis / Ping Pong
  • Darts (501, Cricket)
  • Foosball
  • Shuffleboard
  • Horseshoes
  • Bocce Ball
  • Disc Golf
  • Video Games (Smash, FIFA, etc.)

Request a Sport:


Next Steps


Don't see your sport? Create a custom configuration or request it on GitHub!

Was this page helpful?

Help us improve our documentation. Found a typo or have a suggestion?

Report an Issue