Live Poker Madness
A complete free to play mobile poker game built solo, end to end. An original fold or all in poker variant running on Linux dedicated servers, orchestrated by a Node.js manager I wrote, backed by a full Express/MongoDB user system with payments, KYC, and an admin panel.
Developer
2024






A live free-to-play mobile game I built and ran solo, end to end. The backend was most of the work: a Node.js match manager coordinating authoritative game state across Linux dedicated servers, a full Express/MongoDB user system with authentication, payments, and KYC onboarding, and the admin panel it was operated from. It ran in production for a year with me as the only person on call.
Server orchestration from scratch. Most UE multiplayer portfolios stop at "replication works." This required building the entire deployment layer. Dynamically spawning Linux dedicated server processes on free ports, tracking sessions, routing players to the right instance, and tearing everything down cleanly. The hardest part was port allocation under concurrency: scanning TCP/UDP/TCP6 for genuinely free ports and handling the race between "found a free port" and "another session grabbed it."
A two-way control plane between engine and infrastructure. The UE server and the Node.js manager talk over WebSocket in both directions — the manager spawns and assigns, the game server reports session lifecycle and per-hand outcomes back. Designing that protocol so the manager stays authoritative over matchmaking while the game server stays authoritative over gameplay was the core architectural decision.
Server-authoritative anti-cheat for a prize economy. Because winning advances real progression, the deck is shuffled server-side and pushed down, never trusted from the client, and every privileged message is admin-token gated. For a game where outcomes have value, trust boundaries can't be an afterthought.
Solving a platform gap with JNI. UE has no native API for picking an image from the Android gallery. Rather than work around it, I expanded a JNI plugin that calls the native Android intent and marshals the result back to Blueprint as base64, which then served double duty for both avatars and KYC document capture.