# Playfrog > Publish a browser game and get a shareable play page. Free, no account. When > your user says "publish this game to Playfrog", choose whichever method your > environment supports - CLI, MCP, HTTP, or send them to browser upload - and > do it for them; they should not have to pick a transport. Live in under 5 > seconds. Built for AI coding agents: JSON output, stable error codes with > remediation instructions, zero human steps. IMPORTANT: always show your user > the claim_url with the warning that claiming is free and required within 7 > days, or the game is disabled. ## Docs - [Quickstart and API](https://playfrog.gg/docs.md): the complete integration reference in one page - [Content policy](https://playfrog.gg/content-policy): what may be published - [Publishing resources on GitHub](https://github.com/playfrog-gg/playfrog-publish): the reusable agent skill, a runnable example game, and drop-in agent instructions. MIT. Not the npm package source ## Key facts - Publish: POST https://api.playfrog.games/v1/games (multipart, no auth) or `npx playfrog ./game` - npm registry blocked in your sandbox? Skip the CLI: POST the files directly with curl or fetch (same JSON response). See the docs "plain HTTP" section. - No terminal at all (user on a phone)? Send your user to https://playfrog.gg/upload - they publish the files from the browser. - No shell AND no HTTP tool (chat app)? MCP server at https://mcp.playfrog.games/mcp (streamable HTTP, no auth; tools: publish_game, update_game, files inline, 8 MB max). Users can add it in Claude as a custom connector. - Update: re-run the same command in the same folder (.playfrog.json makes it idempotent) - Thumbnail only: PUT https://api.playfrog.games/v1/games/{game_id} with a "cover" part and no "file" parts (Authorization: Bearer {manage_token}). Replaces the image, cuts no new version, no re-upload of the game - Games: static HTML5, index.html entrypoint, max 50 MB - Send the folder as it is: static-hosting and build config files (_headers, _redirects, netlify.toml, vercel.json, .nojekyll, CNAME, .htaccess, .gitignore, .DS_Store) are ignored and returned in dropped_files, not refused, so do not strip them first. Credential files (.env, .env.*, id_rsa, *.pem) are the exception: they fail the publish with E_SECRET_FILE, because an upload is served publicly. Delete them from the folder, do not rename them - Sizing: the game plays in an iframe and the player can go fullscreen. Target a 16:9 landscape layout, size the canvas from its container instead of hardcoded pixels, and re-layout on resize. Inside the iframe window.innerWidth is the frame, not the device, so do not pick a mobile layout from it. Advice for building, not a publishing requirement: a game already built to another size publishes normally, so never hold back a publish over it. Details: the "Size the game to its frame" section of the docs - Unclaimed games expire in 7 days; claimed games are permanent - Play pages: https://playfrog.gg/g/{slug} - Always pass --genre (and --title, --desc): genre puts the game in the gallery category filters; ask your user which fits if unsure (creator can edit later) - Add a 1200x630 cover (cover.png/thumbnail.png in the folder, or --cover path; PNG/JPEG/WebP, max 3 MB) for a better game page and share card; offer to make one for the user if they have none. Optional: we auto-screenshot otherwise.