Skip to main content
Create a private preview, return its link, and wait for the creator to request submission. Inspect each command’s result before you run the next one.

Install and set the origin

This private build comes from the team. Ask them for the CLI tarball, the SDK package and the internal origin. Install the supplied tarball:
Read the installed version and the commands it supports:
Set OPENGAME_API_URL in each shell that runs the CLI. Without it, the CLI uses opengame.io.
Both packages are private, so npm view has no versions to show. To check that the CLI is new enough, ask the server:
data.current is the installed version, data.minimum is the oldest version the server accepts, and data.behind is true when you need a newer one. API responses other than the sign-in ones also carry the minimum, in the x-opengame-min-cli header. The server sets no minimum for the SDK: use the SDK package the team supplied, and read its README for import paths and APIs. Keep API tokens in the macOS Keychain, an environment variable or standard input. Never put one in source control, a command argument, a log or a reply.

Sign in with the creator

Check for a saved login first:
If whoami exits 3, start a login:
In agent mode, login --json prints a URL and code and exits 3 with login_pending. Relay both to the creator. They open the URL, type the code and press Allow access. You cannot approve their sign-in. After they confirm approval, finish the login:
A saved login exits 0 without another approval.

Deploy a private preview

Run these commands from the game folder. If the folder has no manifest, create one. Use init only in that case. Then fill in description and genre in opengame.json; the description needs at least 40 characters.
init writes "kind": "game" unless you say otherwise. Ask the person whether it is a game, a world, a decomp or a mod. A decomp or a mod is made from someone else’s game, so it names that game, and these two cannot enter the jam:
For an existing game in a new checkout, find the game and link the folder to it before deploying:
Check the build, then deploy:
If the manifest has a build command, deploy runs it and uploads the build output, and check --build checks that fresh output beforehand. deploy --no-build skips the command and uploads build.output as it is. Use it only when the creator says the export is already built and the command cannot run here, never to get past a failing build. Keep .opengame/ so later commands can resume the same upload.

Read the result

--json returns one object with type, ok, findings and notices. A successful command puts its values in data; an error includes its code and message. Use --jsonl for progress events, one object per line, with a result or error as the last event. For a deploy, read these fields: deploy returns once the upload is in, with exit 0 and data.done: false, while the checks run on the server. Give the creator data.deploymentUrl straight away: they can watch the checks there and play the preview when it is ready. To wait for the outcome yourself, run opengame status --watch --json, or deploy with --wait. A ready release has data.state: "ready" and data.done: true. Give the creator its preview link and release ID. opengame deployments --json lists every deploy of the linked game, newest first, with each one’s status, size, who started it and why any stopped. Report a completed preview only after the server result confirms the release is ready.

Fix findings and resume

Act on each finding by its fault, certainty and retry fields: To resume or retry: In JSON or agent mode, upgrade returns upgraded: false and the npm command in data.command for you to run. data.command is null when the server shows no package: if data.next is opengame login, sign in and run upgrade again; otherwise ask the OpenGame team for the release. If it exits 5 with upgrade_untrusted, the server offered a private archive instead of an npm release: ask the OpenGame team for the official @opengamehq/cli release. A plain deploy replaces an expired upload and emits upload_restarted. To replace an expired upload started with --idempotency-key, pass a new key or leave the flag out:
opengame deploy returns once the upload is in. To follow the checks, run status --watch, which watches for up to 5 minutes; set --timeout <seconds> for short tool calls. To block on the outcome in one command, deploy with --wait:
Keep retry commands bounded. If the same platform failure repeats, return its code, evidence and suggested next action to the creator. If you cannot proceed, report the command, the error and the findings with their evidence to the creator.

Submit only on request

A deploy makes a private preview of one release, and only the creator’s account can open it. opengame submit sends a release to review, and the game goes live when a reviewer approves and publishes it. Submit only when the creator asks, and use the exact releaseId they played.
Without --no-wait, submit waits up to 5 minutes for the creator to certify, which is longer than a short tool call. OpenGame sets where submissions go. When that is a jam, the submission is also the creator’s entry in it: fetch the jam’s fields with opengame jams <slug> --json, then pass the creator’s track, models and sponsor evidence as flags. A missing answer exits 2 and names the required flag. When there is no jam, opengame jams says so, and the release goes to review without jam answers. You can leave out --jam and --no-jam. A --jam slug that names another jam exits 2, and so does --no-jam while a jam is taking submissions. The creator supplies the factual and legal answers. Ask them for those facts. Read the linked jam rules for eligibility and judging. When the result’s data.state is needs_certification, the creator has one step left. Give them the page in data.certifyUrl, which the CLI also prints as a certify_required notice. On that page, in their own browser, they confirm they have the rights to the game.

Package for the supported runtime

OpenGame accepts static browser exports from any engine for desktop play. The export needs index.html at the build root and must be at most 200 MiB zipped. Bundle its scripts and assets. Players can read every file in a browser game, so keep credentials and personal data out of the bundle. At runtime the game may reach its own origin, https://api.opengame.gg, wss://rtc.opengame.gg and https://rtc.opengame.gg, and any other https: or wss: host: an AI model, a third-party API, the creator’s own server or a CDN. Each call goes from the player’s browser, so that host gets the player’s IP address. Keep API keys on the creator’s server and have the game call it. The review sandbox has no internet, so the game must draw its first frame without its server. A game may not take payments, use crypto, make players create an account, sign in or give an email address, show ads, or carry ad pixels or session recording. OpenGame blocks common services in these categories before upload, and a reviewer plays every game. What a game may not do has the rules. The server runs the local checks again. Approval needs the server checks and a review.

Engines

Named engine signatures, including signatures checked only against source: Babylon.js, Cocos Creator, Construct, ct.js, Defold, .NET, Emscripten, Excalibur, Flutter, GameMaker, GB Studio, GDevelop, Go, Godot, Haxe, js-dos, Kaigen, KAPLAY, LittleJS, LÖVE (love.js), melonJS, Phaser, PixiJS, PlayCanvas, Pyodide, React, Ren’Py, Ruffle, Rust, Solar2D, Swift, Three.js, Unity, wasmoon. Recognised by the runtime they ship: Bevy (Rust), C (Emscripten), C++ (Emscripten), C# (.NET), Ebiten (Go), Flame (Flutter), Heaps.io (Haxe), KNI (.NET), Lua (wasmoon), MonoGame (.NET), Python (Pyodide), raylib (Emscripten), Stride (.NET). An unrecognised engine can upload as a custom static browser export, subject to the same file, scan and runtime checks. Run opengame init . --engine <id> to record an engine’s export folder. opengame help --json lists the IDs, and init prints the export steps for the one you choose. Read that engine’s guide in the engine overview before choosing export settings. No engine has a complete hosting and services acceptance result yet. Describe upload eligibility separately from tested integration, and play the private preview before saying the game works.

Find the right reference

The engine support page links the available export guides and shows what has been tested. Unreal has no dedicated guide or export detection in this release. Its static browser exports can still enter as custom exports and must pass the same checks as any other engine.

Read this guide as Markdown

This full guide is private. Read it through the docs organisation, the supplied packages, or authenticated GET /api/v1/docs/for-agents on the approved internal origin. That endpoint needs an active creator browser session or token, the same ones the creator API uses. The public https://opengame.io/for-agents.md and llms.txt contain onboarding, rules and public links only. On a verified private docs host, sign in to your Mintlify organisation before using a page’s .md version.