Sports Technology2025–present
One live score that the bracket, the scorer, and the broadcast all read from.
Pickleball organizers run brackets, schedules, live scores, and stream graphics at the same time, usually across spreadsheets and generic scoreboard apps that drift apart. CourtCommand puts all of it on one real-time engine, so a score entered once shows up everywhere it should.

“I enter a score once and it's on the bracket, the scorer's phone, and the stream before I look up. That's what I spent years trying to duct-tape together with spreadsheets.”
What changed
Game-day data
Before: Spreadsheets and scoreboard apps
One real-time engine
Brackets, schedules, scores, and overlays all read from the same Go and Redis core over six WebSocket channels. A score entered once shows up on every screen.
Broadcast graphics
Before: Overlays hand-built in OBS and updated by hand between matches
Overlays from live data
A themeable overlay suite reads from the same engine as the scorers, so the stream shows the score the court just entered. It sells bundled with the platform or on its own.
Event-day workload
Before: Multiple staff on brackets, score entry, and stream graphics for every event
Hours back on every event day
Time organizers spend per event on brackets, score entry, and stream graphics. Brackets, scores, and overlays update from a single entry, so the staffer whose whole job was keeping three tools in sync is free to run the event.
Challenge
A pickleball tournament does not wait for slow software. Organizers juggle brackets, seeding, schedules, live scores, and broadcast graphics at once, and most of them do it with spreadsheets and generic scoreboard apps.
When the scorer, the schedule, and the stream each read from a different place, they drift apart. A wrong score on the stream or a match sent to the wrong court is how game day falls apart in front of players and viewers.
Before CourtCommand, events ran on Google Sheets for brackets, a free scoreboard app for scores, and hand-built OBS overlays. A score typed into the wrong tab meant a wrong bracket, a wrong match on the stream, and a referee walking over to ask what happened. Every event cost late brackets, missed matches, and an extra staffer whose only job was keeping the three tools in sync.
We treated CourtCommand as an operations problem first and a product problem second. It had to be fast, serve many organizations at once, and keep every screen in sync, so the backend had to be trustworthy before a single screen was designed.
That meant building the engine first: tournaments, leagues, seasons, brackets, live scoring, and scheduling as one tested API. The broadcast overlays were planned as another reader of the same live data, not something bolted on later.
Solution
The backend is Go 1.24 on the Chi router over PostgreSQL 17, with type-safe queries generated by sqlc and migrations run by Goose. Redis 7 handles pub/sub, sessions, and rate limiting, and six WebSocket channels push live state to every connected screen.
It landed as more than 170 API endpoints across eight build phases, 29 database migrations, and 62 automated tests, all before the UI work began.
Two products sit on that backend. The management platform covers tournaments, leagues, brackets, live scoring, scheduling, venues, and player, team, and organization records. The overlay suite draws themeable broadcast graphics from the same live data and sells bundled or on its own.
Results
CourtCommand is live at courtcommand.app. Anyone can browse public tournaments, leagues, venues, and live matches, and it installs to a phone’s home screen like an app.
It reads as operating software for live pickleball, not a scoreboard skin. Live events now run on it end to end: scorers entering from the courts, brackets advancing on their own, and viewers watching overlays that match the score on the floor.
Stewardship
RelentNet still runs CourtCommand. It is hosted on Coolify with Docker Compose, the same way RelentNet runs its own systems.
RelentNet monitors uptime, patches dependencies, and ships new features on a steady cadence; since launch. Next on the roadmap: player ratings that carry across leagues and seasons.
Built with
12 tools across the platform and the broadcast overlays
Core
- Go 1.24 (Chi v5)
- sqlc
- Goose migrations
Data & Realtime
- PostgreSQL 17
- Redis 7
- WebSockets
Client
- React 19
- Vite
- TanStack Router
- Tailwind 4
Ops
- Docker Compose
- Coolify
In their words
A letter from the client
I ran tournaments off three tools that never agreed with each other. Game day was me standing between a spreadsheet, a scoreboard app, and the stream, fixing mismatches while players and viewers waited.
The first event on CourtCommand, nobody asked me what the score was. The scorers used their phones, the bracket updated itself, and the stream matched the court every time. My staff got their evening back and I got to actually watch the matches.
RelentNet built the engine first and the screens second, and that's why it holds up under a real event. I'd put any league or tournament organizer in front of Brandon without hesitation.

Who built it
Brandon Harris
Co-founder & CEO, RelentNetNashville
Brandon owns what gets built. On CourtCommand that meant the engine first and the screens second. RelentNet still hosts it.
Read more client stories

Commercial Construction
Cambridge Building Group
Vendor invoices route from inbox to QuickBooks Bills automatically: Claude-vision extraction, PM approval, PDF and project attached.
Read story →
Real Estate
VM Homes
MLS-synced property search across six Tampa Bay submarkets, from downtown St. Pete to the Gulf beaches.
Read story →Always know what you'll pay
$2,000 diagnostic, credited toward the build. Transparent engagement pricing after. No mystery retainers.
Start a DiagnosticStart a conversation
Tell us about your business and we'll point you to the highest-friction surface to start on.
Inquire