The nerdy part,
in tables.
What our games and pages are built with, what they weigh, how they talk to an RGS or a tracker, and what lands in your inbox at handover. Every table copies as text for your tender doc or your CTO.

HTML5, built for phones first.
Slots on WebGL, Originals on plain canvas. Both run in any modern browser, framed in your lobby.
No Flash. It’s 2026.
Stack
| Slots | TypeScript, WebGL through PixiJS 8, Spine 4.2 runtime for characters, Effekseer for particle effects. Built with Vite. |
|---|---|
| Originals | Plain HTML, canvas 2D and WebAudio. Zero third-party libraries. |
| Math | Python simulations; the Stake Engine math SDK and its optimiser for that platform. |
| Art pipeline | Spine 4.2, Blender for 3D props, Krita, Figma for UI kits. |
| Audio | Recorded and produced sets for slots; WebAudio synthesis (no files) for Originals. |
Screens & input
| Layouts | Desktop and mobile, portrait and landscape. A slot gets its own portrait layout, not a squeezed desktop one. |
|---|---|
| Smallest screen | Designed from 375 px wide up. Originals are checked at 375×812 and 1366×768. |
| Touch targets | 40 px minimum in the Originals' controls. |
| Keyboard | Space to bet, spin or cash out; game-specific keys listed in each game's rules (dice: arrows move the target, X swaps over/under, T toggles turbo). |
| Embedding | Runs inside an iframe in your lobby; sound starts after the first tap because browsers require a user gesture. |
Browser support
Our test target. If your audience runs something older, tell us in the brief.
| Test matrix | Current and previous major versions of Chrome, Safari (iOS and macOS), Firefox, Edge and Samsung Internet. |
|---|---|
| Slots need | WebGL. Every phone and browser on the matrix has it. |
| Originals need | Canvas 2D. WebAudio for sound (the game still plays without it). |
| Pages also tested in | The in-app browsers of the big social apps, because that's where ad clicks open. |
Weight: our Originals, measured
Measured from the files on this site when this page was generated: 38.0 KB to 427.3 KB per game, fonts aside. The toolkit is cached after the first game.
| Game | Page code (gzip) | Shared toolkit (gzip) | Images | Total |
|---|---|---|---|---|
| Rocket Chip | 7.5 KB | 15.9 KB | 1 × WebP, 32.1 KB | 55.5 KB |
| Moonshot Limbo | 17.6 KB | 15.9 KB | 1 × WebP, 75.9 KB | 109.4 KB |
| Gem Mines | 5.2 KB | 15.9 KB | 2 × WebP, 79.0 KB | 100.2 KB |
| Neon Drop | 4.2 KB | 15.9 KB | 1 × WebP, 50.9 KB | 71.0 KB |
| Hyper Dice | 13.9 KB | 15.9 KB | 1 × WebP, 37.9 KB | 67.8 KB |
| Lucky Wheel | 13.2 KB | 15.9 KB | 1 × WebP, 47.5 KB | 76.6 KB |
| Neon Roulette | 22.0 KB | 15.9 KB | No WebP: SVG / CSS | 38.0 KB |
| Holo Scratch | 16.8 KB | 15.9 KB | 8 × WebP, 394.5 KB | 427.3 KB |
| Hi-Lo Heist | 13.0 KB | 15.9 KB | 1 × WebP, 47.5 KB | 76.4 KB |
| Star Keno | 11.4 KB | 15.9 KB | 1 × WebP, 50.9 KB | 78.3 KB |
| Sky Tower | 24.1 KB | 15.9 KB | 5 × WebP, 283.1 KB | 323.1 KB |
| Chip Flip | 12.2 KB | 15.9 KB | 3 × WebP, 213.0 KB | 241.1 KB |
| Chip & Deal | 19.8 KB | 15.9 KB | 2 × WebP, 152.3 KB | 188.0 KB |
| Jacks Royale | 18.4 KB | 15.9 KB | 1 × WebP, 47.5 KB | 81.8 KB |
Weight: slots
| Budget | Agreed per project, in the brief, because a two-character Spine slot and a liquid-shader slot are different animals. |
|---|---|
| Reporting | Every build comes with its real numbers: first-load size, total size and load time on a mid-range phone. |
| Loading | Audio ships as OGG + AAC pairs so every browser gets a format it plays; textures as atlases. |
Sound
| Slots | Base loop, feature loop, stingers, big-win tiers, symbol and UI sounds. Delivered as OGG + AAC (MP4) pairs. |
|---|---|
| Originals | Generated in code with WebAudio: zero audio files. |
| Originals defaults | Muted in thumbnail mode. Otherwise on after the first tap; the player's mute choice is remembered on the device. |
Accessibility & comfort
| Calm mode | Originals have a switch that reduces screen shake and flashes; the choice is remembered. |
|---|---|
| Reduced motion | Our pages respect the system's reduced-motion setting. |
| Readability | Big numbers and high-contrast multipliers; every result also shows as text (the multiplier, or a plain “Boom!”), not just a colour flash. |
| Rules | A rules screen with the RTP or house edge and the formula, one tap away. |
Localisation
| Text | All strings in language files (JSON), no text baked into images. |
|---|---|
| Numbers & currency | Formatted per locale: decimal commas, currency position, crypto decimals. |
| Wording modes | Stake Engine games switch between casino wording and social / sweepstakes wording. |
| Right-to-left | Scoped per project. |
Books in, events out.
How our client talks to the Stake Engine RGS. Same flow we use in our live slot.

Launch parameters the client reads
Read once from the address bar at boot. Example values are placeholders.
| Parameter | Example | Meaning |
|---|---|---|
sessionID | abc123… | Session the RGS issued for this player. |
rgs_url | rgs.example.com | Which RGS host to talk to. |
lang | en | UI language. |
currency | USD | Display currency (replays have no wallet, so they take it from here). |
social | true | Social / sweepstakes wording instead of casino wording. |
replay | true | Replay one round (with game, version, mode, event). |
RGS calls, in round order
The calls our Stake Engine client makes. Money is an integer: 1,000,000 units = 1.00.
| Call | When | What happens |
|---|---|---|
POST /wallet/authenticate | On load | Opens the session. Returns the balance, bet levels, game modes with their cost multipliers, and jurisdiction flags. |
POST /wallet/play | Bet | Sends mode + amount. The RGS debits amount × cost multiplier, picks a book and returns the round: payout multiplier and the book's events. |
POST /bet/event | During the animation | Records how far the player has watched, so an interrupted round can resume. |
POST /wallet/end-round | Round shown | Settles a winning round and credits the payout. Losing rounds are already closed. |
POST /wallet/balance | Any time | Current balance. |
GET /bet/replay/{game}/{version}/{mode}/{event} | Replays | Returns one book's events for a replay link. |
One round, front-end side
Simplified from our client. The browser never decides an outcome; it animates the events of the book the RGS picked.
// 1. open the session
const auth = await rgs('/wallet/authenticate', { sessionID });
const { betLevels, gameModes, jurisdiction } = auth.config; // honour the flags
// 2. bet: the RGS debits amount × costMultiplier and picks a book
const { round } = await rgs('/wallet/play', { sessionID, mode: 'BASE', amount: 1_000_000 }); // 1.00
// 3. animate the book's events (reveal, tumbles, wins, free spins…)
for (const ev of round.state) {
await animate(ev);
rgs('/bet/event', { sessionID, event: String(ev.index) }); // resume point
}
// 4. settle a winning round
if (round.active) await rgs('/wallet/end-round', { sessionID });Jurisdiction flags the client must honour
Sent by the RGS at authenticate. One build serves every market; the flags switch features per jurisdiction.
socialCasino | Social / sweepstakes wording. |
|---|---|
disabledTurbo, disabledSuperTurbo | Hide the speed controls. |
disabledAutoplay | No autoplay. |
disabledBuyFeature | Hide the bonus buys. |
disabledSlamstop, disabledSpacebar, disabledFullscreen | Remove those inputs. |
displayRTP, displayNetPosition, displaySessionTimer | Show RTP, net position or a session timer. |
minimumRoundDuration | Never finish a round faster than this. |
What we hand over for Stake Engine
| Math | Game code in the math SDK, publish files (books + lookup tables) for every bet mode, stats per mode. |
|---|---|
| Front-end | A static build ready to upload, plus the source. |
| Review | Game details for reviewers: rules, features, bet modes, RTP, max win. |
| QA | A play-money demo that runs the real client against a local RGS stand-in with a subset of the real books, replays included. |
Numbers you can re-run.
What the math pack contains and the formulas behind our Originals.

Math deliverables
| Deliverable | Format | What it tells you |
|---|---|---|
| Par sheet | Spreadsheet | Paytable, reel strips or weights, RTP split by base game and features. |
| Simulation report | PDF / Markdown | RTP, hit rate, feature frequency, max-win frequency, standard deviation and win distribution, per bet mode. |
| Simulation code | Python | Re-run it yourself. Same seed, same numbers. |
| Reels / books | Your platform's format | What the game server actually reads. |
| Rules text | JSON strings | RTP and max win per mode, matching the report. |
Example: Vampir: Graveyard Shift, bet modes
From our game design and math spec. Full sheet on the game sheets.
| Mode | Cost | RTP | Max win |
|---|---|---|---|
| Base game | 1× | 96.50% | 25,000× |
| Night Owl (enhancer) | 2× | 96.50% | 25,000× |
| Graveyard Shift (buy) | 100× | 96.50% | 25,000× |
| Overtime Shift (buy) | 300× | 96.50% | 25,000× |
| Blood Moon Shift (buy) | 1,000× | 96.50% | 25,000× |
Originals: formulas we publish
1% house edge on the first nine rows. On white-label builds the 0.99 becomes your number.
| Crash, limbo | P(result reaches x) = 0.99 ÷ x |
|---|---|
| Dice | multiplier = 99 ÷ win chance (%) |
| Mines | payout after k gems with m mines = 0.99 × C(25,k) ÷ C(25−m,k) |
| Hi-Lo | payout per guess = 0.99 ÷ chance of the guess |
| Tower | payout after f floors = 0.99 × (doors ÷ safe doors)f |
| Coin flip | payout after n correct calls = 0.99 × 2n |
| Wheel | the S segment multipliers add up to 0.99 × S, so every wheel returns exactly 99% |
| Keno | each of the 30 paytables solved so Σ P(hits) × pay = 0.99 |
| Plinko | paytables scaled to 99% before display rounding |
| Blackjack | 0.44% edge with perfect basic strategy (6 decks, dealer stands on soft 17, 3:2) |
| Video poker | 9/6 Jacks or Better: 99.54% at 5 coins with optimal holds |
| Roulette | European single zero: every bet pays 36 ÷ numbers covered, so 36/37 = 97.30% |
What lands in your inbox.
The folders, the files and the call at the end.
Nothing ships as “final_v7_REAL.zip”. We have standards.
Game handover, folder by folder
Custom slot. White-label work gets the subset you need to deploy and skin.
game-name/
├─ build/ # static files, ready to deploy or upload
├─ src/ # front-end source + build scripts
├─ math/ # model, simulation code, reels or books, publish files
│ └─ reports/ # simulation report per bet mode
├─ art/ # layered sources, Spine projects, atlases, exports
├─ audio/ # WAV masters, stems, OGG + AAC game files, cue sheet
├─ store-media/ # tiles, covers, banners in your lobby's sizes
└─ docs/ # GDD, rules text, integration notes, licences listHandover checklist
| Build | Deployable build, tested on the agreed browser matrix. |
|---|---|
| Source | Repository with history, build instructions in the README. |
| Math | Report per mode + the code to reproduce it. |
| Assets | Sources for every image and sound, with a licence list. |
| Docs | Rules, integration notes, known limits. |
| Call | A walkthrough with your team, recorded if you like. |
Static, fast, editable.
Pages that load before the visitor changes their mind, and that you can edit without calling us.

Page stack
| Code | Static HTML, one CSS file, a small vanilla JS file. No framework, no page builder. |
|---|---|
| Images | WebP, sized for the slot they fill; video only where it earns its weight. |
| Fonts | One or two families, or the system stack when speed matters most. |
| Forms | Only if the offer needs one; otherwise the button goes straight to the offer. |
Performance targets
| LCP | ≤ 2.5 s Google's “good” threshold |
|---|---|
| INP | ≤ 200 ms Google's “good” threshold |
| CLS | ≤ 0.1 Google's “good” threshold |
| Lighthouse (mobile) | 90+ on performance, accessibility, best practices and SEO Our target, checked before handover |
Weight: our demo pages, measured
Code only: the HTML and the CSS and JS it loads, gzipped, measured from the files when this page was generated. Fonts, images and video come on top. A range covers every page of one template.
| Page | HTML + CSS + JS (gzip) |
|---|---|
| Casino landing (Velvet Ace, 5 pages) | 8.4–8.5 KB |
| Sportsbook landing (Kickrush, 4 pages) | 9.8–10.1 KB |
| Crypto casino lobby (Hashtide) | 14.3 KB |
| VIP page (Sable Crown) | 9.0 KB |
| App install page (Spindle) | 9.5 KB |
| Sweepstakes page (CoinHarbor) | 24.3 KB |
| Social casino page (Velvet Vegas) | 23.3 KB |
| Top-10 page (ReelVerdict) | 30.6 KB |
| Review page (Payline Journal) | 30.6 KB |
| Bonus comparison (WagerWise) | 30.7 KB |
| Pre-landers (6 mechanics, one kit) | 22.2–23.4 KB |
Hosting
| Your domain, your host | We send a zip. Upload it to any static host, CDN or server. |
|---|---|
| Our setup | We put it on a fast CDN and you point a (sub)domain at it with a CNAME. You still own the files. |
| Tracker-hosted | Works as a lander inside Keitaro, Binom and similar: it's just static files. |
Geo & language swap
| How | One build. Content per market lives in a small data file; the page picks it from a URL parameter (?geo=de), a tracker token or the host's geo header. |
|---|---|
| What swaps | Language, currency, bonus wording, T&Cs, licence and RG lines, payment logos. |
| What never swaps | What a reviewer sees versus a user in the same market. That would be cloaking. |
Editing guide (included)
| Offer link | One place at the top of the config. Every button reads it. |
|---|---|
| Bonus text & terms | Plain text in the same config, per market. |
| Images | Swap the file, keep the name and size. |
| Legal lines | Per market, next to the bonus text. |
| What not to touch | Marked in the README, with the reason. |
Landing page zip
What you get for a page.
offer-page/
├─ index.html
├─ assets/
│ ├─ page.css
│ ├─ page.js # tracking pass-through, geo/lang swap
│ └─ img/ # WebP, sized for their slots
├─ config.js # offer link, bonus text, T&Cs, legal lines per market
└─ README.md # editing guideEvery click accounted for.
Pass-through, postbacks, pixels and consent: the boring part, done right.
If your tracker shows {clickid} in a report, someone typed a brace wrong. Not us.
Parameters we pass through
Whatever arrives on the page's URL is appended to the offer link. Rename to match your tracker.
clickid (or your tracker's name) | Matches the conversion back to the click. |
|---|---|
sub1 … sub5 | Your campaign, creative, placement breakdown. |
utm_source, utm_medium, utm_campaign, utm_content, utm_term | Analytics attribution. |
gclid, fbclid, ttclid | Ad-platform click IDs, kept when present. |
Pass-through, the whole trick
Every link marked data-offer gets the incoming parameters.
// copy incoming URL parameters (clickid, sub1…sub5, utm_*) onto every offer link
const incoming = new URLSearchParams(location.search);
document.querySelectorAll('a[data-offer]').forEach(a => {
const url = new URL(a.href);
incoming.forEach((value, key) => url.searchParams.set(key, value));
a.href = url.toString();
});Postback template (example)
Set in the operator's or network's dashboard, pointing at your tracker. Placeholders in braces are filled by the sender; names vary by platform.
https://tracker.example.com/postback?cid={clickid}&payout={payout}&status={status}&txid={transaction_id}Pixels & consent
| Supported | Meta, TikTok, Google tag (GA4 / Ads) and others on request. |
|---|---|
| Conversions | Fired by your operator or network server to server (postback). The landing page only records visits and clicks. |
| Consent | A consent banner where the market requires one, with tags waiting for consent. |
| Weight | Every tag costs speed; we add the ones you'll actually use. |
Small file, big tap.
Single-file HTML5 ads that respect the network spec and the gambling rules.

Check the policy first. Many ad networks restrict gambling ads by market, require pre-approval or don’t accept playables for them at all. We check your networks before the storyboard.
Playable ad spec
| File | One HTML file. Images, sound and code inlined; no external requests. |
|---|---|
| Size limit | Typically 2–5 MB depending on the network; some ask for less. Industry range. Always check each network's current spec. |
| Orientation | Portrait and landscape, resizes live. |
| Length | A few seconds of play, then the end card. Typical: well under a minute. |
| Sound | Starts muted; on after the first tap. |
| Call to action | Through MRAID (mraid.open) or the network's own method; never a raw redirect. |
| Behaviour | No auto-redirect, no fake system dialogs, no fake close buttons. |
MRAID basics
Wait for the container, open links through it, fall back to a normal link when there's no MRAID.
function cta(url) {
if (window.mraid && typeof mraid.open === 'function') mraid.open(url);
else window.open(url, '_blank');
}
function boot() { /* start the game once the ad container is ready */ }
if (window.mraid) {
if (mraid.getState() === 'loading') mraid.addEventListener('ready', boot);
else boot();
} else boot();
Nothing for .
No spec blocks matched, so Chip took a nap. Try “MRAID”, “postback”, “Safari” or “RGS”.
Need a spec we didn’t list?
Send your platform docs or your network list. We reply with what fits and what doesn’t, in writing.