Brian Hackett

POOL LEAGUE MANAGEMENT PLATFORM · 2026

Chalk & Table

From opening break to the championship match.

A full-stack pool league management platform built to handle the complexities of running a real league: teams, seasons, scheduling, player rosters, match results, standings, and playoffs.

Next.jsTypeScriptPostgreSQLTailwind CSSAWS
AgencyOS dashboard showing projects, tasks, milestones, and agency activity

The ProjectBuilt around the way real pool leagues work.

Chalk & Table began with a simple idea: build a league management platform that reflects how local pool leagues actually operate.

As a member of a local pool league, I was familiar with the challenges of organizing teams, managing schedules, tracking results, and keeping standings up to date. What seemed like a straightforward application quickly revealed a surprising amount of complexity.

Teams share venues, schedules need to account for holidays and other conflicts, seasons follow different formats, and playoff structures introduce their own rules. Rather than building around a rigid set of assumptions, I wanted to create something flexible enough to accommodate different leagues.

The result is a full-stack application that brings league administration, scheduling, team rosters, match results, player statistics, standings, and playoffs together in one place.

League ManagementEvery team, every season, all in one place.

Chalk & Table organizes each league into seasons, allowing administrators to manage teams, venues, and player rosters while preserving results from previous years.

Teams can be assigned to shared venues, players can be added to seasonal rosters, and captains can be designated to help manage their teams. Each season maintains its own schedule, standings, and results, providing a complete picture of league activity.

Standings are calculated automatically from completed matches, tracking wins, losses, and rack percentages to give teams an up-to-date view of their performance throughout the season.

roster section of team page

Teams can opt-in to keep track of individual rack statistics throughout a season. This will keep track of each player's individual win/loss record.

Standings page

Standings are calculated automatically based on match results. Tiebreakers are built-in which include head-to-head records and total racks won, as well as a "mini league table" calculation when more than two teams are tied.

SchedulingMore than just putting dates on a calendar.

Generating a league schedule involves more than pairing teams together. Matches need to be distributed fairly, home and away assignments need to be balanced, and teams sharing the same venue can't be scheduled at home simultaneously.

Chalk & Table includes a schedule generator that handles round-robin competition while accounting for these constraints. Administrators can choose the day of the week, exclude holidays or other unavailable dates, and select the season's scheduling format.

Before committing anything to the database, the generated schedule can be previewed and reviewed. For leagues with an existing schedule, a CSV import option provides an alternative to automatic generation.

Options for format of schedule
Schedule Format
Choose between single round-robin, home-and-away, or a fixed number of weeks.
View of all options chosen
Schedule Confirmation
Review scheduling options before generating and approving the final schedule.

Match ManagementFrom the opening break to the final rack.

Chalk & Table provides a dedicated match page where teams can manage lineups, record results, and track individual player performance throughout the season.

Team captains can select players from their seasonal rosters to build match lineups, while authorized users can enter final scores and record rack-by-rack results. Completed matches are locked to prevent accidental changes to recorded results.

For leagues that enable individual player statistics, rack results are used to calculate each player's wins and losses automatically. This allows leagues to track individual performance without requiring a separate scorekeeping system.

Match results also feed directly into the league standings, keeping team records and rankings up to date as the season progresses.

Weekly schedule overview
Weekly Schedules
Schedule page is broken down by weeks.
View of score editing
Score Entering
A simple modal interface for entering match scores.

PlayoffsThe road to the championship.

The regular season is only part of the story. Chalk & Table also supports configurable playoff tournaments, allowing leagues to define their postseason structure rather than being locked into a single format.

Administrators can configure playoff rounds, determine how many teams qualify, and establish the number of matches required to win each series. The system supports different formats for each round, including best-of-three and best-of-five series.

As results are recorded, teams advance through the tournament bracket, with support for reseeding between rounds. The bracket provides a clear view of each matchup, series results, and the path to the championship.

By integrating playoffs with the existing teams, rosters, and match management system, Chalk & Table keeps the postseason connected to the rest of the league.

Playoff bracket with champion
Playoff Bracket
Complete playoff bracket with championship call-out.

Under The HoodBuilt with Next.js. Designed for the complexities of real league management.

Next.js + React

Full-stack application built with Next.js 16, React, and TypeScript, using server components, server actions, and interactive client components.

PostGreSQL + Prisma

Relational database modeling leagues, seasons, teams, venues, players, matches, individual rack results, and playoff series, managed through Prisma ORM.

Authentication & Authorization

Auth.js handles user authentication, while league memberships and role-based permissions control access to administrative features, team management, and scorekeeping.

Scheduling & Tournament Logic

Custom round-robin scheduling algorithms account for shared venues, home-and-away assignments, and excluded dates. Configurable playoff structures manage tournament series and progression.

Tailwind CSS

Responsive interfaces built with Tailwind CSS, including customizable league themes, interactive scheduling tools, match scorekeeping, and tournament brackets.

AWS + Nginx

Deployed on Amazon EC2 with Nginx, PostgreSQL, and PM2 managing the production Next.js application.

Building Chalk & TableWhat started as a league manager became something much bigger.

Chalk & Table began as an opportunity to build a practical application around something I already knew well. Having played in a local pool league, I understood how the league operated, but translating those rules and routines into software presented an entirely different set of challenges.

What initially seemed like a straightforward combination of teams, schedules, and standings grew into a much more complex system. Supporting multiple seasons, shared venues, configurable playoff formats, player statistics, and different levels of user access required careful consideration of how each part of the application interacted with the others.

Some of the most rewarding challenges involved the logic behind the scenes. Building a schedule generator that accounted for venue conflicts and balanced home-and-away assignments, designing a playoff system flexible enough to accommodate different tournament formats, and maintaining consistent permissions across the application all pushed me beyond simply creating pages and database records.

Developing Chalk & Table strengthened my experience with Next.js, TypeScript, relational data modeling, and full-stack application architecture. More importantly, it reinforced the value of understanding the problem before designing the solution, and of building software that can adapt as real-world requirements evolve.

Next Project

AgencyOS →