Publishing

Third-party games are submitted as a zip build on the "Submit a game" page (/platform/submit/) and published to instfun.games after review. This page covers eligibility, packaging requirements, metadata format, the upload flow and review rules.

Eligibility

  • You need a platform account with a bound email. The submit page uses your on-device SDK guest identity; if no email is bound, the page guides you through binding first (see the Integration guide).
  • Uploading requires connectivity; without a bound email the server returns EMAIL_REQUIRED.
  • Each account may upload at most 2 times per UTC day; exceeding it returns RATE_LIMITED (the page shows the remaining quota; quota is consumed after all validations pass and is not refunded on failure).
  • The same gameId cannot be submitted again while a pending or approved submission exists (GAME_ID_CONFLICT).

Package requirements

Zip layout (files at the root; do not nest them one level deeper):

my-game.zip
├── index.html          # game entry
├── game-info.json      # metadata (required)
├── thumbnail.png       # cover image, short side at least 512px
└── assets/...          # other static assets
RequirementDescription
Entry fileindex.html must be at the zip root and open directly under the hosted path
Metadatagame-info.json must be at the zip root, UTF-8 encoded, valid JSON, no larger than 2MB
Cover imagethumbnail.png, at least 512px on the short side
File typesStatic files only; no server-side code, executables or runtime installation
SizeThe zip must not exceed 30MB
Asset referencesUse relative paths; do not rely on external CDNs or absolute root paths (games are hosted at instfun.games/play/{gameId}/)
RuntimeRuns in the browser; there is no access to Node.js or other local runtimes

game-info.json fields

Start from the official template and fill in at least the default locale:

{
  "gameId": "my-game",
  "defaultLocale": "en",
  "locales": {
    "en": {
      "name": "My Game",
      "description": "One sentence about your game.",
      "intro": "A short paragraph describing the core loop.",
      "howToPlay": ["Step one", "Step two", "Step three"],
      "controls": "Touch: tap. Keyboard: arrows and space.",
      "genres": ["Puzzle"]
    },
    "zh": {
      "name": "我的游戏",
      "description": "一句话介绍你的游戏。",
      "intro": "一段话描述核心玩法。",
      "howToPlay": ["第一步", "第二步", "第三步"],
      "controls": "触屏:点按。键盘:方向键与空格。",
      "genres": ["益智"]
    }
  }
}
FieldRequiredDescription
gameIdYesUnique game identifier matching ^[a-z0-9][a-z0-9-]{1,63}$ (lowercase letters, digits, hyphens, 2–64 chars). Instfun.init({ gameId }) must use the same value
defaultLocaleYesDefault locale code; must exist in locales
localesYesMap of locale codes to copy objects, at least one locale. Covering the site's 8 locales is recommended: en, es, de, fr, ru, ja, ko, zh
locales.{locale}.nameYes (for the default locale)Game name
locales.{locale}.descriptionRecommendedOne-sentence summary used in listings
locales.{locale}.introRecommendedGameplay description paragraph
locales.{locale}.howToPlayRecommendedArray of getting-started steps
locales.{locale}.controlsRecommendedControl instructions
locales.{locale}.genresRecommendedGenre tags (for example Puzzle); the server merges and dedupes them across locales

The server only parses and validates game-info.json; it does not unpack or execute other files in the package.

Upload steps

  1. Open the Submit page and make sure your account has a bound email; check the remaining daily quota.
  2. Drag the zip into the upload area or choose a file; the page pre-checks the extension and size (it warns above 29MB).
  3. Click "Submit for review" and watch the progress indicator.
  4. The server validates the email, size, zip format, game-info.json fields and gameId uniqueness in order, then returns the submission record and the updated quota.
  5. Track status (pending / approved / rejected) and submission time in the "My submissions" list.

Review and publishing

  • A submission starts as "pending review"; the team manually checks content and playability.
  • Approved games are published to instfun.games by the platform; developers do not deploy anything themselves. Placement and display information are generated from the metadata.
  • This flow does not yet support resubmission after rejection, multiple versions, or automatic publishing. Rejected submissions are kept; you may fix and upload again, subject to the 2-per-day quota.
  • Keep the build and source revision that can reproduce the submission; they may be needed during review or troubleshooting.

Common rejection reasons

ReasonError / symptomWhat to do
No bound emailEMAIL_REQUIRED(403)Bind an email before uploading
File over 30MBPAYLOAD_TOO_LARGE(413)Compress assets, remove unused files, upload again
Not a zip or a corrupt zipINVALID_PACKAGE(422), reason magic / unzipRepackage and verify the extension and file integrity
Missing root game-info.jsonINVALID_PACKAGE(422), reason missing_manifestPut game-info.json at the zip root
Invalid or incomplete game-info.jsonINVALID_PACKAGE(422), reason bad_manifestFix gameId, defaultLocale, locales against the template; ensure valid JSON
gameId conflicts with an existing submissionGAME_ID_CONFLICT(409)Choose another gameId or wait for the existing submission to be processed
More than 2 uploads in a dayRATE_LIMITED(429)Try again the next day; do not retry automatically
Missing index.html or a non-opening entryManual review rejectionVerify the root entry file and relative asset paths
Missing cover or too smallManual review rejectionProvide a thumbnail.png at least 512px on the short side
Runtime errors or a blank screenManual review rejectionOpen the unzipped index.html in a browser to check
Requires a server or external APIsManual review rejectionSubmit purely static front-end games; the platform provides no custom backend
Infringing or disallowed contentManual review rejectionMake sure assets and content are compliant