Required archive layout
Upload a gzip-compressed tar archive.index.html must be at the archive root.
NO_INDEX_HTML.
Limits
A connected agent can read the exact current allowlist from
totem://allowed-extensions. That resource is generated from the same constant as the validator. It is the source of truth for all 79 extensions.
Common browser-game files such as HTML, CSS, JavaScript, JSON, PNG, browser audio, WebAssembly, and the .br and .gz files produced by web game engines are supported. Executables, server scripts, shell scripts, and nested archives are rejected.
The validator also rejects:
- Absolute paths, path traversal, backslashes, empty paths, dotfiles, and
node_modulespaths. - Symlinks, hardlinks, and non-regular files.
- Archives that cannot be read as gzip-compressed tar data.
Game icon
Add a square 512×512 PNG named icon-512.png at the build root — it becomes the game’s icon.- PNG only, not SVG or JPEG.
- Exactly square and 512×512.
- Under 512 KB.
- Keep important artwork inside the center 80% so it remains safe when cropped.
icon-192.png and icon-maskable-512.png. Totem uses a generated fallback when no icon is present.
Engine notes
Unity WebGL
Export a static WebGL build. Keep the generated entry page at the archive root. Include generated.br or .gz payloads when the export uses them.
Godot HTML5
Export for the web and place the exportedindex.html at the archive root. Include every generated JavaScript, WebAssembly, and pack file referenced by that page.
three.js
Build the production site before archiving it. Archive the contents of the output directory, not the directory itself.Emscripten
Include the generated HTML entry page and every JavaScript, WebAssembly, data, and pre-compressed file it references.What Totem adds
After validation, Totem inserts this SDK tag before the closing</body> tag: