?Publish

Docs

FROM PROJECT TO PLAY

Choose your route to publish

All three publishing routes support leaderboards and cloud saves. Get the web game running, then connect platform features.

01

Already hosted: share a URL

For web games hosted on GitHub Pages, itch.io, Vercel, Netlify or another site.

  1. Open Publish a game, choose the URL option, enter the directly playable HTTPS address and check it.
  2. Ensure the URL runs in the browser and permits embedding. Add a title, cover, description and orientation, then preview and publish.
  3. Add integration code to the original game and deploy it to your hosting service. Return to the platform player to verify it.

Use the playable game page, not a repository homepage or a page requiring another sign-in.

Publish
02

GitHub repository: cloud build

For games hosted in GitHub repositories that the platform will build and deploy.

  1. Choose GitHub repository, connect GitHub and authorize that repository, then select its URL, branch and build configuration.
  2. Static games need a runnable entry point. Projects with a build step need the correct root, build command and output directory. Follow the publishing form for Godot web exports.
  3. Push later changes to the repository, then use More → New version on the game’s row in Content and choose the branch or tag.

Pushing does not build automatically; trigger it yourself.

Publish
03

Local project: MCP / AI coding tools

For static web games developed locally with Codex, Claude Code or similar tools. A GitHub repository is optional.

  1. Install the 1GP publisher MCP using its setup guide. Sign in and authorize your account in the browser on first connection.
  2. Ask AI to build locally and upload only the required web artifacts, excluding secrets, dependency folders and unrelated source files.
  3. After publishing, choose the game here and copy its integration materials. Update the same work after integrating, then test it in the platform player.
MCP installation & usage ↗

The developer center generates integration materials. Copying them does not modify your repository or trigger a build.

Let AI prepare your store page

Copy the prompt below and give it to Codex or Claude Code in your game project. It reads the code, plays the game and writes the title, description and tags in Chinese and English, the category and maker info into a 1gp-kit folder, with a cover and screenshots, and a preview video when it can make a good one. Then click Import store kit when publishing or editing, pick that folder, review and save. Imported screenshots are added after the existing ones, so tidy them up afterwards.

Game language

The platform opens your game with ?lang= in the address: the language the player chose on the site (zh, en, ja, ko, es). If your game has more than one language, read ?lang= first and the browser's language only after that. With the SDK, call AIWanna.lang() (the SDK's older name AIMadeGames still works). Games with one language need no change.

Read ?lang= first, then the browser

Replace strings with your own dictionaries; fall back to English or your original language.

<script src="https://www.ai-made.games/sdk/v1.js"></script>
<script>
  const strings = { zh: { start: '开始' }, en: { start: 'Start' }, ja: { start: 'スタート' } };
  // ?lang= from the platform, otherwise the browser's language ('zh', 'en', 'ja'…).
  const lang = window.AIWanna ? AIWanna.lang()
    : new URLSearchParams(location.search).get('lang') || navigator.language.slice(0, 2);
  const text = strings[lang] || strings[lang.split('-')[0]] || strings.en;
  document.querySelector('#start').textContent = text.start;
</script>

Languages: in-game text

To have the text inside your game follow the player's language: show text by key (for example t('start')) and keep one file in your game's own language. Upload it in the developer center: edit the game → In-game text translation. The platform translates it into every language with Claude and fills in entries again when the original changes; when platform translation is not on, publish with the MCP and let your AI translate every language at once. Entries you edited by hand are never overwritten; when the original changes, older translations are marked out of date and missing entries show the original.

  • On open, use ?lang= first and the browser's language after that; an in-game language switch is fine.
  • Leave room: German and Russian often run twice as long as Chinese. Do not fix button widths.
  • Pixel fonts often cover only Latin letters; switch to a font that has CJK and Cyrillic for those languages.
  • Placeholders such as {0} and {name} are kept as they are.
  • Put the game's name under the key meta.title: uploading a language file fills in names the platform does not have yet; a different existing name is only reported, never replaced.
  • Save keys and parameters (for example {key: "found_item", params: {item: "sword"}}), not translated text, so events and logs in progress follow the player to another language.
  • For text with a length limit, put <file>.limits.json next to the original (zh.limits.json: {"start": 12, "*": 40}), in display width: Chinese, Japanese and Korean characters count 2, others 1. The MCP's validate_game_text checks lengths, placeholders, line breaks and fonts.
  • Fonts must draw every language: Korean needs Noto Sans KR, Japanese kana a Japanese font (Noto Sans JP), Traditional Chinese Noto Sans TC; many handwritten and pixel Chinese fonts are Simplified only. Load only the font each language needs (a subset).
Load translations with the SDK

Translations are at /i18n/<game>/<lang>.json; a failed request or a missing key falls back to original.

<script src="https://www.ai-made.games/sdk/v1.js"></script>
<script>
  // The game's own language file; keep the same keys in every language.
  const original = { start: '开始游戏', score: '得分 {0}' };
  AIWanna.i18n({ game: 'your-game-slug', original, originalLang: 'zh' }).then(t => {
    document.querySelector('#start').textContent = t('start');
    document.querySelector('#score').textContent = t('score', { 0: 120 });
  });
</script>

Stuck? Send us the error and your prompt here.