Competitive blackjack where your rank measures decisions, not luck
They rank you by how much money you made. That's not skill — that's variance. A perfect player can lose 20 hands straight. A terrible player can hit a hot streak and top the leaderboard.
Blackjack, Ranked separates the two. Your P&L is visible. Your P&L never touches your rank. Every decision is evaluated against the mathematically optimal play for the exact cards remaining in the shoe — and that becomes your VAR.
Value-Added Rating. A 0–100 score combining two dimensions:
VAR = PlayEff^0.13 × BetEff^0.87 × 100
Play efficiency — for every hit, stand, double, split, and surrender, the engine computes the EV of all available actions using composition-dependent tree search with memoization. Not basic strategy lookup tables. The actual shoe composition, recalculated every decision. Tree search runs in low single-digit milliseconds — the result is ready before the card animation finishes.
Bet efficiency — how well you size bets relative to your edge. 2× Kelly pressure center with 50% tolerance bands. Overbetting a negative edge tanks your rating. Underbetting a positive edge costs you too.
The 13/87 weight split comes from Peter Griffin's edge-contribution analysis for 6-deck S17 — betting contributes ~85% of total edge. The geometric mean ensures 0% in either dimension produces 0% overall. No hiding behind one skill.
Full server authority. The client never holds shoe state, never computes outcomes, never talks to the database. Every player action is a REST call to one of 18 Edge Functions that validates auth, runs the engine, persists state, and returns the result. Forgery is architecturally impossible.
The game engine is pure TypeScript with zero infrastructure imports — no Supabase, no HTTP, no DB calls. Completely portable. Run it in a terminal, a test suite, or a different backend without changing a line. Edge Functions are thin wrappers: validate auth, call engine, persist, respond.
The frontend is vanilla JS — no React, no framework, no virtual DOM. ~9,300 lines with a single esbuild step. CSS @layer for the 3D table, View Transitions API for navigation, Service Worker for offline-first caching.
Built solo with Claude Code. Engine, frontend, backend, ranking, referrals, campaigns — all of it.
Play at blackjackranked.com
Track your own builds
Get started