Publish a game
Put a browser game online for free and get a link anyone can play.
You don't need an account to publish. To keep a game, sign in and claim it within an hour. Or run rosebud login first, so new games go straight into your account.
No game yet? Clone rosebudai/rosebud-cli and run rosebud publish --directory ./examples/signal-garden.
Publish the build folder
Build your game, then run this from your project's root:
rosebud publish --directory ./dist --title 'Moon Garden' \
--description 'Collect five glowing seeds.'- The title and description are optional. They appear on the game's play page.
- Add
--thumbnail ./cover.pngfor a cover (see Game details). - Already have a ZIP? Use
--zip ./game.zipinstead of--directory.
Don't publish the project root. The CLI keeps its state in .rosebud/ there, and hidden files such as .gitignore can't be uploaded. With no build step, copy the files your game needs into ./dist and publish that.
Open the play_url and play the game. A successful upload means the files were accepted, not that the game works.
If you're signed in with a login that's still waiting for approval, publish fails with login_pending. Approve the login, or run rosebud logout to publish with a claim link instead.
What you can upload
index.htmlat the top level of the build folder.- Text files, anywhere in the build: HTML, JavaScript, CSS and JSON, Markdown notes such as
AGENTS.md, and any other UTF-8 file that isn't media. A text file may have any name the Rosebud editor allows, except hidden names (a leading dot), names of only spaces, and names with< > : " | ? * / \or control characters. A name is at most 255 characters and a path at most 500. - UTF-8 text notices:
.txtfiles (including.TXT) and extensionlessLICENSE,LICENCE,NOTICE,COPYING,COPYRIGHTandAUTHORS. They keep their original names; the media naming rules don't apply to them. Don't remove required notices to make an upload pass. - Media inside
assets/. Names are lowercase letters, numbers, underscores and single hyphens; they start and end with a letter or number, and use dots only for the extension. Media elsewhere is refused withmedia_path, and an empty media file withfile_limit.- Images: PNG, JPEG, WebP and SVG
- Audio: MP3, WAV, OGG and OGA
- Fonts: WOFF, WOFF2, TTF and OTF
- WASM, and GLB and glTF models with their
.binbuffers
Outside assets/, .svg and .gltf files are text. Names are compared in Unicode NFC, so two names that differ only in how an accented letter is stored are one name; keep one, or the upload is refused with duplicate_path.
Limits
| Limit | Size |
|---|---|
| Text files | One ZIP: 10 MiB zipped, 50 MiB unzipped, 500 entries |
| One media file | 19 MiB (media uploads file by file) |
| Whole game | 2,000 files and 1 GiB |
| New media in one publish or update | 128 MiB (release_upload_limit) |
| Image size | 10,000 pixels a side |
--zip archive | All of it, media included: 10 MiB zipped, 50 MiB unzipped, 500 entries |
Files Rosebud already has, with the same path, size and MD5, aren't uploaded again and don't count toward the 128 MiB. Over that, publish with part of the media, then update with the rest. --zip sends your archive as it is, so use --directory for a game with more media than the ZIP limits allow. CLI 0.1.0 sends the whole build as one ZIP under the text-file limits; update to 0.2.0 for bigger games.
Large games can take minutes to upload, because each media file goes up on its own and Rosebud may first check the files it already has.
Rosebud serves your files as they are and doesn't run a build. .DS_Store, Thumbs.db and desktop.ini are skipped, never uploaded and never an error. Other hidden files, symbolic links, dependency folders and unsupported file types are rejected.
Everything you upload is public. Keep credentials and .env files out of the build. Rosebud refuses names ending in .env, credentials, secrets, credentials.json, service-account.json, service_account.json, node_modules and anything containing firebase-adminsdk (excluded_file), and any file that holds a private key.
Hosted games are unlisted: anyone with the link can play, but they don't appear in Rosebud's game listings.
Game details
All of these are optional, for both publish and update:
| Option | Details |
|---|---|
--title | Up to 255 characters. Changing it later keeps the same play link. |
--description | Up to 4,000 characters. |
--thumbnail | A PNG or JPEG gameplay screenshot, at most 2 MiB and 4096 pixels a side. |
Agents can also pass --agent-client (claude-code, codex, cursor, gemini-cli or other) to say which tool published the game.