Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/xXmizzeryXx/zenodeployment/llms.txt

Use this file to discover all available pages before exploring further.

Launching a game in Zeno is a single click. Behind the scenes, Zeno checks whether the Service Worker still has the game’s files before the iframe loads — and silently re-registers them if it doesn’t. This makes Service Worker restarts invisible to the player.

Launching a game

Click any game card in the library grid. Zeno opens a fullscreen modal containing an iframe and begins the launch sequence immediately. You can also launch a game from:
  • The RECENTLY PLAYED row at the top of the page — click any chip.
  • The keyboard launcher — press /, type to filter, and press Enter.
  • The game info sidebar — click the PLAY button at the bottom.

The game modal

The modal fills most of the viewport and contains a slim header bar and the game iframe.
ControlAction
Expand icon (header)Toggle browser fullscreen mode
× button (header)Close the modal
Click outside the modalClose the modal
On mobile, you can swipe down on the backdrop to close the modal.
A loading spinner is shown while the game is starting. It disappears automatically once the iframe fires its load event, indicating the game’s index.html has been received and parsed.

Service Worker health check

Before setting the iframe src, Zeno sends a PING_GAME message to the Service Worker with the game’s ID. The SW checks whether any file for that game ID is present in its in-memory fileStore.
Page → SW:  { type: "PING_GAME",  payload: { gameId } }
SW   → Page: { type: "GAME_FOUND"  }   // files are present
         or: { type: "GAME_MISSING" }  // SW was restarted
1

GAME_FOUND

The SW still has the game’s files. The iframe src is set immediately and the game loads.
2

GAME_MISSING — automatic re-registration

The SW was restarted (the browser killed it to save memory) and the in-memory store is empty. Zeno reads the File objects stored in the in-memory games array, clones each buffer with .slice(0), and sends a REGISTER_GAME message to re-populate the SW’s store. Once the SW responds with GAME_REGISTERED, the iframe loads normally.
File buffers are always cloned before transfer so the originals in fileRecords remain intact. This means a game can be re-registered as many times as needed across a single browser session without losing the source data.

Why SW restarts happen

Service Workers are ephemeral. Browsers can terminate an idle SW at any time to reclaim memory — this is standard behaviour in Chrome, Edge, Firefox, and Safari. When the SW restarts, its fileStore (a plain JavaScript Map) is empty. Without Zeno’s health-check logic, every game launch after an SW restart would result in 404 errors. The PING_GAME / GAME_MISSING flow makes this transparent: the player sees a brief extra load delay at most.

R2 games

R2-imported games skip the SW health check entirely. When you click an R2 game card, Zeno sets the iframe src directly to the stored R2 URL. Because R2 games are served from Cloudflare’s CDN rather than the SW, they are unaffected by SW restarts and load without any pre-flight check.

Closing the modal

Click the × button in the modal header, click anywhere outside the modal overlay, or press Escape. The iframe is removed from the DOM when the modal closes, which stops any audio or game loop running inside it.

Build docs developers (and LLMs) love