← Playdeck

A player for any launcher.

Launch games using a link, embed the player in your website, or deploy your own instance.

Launch URL

/?url=https%3A%2F%2Fexample.com%2Fgame%2F&displayOptions&ratio=16%3A9

Use URLSearchParams to encode values. Options belong to the player query, outside the encoded game URL. /player/ is the direct embed endpoint.

ParameterAccepted values
urlPublic HTTPS game URL
name / imageTitle and HTTPS loading preview
displayOptionsBare flag, true/false, or JSON configuration
ratioauto, 4:3, 16:9, 16:10, 21:9, 1:1
nativeGamepad / forceControllerBoolean flags; native support wins
performancefull, auto, fast, native
toolbarauto or visible
hidePageExtrasBoolean flag
parentOriginExact launcher origin for validated messages

Feed options through game JSON

{
  "name": "Example",
  "description": "Example game",
  "playUrl": "https://example.com/game/",
  "image": "https://example.com/cover.jpg",
  "playerOptions": {
    "displayOptions": true,
    "ratio": "16:9",
    "performance": "auto"
  }
}

Deploy an instance

Extract the source ZIP. Install Node 22 or newer. Cloudflare Pages runs the server proxy; a static file host alone cannot.

npm test
npm run build
npx wrangler pages project create my-playdeck --production-branch main
npx wrangler pages deploy dist --project-name my-playdeck --branch main

Git deployment: build command node scripts/build.mjs, output dist, framework None. Point your launcher at your new instance using its playerUrl configuration.

Embedding

Host the player and launcher on different origins. Set parentOrigin to your launcher origin. Validate event.origin and event.source for player messages. Native gamepad support takes precedence over mapping; URL settings override saved defaults.

The source ZIP includes the full message protocol, deployment guide and MIT license. Each instance stores game downloads and preferences separately. Downloads and saves from the old Timebomb player do not transfer automatically.