Tech & integration specs

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.

0third-party libs in our Originals
38.0–427.3KB per Original, measured
6RGS calls per Stake Engine client
Chip typing on a laptop
Games

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

SlotsTypeScript, WebGL through PixiJS 8, Spine 4.2 runtime for characters, Effekseer for particle effects. Built with Vite.
OriginalsPlain HTML, canvas 2D and WebAudio. Zero third-party libraries.
MathPython simulations; the Stake Engine math SDK and its optimiser for that platform.
Art pipelineSpine 4.2, Blender for 3D props, Krita, Figma for UI kits.
AudioRecorded and produced sets for slots; WebAudio synthesis (no files) for Originals.

Screens & input

LayoutsDesktop and mobile, portrait and landscape. A slot gets its own portrait layout, not a squeezed desktop one.
Smallest screenDesigned from 375 px wide up. Originals are checked at 375×812 and 1366×768.
Touch targets40 px minimum in the Originals' controls.
KeyboardSpace 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).
EmbeddingRuns 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 matrixCurrent and previous major versions of Chrome, Safari (iOS and macOS), Firefox, Edge and Samsung Internet.
Slots needWebGL. Every phone and browser on the matrix has it.
Originals needCanvas 2D. WebAudio for sound (the game still plays without it).
Pages also tested inThe 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.

GamePage code (gzip)Shared toolkit (gzip)ImagesTotal
Rocket Chip7.5 KB15.9 KB1 × WebP, 32.1 KB55.5 KB
Moonshot Limbo17.6 KB15.9 KB1 × WebP, 75.9 KB109.4 KB
Gem Mines5.2 KB15.9 KB2 × WebP, 79.0 KB100.2 KB
Neon Drop4.2 KB15.9 KB1 × WebP, 50.9 KB71.0 KB
Hyper Dice13.9 KB15.9 KB1 × WebP, 37.9 KB67.8 KB
Lucky Wheel13.2 KB15.9 KB1 × WebP, 47.5 KB76.6 KB
Neon Roulette22.0 KB15.9 KBNo WebP: SVG / CSS38.0 KB
Holo Scratch16.8 KB15.9 KB8 × WebP, 394.5 KB427.3 KB
Hi-Lo Heist13.0 KB15.9 KB1 × WebP, 47.5 KB76.4 KB
Star Keno11.4 KB15.9 KB1 × WebP, 50.9 KB78.3 KB
Sky Tower24.1 KB15.9 KB5 × WebP, 283.1 KB323.1 KB
Chip Flip12.2 KB15.9 KB3 × WebP, 213.0 KB241.1 KB
Chip & Deal19.8 KB15.9 KB2 × WebP, 152.3 KB188.0 KB
Jacks Royale18.4 KB15.9 KB1 × WebP, 47.5 KB81.8 KB

Weight: slots

BudgetAgreed per project, in the brief, because a two-character Spine slot and a liquid-shader slot are different animals.
ReportingEvery build comes with its real numbers: first-load size, total size and load time on a mid-range phone.
LoadingAudio ships as OGG + AAC pairs so every browser gets a format it plays; textures as atlases.

Sound

SlotsBase loop, feature loop, stingers, big-win tiers, symbol and UI sounds. Delivered as OGG + AAC (MP4) pairs.
OriginalsGenerated in code with WebAudio: zero audio files.
Originals defaultsMuted in thumbnail mode. Otherwise on after the first tap; the player's mute choice is remembered on the device.

Accessibility & comfort

Calm modeOriginals have a switch that reduces screen shake and flashes; the choice is remembered.
Reduced motionOur pages respect the system's reduced-motion setting.
ReadabilityBig numbers and high-contrast multipliers; every result also shows as text (the multiplier, or a plain “Boom!”), not just a colour flash.
RulesA rules screen with the RTP or house edge and the formula, one tap away.

Localisation

TextAll strings in language files (JSON), no text baked into images.
Numbers & currencyFormatted per locale: decimal commas, currency position, crypto decimals.
Wording modesStake Engine games switch between casino wording and social / sweepstakes wording.
Right-to-leftScoped per project.
Stake Engine

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.

ParameterExampleMeaning
sessionIDabc123…Session the RGS issued for this player.
rgs_urlrgs.example.comWhich RGS host to talk to.
langenUI language.
currencyUSDDisplay currency (replays have no wallet, so they take it from here).
socialtrueSocial / sweepstakes wording instead of casino wording.
replaytrueReplay 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.

CallWhenWhat happens
POST /wallet/authenticateOn loadOpens the session. Returns the balance, bet levels, game modes with their cost multipliers, and jurisdiction flags.
POST /wallet/playBetSends mode + amount. The RGS debits amount × cost multiplier, picks a book and returns the round: payout multiplier and the book's events.
POST /bet/eventDuring the animationRecords how far the player has watched, so an interrupted round can resume.
POST /wallet/end-roundRound shownSettles a winning round and credits the payout. Losing rounds are already closed.
POST /wallet/balanceAny timeCurrent balance.
GET /bet/replay/{game}/{version}/{mode}/{event}ReplaysReturns 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.

socialCasinoSocial / sweepstakes wording.
disabledTurbo, disabledSuperTurboHide the speed controls.
disabledAutoplayNo autoplay.
disabledBuyFeatureHide the bonus buys.
disabledSlamstop, disabledSpacebar, disabledFullscreenRemove those inputs.
displayRTP, displayNetPosition, displaySessionTimerShow RTP, net position or a session timer.
minimumRoundDurationNever finish a round faster than this.

What we hand over for Stake Engine

MathGame code in the math SDK, publish files (books + lookup tables) for every bet mode, stats per mode.
Front-endA static build ready to upload, plus the source.
ReviewGame details for reviewers: rules, features, bet modes, RTP, max win.
QAA play-money demo that runs the real client against a local RGS stand-in with a subset of the real books, replays included.
Math

Numbers you can re-run.

What the math pack contains and the formulas behind our Originals.

Math deliverables

DeliverableFormatWhat it tells you
Par sheetSpreadsheetPaytable, reel strips or weights, RTP split by base game and features.
Simulation reportPDF / MarkdownRTP, hit rate, feature frequency, max-win frequency, standard deviation and win distribution, per bet mode.
Simulation codePythonRe-run it yourself. Same seed, same numbers.
Reels / booksYour platform's formatWhat the game server actually reads.
Rules textJSON stringsRTP 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.

ModeCostRTPMax win
Base game1×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, limboP(result reaches x) = 0.99 ÷ x
Dicemultiplier = 99 ÷ win chance (%)
Minespayout after k gems with m mines = 0.99 × C(25,k) ÷ C(25−m,k)
Hi-Lopayout per guess = 0.99 ÷ chance of the guess
Towerpayout after f floors = 0.99 × (doors ÷ safe doors)f
Coin flippayout after n correct calls = 0.99 × 2n
Wheelthe S segment multipliers add up to 0.99 × S, so every wheel returns exactly 99%
Kenoeach of the 30 paytables solved so Σ P(hits) × pay = 0.99
Plinkopaytables scaled to 99% before display rounding
Blackjack0.44% edge with perfect basic strategy (6 decks, dealer stands on soft 17, 3:2)
Video poker9/6 Jacks or Better: 99.54% at 5 coins with optimal holds
RouletteEuropean single zero: every bet pays 36 ÷ numbers covered, so 36/37 = 97.30%
Delivery

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 list

Handover checklist

BuildDeployable build, tested on the agreed browser matrix.
SourceRepository with history, build instructions in the README.
MathReport per mode + the code to reproduce it.
AssetsSources for every image and sound, with a licence list.
DocsRules, integration notes, known limits.
CallA walkthrough with your team, recorded if you like.
Landings

Static, fast, editable.

Pages that load before the visitor changes their mind, and that you can edit without calling us.

Page stack

CodeStatic HTML, one CSS file, a small vanilla JS file. No framework, no page builder.
ImagesWebP, sized for the slot they fill; video only where it earns its weight.
FontsOne or two families, or the system stack when speed matters most.
FormsOnly 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.

Hosting

Your domain, your hostWe send a zip. Upload it to any static host, CDN or server.
Our setupWe put it on a fast CDN and you point a (sub)domain at it with a CNAME. You still own the files.
Tracker-hostedWorks as a lander inside Keitaro, Binom and similar: it's just static files.

Geo & language swap

HowOne 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 swapsLanguage, currency, bonus wording, T&Cs, licence and RG lines, payment logos.
What never swapsWhat a reviewer sees versus a user in the same market. That would be cloaking.

Editing guide (included)

Offer linkOne place at the top of the config. Every button reads it.
Bonus text & termsPlain text in the same config, per market.
ImagesSwap the file, keep the name and size.
Legal linesPer market, next to the bonus text.
What not to touchMarked 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 guide
Tracking

Every 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 … sub5Your campaign, creative, placement breakdown.
utm_source, utm_medium, utm_campaign, utm_content, utm_termAnalytics attribution.
gclid, fbclid, ttclidAd-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

SupportedMeta, TikTok, Google tag (GA4 / Ads) and others on request.
ConversionsFired by your operator or network server to server (postback). The landing page only records visits and clicks.
ConsentA consent banner where the market requires one, with tags waiting for consent.
WeightEvery tag costs speed; we add the ones you'll actually use.
Playable ads

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

FileOne HTML file. Images, sound and code inlined; no external requests.
Size limitTypically 2–5 MB depending on the network; some ask for less. Industry range. Always check each network's current spec.
OrientationPortrait and landscape, resizes live.
LengthA few seconds of play, then the end card. Typical: well under a minute.
SoundStarts muted; on after the first tap.
Call to actionThrough MRAID (mraid.open) or the network's own method; never a raw redirect.
BehaviourNo 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();
Chip asleep on the job

Nothing for .

No spec blocks matched, so Chip took a nap. Try “MRAID”, “postback”, “Safari” or “RGS”.

Ask a human

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.