♠️

Z-Poker

Office poker, properly ranked.

A lunch-break habit turned into a real-time, ELO-ranked web app — shipped in a weekend, still running on Mondays.

Next.jsNestJSTypeScriptTailwindPostgreSQLClerkSSEResend
Z-Poker

Why I built this

Lunch poker had a problem: 30 minutes is too short for a real hand of poker. Everyone just shoves all-in, and the actual skill of the game gets lost. We needed long-term tracking so people would play with strategy and accountability. On top of that, a proper gamification layer would make it more interactive and a lot more fun. After a weekend, Z-Poker went live.

Z-Poker leaderboard with podium top-3 and tier badges
01

One leaderboard. Your office only.

Open the app and you see exactly where you stand — within your company. Top 3 get the podium with a running-light glow. Everyone else gets a tier badge, from 🐟 Cá Con up to 👑 Thần Bài, and a bar that shows how close the next rank is.

Create-session form with buy-in input and active sessions list
02

Buy-in, players, go.

Anyone with a company email can spin up a session in under ten seconds. Pick a buy-in, add the players around the table, done. Everyone else sees it appear live — no refresh.

Active session screen with chip inputs and live waiting banner
03

Live chip tracking. No spreadsheet.

Each player enters their own stack from their phone. One taps in, everyone else sees the number move. The host locks the table the moment the chips reconcile.

Locked session showing ranked winners and animated ELO deltas
04

Lock the table. Watch the ELO move.

The instant the host hits lock, every player's ELO ticks up or down on screen — animated, in order, with streak bonuses lighting up for hot runs. It's the moment the room actually goes quiet.

AI-written session highlight recap inside the session detail screen
05

An AI MC writes the highlights. By email.

Before the night starts, the host picks an MC persona. After lock, that MC writes a short, hyped recap — who bluffed, who got cracked, who climbed a tier — and emails it to the whole table within minutes.

Player profile showing tier badge, history and ELO progression
06

From Tay Non to Thần Bài.

Every player has a profile that remembers the climb — games played, win rate, recent form, the exact ELO line from rookie to predator. Six tiers, fifty-point divisions in the middle, so the next rank is always in reach.

Under the hood

ELO tuned for a 20-person office

The math is custom: asymmetric K so winning feels rewarding without crushing losers, a flatter curve so top players don't stall, streak bonuses for hot runs. Every constant has a snapshot test.

One tenant per email domain

Tenancy is the company domain (@acme.com), enforced at the auth guard. Company A's data and Company B's data never share a query.

Real-time, no WebSockets

Two SSE streams — one domain-wide, one per session — carry every chip update, join, and lock. No socket library, no pub/sub layer. Just NestJS Observables.

AI recap, delivered by email

On lock, a Claude prompt writes the highlights in the chosen MC's voice. Resend ships the email. The whole loop fires within ~30 seconds.

Stack & numbers

v1.0
Current Version
2 days
MVP to Launch
Live & iterating
Major Updates

Got an idea you've been sitting on?

Z-Poker took one weekend to go from idea to live. If you have an idea — big or small, internal tool or real product — I can help you turn it into a working app.