Submission Guidelines
Read this before you upload a game. Items marked Required are checked automatically: if one fails, the upload cannot be submitted until you fix it and upload again.
At a glance
| Level | What it covers |
|---|---|
| Required | Chinese + English that follows the site language; an index.html entry; no security violations; no prohibited content; allowed file types; up to 100MB; a cover; a specific version note |
| Warning | English-only games that ignore the site language; images over 2MB each or 40MB in total; over 150MB unpacked; files over 30MB; external resources; eval; save keys without a prefix |
| Tip | Missing viewport or <title>; no level events; description length |
1. Package
- Upload an
index.html, or a zip / 7z / rar that containsindex.html, up to 100MB. - Unpacked: up to 300MB, 10,000 files and 6 folder levels. We recommend under 150MB, with no single file over 30MB.
- Static web files only (HTML, JS, CSS, images, audio, fonts, JSON, WASM). Executables, server scripts and nested archives are rejected.
- Put every asset in the package and use relative paths. Do not embed other websites in an iframe, and avoid external CDNs.
- Add a viewport meta tag and a
<title>. The game should work on a phone in portrait without scrolling.
2. Security (required)
These are rejected: obfuscated code, service workers, crypto miners, password fields, reading
document.cookie, clipboard access, embedded keys or API keys, prompt injection, and access to
parent. / top. / opener.. Use postMessage to talk to the platform.
3. Chinese / English, linked to the site (required)
- Everything a player can read needs both Chinese and English. That includes buttons, HUD, hints, results,
alert, text drawn on a canvas, titles, placeholders, and level or item names. - The platform decides the language. Read it when the game starts. The browser language or an in-game button alone is not enough.
- When a player switches the site language, the platform reloads the game with the new language. Read the language once at startup, and keep progress in saves (section 4).
| Channel | Value |
|---|---|
window.ZJ.lang | "zh" or "en". It is injected at the top of <head>, so your first script can read it. |
?lang= in the URL | en for English; no parameter means Chinese. Use it to test the game on its own. |
Put this at the top of your first script:
const LANG_EN = (() => {
try {
return (window.ZJ && ZJ.lang === "en") || new URLSearchParams(location.search).get("lang") === "en";
} catch (e) { return false; }
})();
const TR = (zh, en) => (LANG_EN ? en : zh);
if (LANG_EN) document.documentElement.lang = "en";
// in code: TR("游戏结束", "Game over")
// in HTML: <span data-en="Start">开始</span>
if (LANG_EN) document.querySelectorAll("[data-en]").forEach((e) => { e.textContent = e.dataset.en; });
The check fails if the game has Chinese text and never reads ZJ.lang or ?lang=.
After uploading, use Play in English mode on the check report to play the game in English before you submit.
4. Saves and storage
- Save progress with
localStorageorIndexedDB. The platform syncs it to the player's cloud save automatically. Do not use cookies or your own network saves. - Prefix every key with your game's own name, for example
starhop:progress. - Do not use keys starting with
pb_,zj-,zjsave:oradmin_, and do not uselangortheme. - Cloud save limits per game: 64KB, 200 keys, and key names up to 128 characters. About 60KB of IndexedDB data per game is synced.
- Leaderboards: keep the best score in a key like
starhop:best(a number or a short string).
5. Platform API: window.ZJ
Always check that it exists first, so the game also runs on its own: if (window.ZJ && ZJ.event) …
| API | Use |
|---|---|
ZJ.lang | The current language (section 3). |
ZJ.event("level_clear", n) / ZJ.event("level_fail", n) | Report a cleared or failed level. Recommended for games with levels. |
await ZJ.gate({ level: n }) | Optional break between levels. Continue when the promise resolves. |
6. Images and media
| Item | Requirements |
|---|---|
| Cover (required) | 3:2 landscape, at least 1200×800 (1536×1024 recommended), PNG / JPG / WebP / GIF, up to 5MB. Keep the subject centered and use little text. Generate one with AI or upload and crop. |
| Logo | Square, at least 128×128 (512×512 for partners), PNG / JPG / WebP, up to 2MB. By default it is cut from the cover. |
| Intro video (optional) | MP4 (H.264), up to 8MB and 10 seconds. |
| Images in the package | Up to 2MB each and 40MB in total is recommended. Use WebP for large images. |
7. Text and version notes
- Title: 2–80 characters. Pick 1–3 categories. The description is required; start with 25–120 characters that explain how to play.
- English title and description: write them yourself or use AI translate. We fill in anything left empty during review.
- A first version note is required, and so is a note for every new version. It must have at least 6 characters, and it cannot be just “update”, “bug fix” or “first release”. Say what is new, fixed or changed. Example: Added levels 31–40; fixed level 3 getting stuck.
- While a new version is under review, players keep playing the current one. New versions go through the same checks, including section 3.
8. Self-check before submitting
- I played it in English mode: menus, hints and results are all in English, and the game switches when the site language switches.
- Progress is saved with localStorage / IndexedDB under game-specific key names, and it survives a refresh.
- It plays on a phone in portrait, the first screen needs no scrolling, and no buttons are covered.
- Images are compressed (each ≤ 2MB), and nothing is loaded from other websites.
- The content is original or licensed, with no illegal, gambling, sexual or gory content.
9. Review
Upload, then the automatic check runs. You complete the details and the self-check, then submit. A reviewer then plays the game in both languages before it goes live. If it is not approved, the reason is shown on your game.