Skip to content

Project

A full online betting platform — sportsbook, casino, poker and virtual sports — running in public on its own Kubernetes cluster.

CoreBet public landing page
The public landing at betting.tosktech.com — sportsbook, casino, poker and virtuals behind one account.

What it is

CoreBet is an online betting and gaming platform built end to end: a sportsbook with live in-play markets, a casino with slots and table games, a Texas Hold'em poker room, and simulated virtual sports — all behind one account, one wallet and one bet slip. There are two sides to it. Players browse markets, build accumulators, place bets and cash out; operators work an admin console for KYC review, transaction monitoring, risk dashboards, promotions and audit logs. It is a demo platform rather than a licensed operator: deposits credit a play-money ledger instead of a payment provider, and the welcome bonus on the landing page is play money by design.

Architecture

Fourteen focused .NET services own their own slices — identity, sports, events, betting, odds, wallet, casino, poker, live betting, risk, notifications, realtime, admin and virtual sports — each with its own PostgreSQL schema and no reaching across service boundaries into another's tables. They talk through a RabbitMQ topic exchange over shared event contracts, Redis carries hot odds and the SignalR backplane, and an NGINX ingress routes every API prefix to its service while everything else falls through to the React app. Jenkins builds fifteen images into a private registry and rolls them onto a self-hosted Kubernetes cluster with autoscalers, disruption budgets and health probes per service. The web app and an Android client share one TypeScript sportsbook package, so a market renders the same way on a phone as in a browser.

Provably fair, and provable

The casino is server-authoritative and verifiable. Before a session begins the server generates a random seed and publishes only its hash; the player supplies their own seed; every spin hashes the two together with an incrementing nonce to produce the outcome. The part worth pointing at is that the entire reel grid is rebuilt deterministically from that hash rather than just the win tier — so once the server seed is revealed, anyone can replay a spin and check the exact symbols they were shown. Money is ordered around the randomness on purpose: the wallet is debited before the reels are drawn and credited after, both guarded by an idempotency key on the transaction reference, so a retried request cannot double-charge a spin or double-pay a win.

Odds that compute themselves

Prices are not hand-typed. A shared odds model derives team strength, turns it into implied probabilities, applies an overround, and emits the markets that actually belong to each sport — match result with over/under and both-teams-to-score for football, spread and total for basketball and American football, puck line, run line, set betting. On top of that curated baseline a background ingester layers real fixtures and live scores from public scoreboard feeds, keyed so that re-runs update an event instead of duplicating it, and written so a blocked or broken feed quietly degrades to the seeded sportsbook rather than emptying it. When a price moves too far too fast the odds engine suspends the market and publishes the suspension, and the realtime service pushes it to every open bet slip over SignalR instead of waiting for a page to refresh.

Have a domain with money and clocks in it?

Ledgers, live prices, and rules that must not drift under load — that is the kind of system I most enjoy taking apart.

Get in touch