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.png for a cover (see Game details).
  • Already have a ZIP? Use --zip ./game.zip instead 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.html at 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: .txt files (including .TXT) and extensionless LICENSE, LICENCE, NOTICE, COPYING, COPYRIGHT and AUTHORS. 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 with media_path, and an empty media file with file_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 .bin buffers

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

LimitSize
Text filesOne ZIP: 10 MiB zipped, 50 MiB unzipped, 500 entries
One media file19 MiB (media uploads file by file)
Whole game2,000 files and 1 GiB
New media in one publish or update128 MiB (release_upload_limit)
Image size10,000 pixels a side
--zip archiveAll 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:

OptionDetails
--titleUp to 255 characters. Changing it later keeps the same play link.
--descriptionUp to 4,000 characters.
--thumbnailA 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.

On this page