
BilliardCloud
All-in-one SaaS platform for billiard clubs to manage members, in-club consumption tracking, tournaments, live scoreboards and stream overlays.
- TypeScript
- Next.js
- Bun
- Turborepo
- oRPC
- Drizzle
- PostgreSQL
- Redis
- BullMQ
- better-auth
- Stripe
- Docker
Key Features
- Member and role management
- Digital bar tab & self-service terminal
- Tournament brackets
- Live table scoreboards
- OBS-ready livestream overlays
- Exportable booking history
A Look Inside



BilliardCloud — A Digital Control Center for Clubs
Running a billiard club is more work than the game itself. Members get tracked in spreadsheets, drinks on paper lists, tournaments in WhatsApp groups, and results vanish into chat history. I wanted to take all of that scattered, daily friction and fold it into one calm, streamlined place — simple enough that a volunteer admin with no IT background can run their whole club from it.
That's BilliardCloud: an all-in-one SaaS for billiard clubs, and the project where I got to own the full picture, from the data model to the tablet at the table.
Why I Built It This Way
The hard requirement wasn't a feature — it was trust and simplicity for non-technical users. A club treasurer should never see a stack trace or wonder which club's data they're looking at. So two decisions drove everything:
- Multi-tenant by design. Every club lives in its own isolated space — separate data, roles and configuration, cleanly partitioned at the database level. No club can ever see another's numbers.
- Built for the venue, not just the browser. Half the real usage happens on a tablet bolted next to a billiard table, often late at night. That meant big buttons, clear states, and an interface that's still usable after the third beer.
I also wanted end-to-end type safety across the whole product, so a change to the backend instantly shows up as a type error in the frontend — fewer surprises in production, faster iteration for a solo-leaning team.
How I Built It
- Monorepo: a Bun + Turborepo setup, so the public site, the dashboard and shared packages all live in one fast, unified toolchain
- Frontend: Next.js and React 19 — server rendering for the public side, a reactive dashboard for live club data
- API layer: oRPC for a fully type-safe RPC bridge between frontend and backend — end-to-end types, no code generation
- Data: PostgreSQL with Drizzle ORM for type-safe queries over the multi-tenant schema
- Auth: better-auth, with role-based access scoped per club
- Real-time & jobs: Redis pub/sub for live events, BullMQ for billing runs, notifications and exports
- Payments: Stripe for subscription-based club billing and automated invoicing
- Observability: OpenTelemetry tracing to catch performance issues before they reach users
- Deployment: Dockerized for consistent, reproducible environments with a CI/CD pipeline
What it actually does, day to day:
- Manage members, roles and permissions in one place instead of five spreadsheets
- Track consumption digitally with a self-service terminal — drinks and snacks, balances, automated billing
- Create tournaments and generate brackets automatically, from a small club night to a league
- Drive live scoreboards on displays around the venue over WebSockets
- Feed results straight into a public live page or OBS-ready stream overlays — no manual updates
Why I Love It
BilliardCloud is the project that reminds me software is only as good as the messy reality it has to survive. The interesting problems weren't abstract — they were "how does a tired admin settle up the night's drinks in three taps," and "how do I guarantee one club never touches another's data." Solving real operational pain for real people, and watching a club actually adopt it, is enormously satisfying.
It also sharpened skills I lean on constantly: multi-tenant SaaS architecture, domain logic and UX for non-technical users, and integrating cleanly into livestream workflows. A focused product for a niche — and proof of how much value comes from solving one real problem really well.
Interested in this project?
Check out the live website or get in touch to learn more.