Digital Tool / JavaScript Prototype / Scoring Logic

8-Ball / 9-Ball Pool Scoring Tool

A small HTML, CSS, and JavaScript tool built from inside a pool league community to reduce scoring disputes, preserve a shared record, generate fairer teams, and make equal opportunity easier.

Origin

It started with an argument

This project did not begin with technology. It began during league night.

I was playing in the Canadian Poolplayers Association as a league player and team captain. During one match, a scoring dispute came up. Whether because of mistakes, pressure, memory, or alcohol, there was confusion about what had actually happened.

That is the uncomfortable part of paper scoring. When the record is unclear, it becomes one person's word against another person's word.

I didn't start by trying to digitize pool scoring. I started by trying to prevent arguments.

The Real Problem

Pool scoring was really a trust system.

The score sheet was not just paperwork. It was the shared memory of the match. When that memory became unreliable, fairness became harder to protect.

Community Context

I was solving a problem I personally had

I was not looking at the pool community from the outside. I was inside it. I knew the rhythm of league nights, the paperwork, the pressure, the arguments, the jokes, the uncertainty, and the way one scoring mistake could change the mood of a match.

Pool players show up to play pool. They should not have to spend the night worrying about whether the paperwork is correct.

I was solving a problem I personally had.

The Original Vision

The first idea was much bigger than the final tool

At first, I imagined something far more ambitious: a fully automated computer vision system. Cameras would track the table, detect balls, update the score automatically, and remove manual input entirely.

Then reality arrived. Pool halls are messy environments. Nearby tables enter the frame. Players block the camera. Lighting changes. Balls overlap. Striped balls can look solid depending on orientation. A technically exciting solution was starting to drift away from the immediate community problem.

I learned that solving the right problem is more important than solving the most impressive problem.

So I pivoted. Instead of chasing the most advanced version, I built the version that could actually help my team.

The MVP

A shared digital record

The minimum useful version was simple: move the scoring process from paper into a digital workflow that players could understand quickly.

It supported CPA-style 8-ball and 9-ball scoring, target scores, current score, match history, ball states, dead-ball logic, and basic tracking. It was not polished as a commercial product. It was a practical tool for real use.

Pool scoring prototype showing two player panels, ball states, target scores, current scores, and match history.

Scoring Screen

The main interface turned the match into a shared state: player scores, target scores, ball states, and match history in one place.

The moment people started using it without explanation, I knew I had solved a real problem.

Rules Into Logic

Human ambiguity had to become system behavior

The hardest part was not drawing an interface. It was translating league rules into predictable behavior.

For 8-ball, the tool needed to support innings, winner tracking, handicap support, different skill levels, and races to different win conditions.

For 9-ball, the system had to track points for each ball, count the 9-ball as two points, support dead balls, and handle the moment when the 9-ball is made and the remaining balls automatically become dead.

I learned that software design is often about translating human ambiguity into consistent logic.
Dead-ball logic screen showing ball states for two players and score changes.

9-Ball Dead Ball Logic

The trickiest rule work came from deciding how balls should count, stop counting, or become dead under different match states.

UX Lesson

A good product does not need to impress people.

It needs to help them. The most useful version was not the flashiest version. It was the version people could use while still focusing on the match.

Unexpected Tools

The product grew where the community had friction

Once the scoring workflow existed, adjacent problems became visible.

Break tracking let players log table size, game type, balls made on break, dry breaks, and scratches. It created a small practice feedback loop from details that usually disappeared after the match.

Break stat tracker form for table size, game type, balls made, dry break, and scratch.

Break Stat Tracker

A simple form turned break performance into something players could review instead of vaguely remember.

Equal Opportunity

The random team generator mattered more than it looked

One of the most meaningful features came from my role as team captain: randomly generating teams from a list of available players while respecting skill-level constraints.

That sounds small, but in a league environment it mattered. Team selection can become personal very quickly. People can wonder why someone was picked, why someone sat out, whether the captain had favorites, or whether the same players kept getting opportunities.

The generator turned a socially delicate decision into a clearer system. It gave players a more equal chance to participate while still respecting the practical limits of league rules and skill levels.

A tiny randomizer changed the feeling of fairness because the decision no longer came from one person's preference.

That was a major lesson for me: sometimes the most important UX work is not visual polish or technical complexity. Sometimes it is removing the suspicion around a decision.

One of my favorite features took five minutes to build and immediately removed a source of conflict.

Validation

The official tool arrived later

Later, the league released its own official digital scoring tool. I cannot claim direct influence, and I do not want to overstate the project. But emotionally, it was complicated.

It felt validating because it confirmed that the problem was real and worth solving. It was exciting to see the same movement toward digital scoring become official. Some visual ideas, including the treatment of dead balls, felt familiar to the direction I had explored.

There was also some disappointment. When you build something from real community friction and later see similar ideas appear elsewhere, it is hard not to wonder what could have happened if the work had been seen or acknowledged. I hold that lightly. The mature takeaway is still the important one: the problem was real.

What I Learned

Small tools can carry real weight

This project taught me that useful software does not have to be large. It has to understand the environment it lives in.

The more specialized the audience, the more important it becomes to understand how they actually think. Pool players have their own language, habits, rules, frustrations, and priorities. You cannot design well for a niche community from assumptions alone.

Usefulness beats novelty

The manual scoring tool was less impressive than computer vision, but more immediately useful.

Rules are UX

Fairness depended on translating league rules into behavior players could trust.

Records reduce conflict

A shared source of truth helped protect the match from memory and disagreement.

Randomness can be fair

The team generator gave players opportunity without making the captain's preference the center of the decision.

Communities have texture

The tool worked because it came from lived experience inside the pool community.

What Comes Next

The future version would still start with fairness

A stronger version could improve visual polish, exportable score records, team lineup generation, match archives, break analytics, and clearer league-specific setup.

A future version could still explore automated match analysis, but the lesson from this project would stay the same: automation is only valuable if it protects the real human need underneath the workflow.

When I encounter a problem, my instinct is to solve it.
Pool tracker statistics showing average balls per break and dry-break percentages by table size.

Break Percentage Results

The statistics view showed how a scoring tool could grow into a lightweight feedback system for practice and improvement.

The Messy Kitchen

The clean story is about trust and fairness. The kitchen behind it is rule translation, edge cases, and small features that made league life easier.

The first concept was automated ball detection. I moved away from it after realizing that table visibility, occlusion, lighting, and nearby tables would make it harder to solve the immediate trust problem.

Computer Vision Pivot

The pivot was a design decision: prioritize a useful manual workflow over a technically impressive but fragile system.

Team generation randomized from a list of players while respecting skill-level constraints. The value was equal opportunity: players had a clearer chance to be selected without the decision feeling like captain preference.

Team Generation

A small feature with a disproportionately meaningful community impact.

Dead-ball logic forced the system to make a rule-based decision when the 9-ball was made and remaining balls no longer counted.

Rule Edge Cases

The hardest design work was making league logic feel predictable in a digital interface.

Good tools understand the rules people already live with.

This project shows practical tool-building, workflow design, JavaScript logic, and problem-solving inside a real community.