itch-publish
gamedev-skills/awesome-gamedev-agent-skills
Publish and update game builds on itch.io using butler CLI with efficient delta uploads.
What is itch-publish?
Automate game publishing to itch.io by creating project pages and uploading builds via butler's command-line tool. Use this when shipping jam entries, demos, or release builds to itch.io, managing multiple platform channels (Windows/macOS/Linux/HTML5), or keeping builds updated with minimal bandwidth.
- Upload game builds to itch.io channels with `butler push`, uploading only changed files on subsequent pushes
- Auto-tag platforms (Windows, macOS, Linux, Android) based on channel naming conventions
- Version builds explicitly with `--userversion` or version files instead of auto-incrementing integers
- Preview uploads with `butler push-preview` and `--dry-run` before committing changes
- Filter files during upload with `--ignore` patterns without modifying source folders
- Hide new channels until ready with `--hidden` flag on first push
How to install itch-publish
npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill itch-publish- butler CLI tool installed and added to PATH (download from itchio.itch.io/butler)
- itch.io account with permission to create/edit game pages
- Portable build folder ready (not installers or pre-compressed archives)
- For CI/CD: BUTLER_API_KEY generated from itch.io API keys page
How to use itch-publish
- 1.Download and install butler from itchio.itch.io/butler, then add it to your system PATH
- 2.Run `butler login` to authorize your machine (opens browser for authentication)
- 3.Create a new game project page at itch.io/game/new and set Kind (Downloadable for native, HTML for web)
- 4.Prepare a portable build folder with all files players need to run the game
- 5.Run `butler push ./build/folder username/game:channel` to upload to your chosen channel
- 6.Verify platform tags on the Edit game page match your build (Windows, macOS, Linux, etc.)
- 7.For browser games: set page Kind to HTML and tag the channel as playable in browser
- 8.Run `butler push` again to the same channel whenever you have updates; only changed files upload
Use cases
- Ship a game jam entry to itch.io with platform-specific channels for Windows, macOS, and Linux builds
- Update an existing itch.io game page with a new build, uploading only the changed files to save bandwidth
- Publish an HTML5 browser game to itch.io and configure it as playable in-browser
- Set up CI/CD automation to push builds to itch.io on every release using BUTLER_API_KEY
- Manage multiple game versions across different channels (e.g., windows-beta, osx-demo, linux-stable)
- Game developers publishing indie games to itch.io
- Game jam participants uploading entries before deadlines
- Teams automating game releases via CI/CD pipelines
- Developers managing multiple platform builds and update channels
itch-publish FAQ
Push a folder or a .zip of that folder. butler auto-unzips single-file zips and uploads the contents. Never push pre-compressed archives or archives of archives, as they break delta patching and make updates huge.
Use `butler push ./build username/game:channel --userversion 1.2.0` or `--userversion-file build.txt` to set an explicit version string instead of itch's auto-incrementing integer.
No. itch.io patches portable builds; installers defeat patching and the itch app's auto-update. Extract and push the runnable folder instead.
Two steps are required: set the page Kind to HTML, then tag the channel as playable in browser on the Edit game page. Channel naming alone does not trigger this.
Run `butler push-preview ./build username/game:channel` to see NEW/MODIFIED/DELETED/SAME files, or use `--dry-run` flag to simulate the push without uploading.
Full instructions (SKILL.md)
Source of truth, from gamedev-skills/awesome-gamedev-agent-skills.
name: itch-publish description: > Publish and update a game on itch.io: create the project page and upload builds with the butler CLI (butler push) to named channels. Use for itch.io publishing, butler push, channel naming for Windows/macOS/Linux/HTML5, versioning uploads, or shipping a jam or release build to itch.io.
itch.io Publish (butler)
Get a build onto an itch.io page and keep it updated. The page is created in the browser; all
uploads go through butler, itch.io's command-line tool, with one command you'll use
forever: butler push. butler diffs against the previous build and uploads only what
changed. Deep CI/CD and flag detail lives in references/butler-ci.md.
When to use
- Use when creating/updating an itch.io project page, installing or logging in to butler,
uploading a build with
butler push, choosing channel names, versioning uploads, or shipping a jam/demo/release build to itch.io. - Triggers:
butler push,butler login, channels,.itch.toml, "publish on itch", "upload to itch".
When not to use: publishing on Steam (use steam-publish); jam scope/planning (use
game-jam — this skill is only the upload mechanics); building the game itself (engine
skills).
Core workflow
- Create the project page at
itch.io/game/new. Set the Kind of project: keep Downloadable for native builds, or choose HTML for a browser-playable game (this is required for web builds — see Pitfalls). Set pricing/visibility (Draft until ready). - Install butler and log in. Download from
itchio.itch.io/butler, add it toPATH, thenbutler login(opens a browser to authorize). Verify withbutler version. For CI, useBUTLER_API_KEYinstead — see the reference. - Prepare a portable build folder — the exact files a player runs, nothing extra. Push a
folder (or a single
.zipof that folder), not an installer and not a pre-compressed archive of archives (hurts patching; see Pitfalls). - Push to a channel:
butler push <dir> <user>/<game>:<channel>. The channel name determines the platform tag (see Patterns). The first push uploads everything; later pushes to the same channel upload only the diff. - Set platform/HTML tags on the Edit game page if a channel wasn't auto-tagged correctly, then Save. For browser games also flip the page to HTML and tag the channel playable in browser.
- Version your builds (optional but recommended):
--userversion 1.2.0or--userversion-file build.txtso you control the version string players and the update API see. - Update later by pushing to the same channel again. Use
butler status <user>/<game>to see channels/builds andbutler push-previewto see what a push would change before sending it.
Patterns
1. The one command you need — butler push
# butler push <directory-or-zip> <user>/<game>:<channel>
butler push ./build/windows leafy/my-game:windows
butler push ./build/mac leafy/my-game:osx
butler push ./build/linux leafy/my-game:linux
butler push ./web leafy/my-game:html # browser build (also set page Kind = HTML)
2. Channel naming controls the platform tag (kebab-case, lowercase)
Substring in channel name -> auto-applied tag:
win / windows -> Windows linux -> Linux
mac / osx -> macOS android -> Android
Multiple platforms in one channel are allowed: e.g. a Java jar:
butler push ./jar leafy/my-game:win-linux-mac
Convention: lowercase words separated by dashes (windows-beta, osx-demo, soundtrack).
Tags are only the INITIAL guess — fix them anytime on the Edit game page (then Save).
3. Version, verify, and preview
butler version # print version; confirms install + PATH
butler login # authorize this machine (opens browser)
# Set an explicit version string instead of itch's auto-incrementing integer:
butler push ./build leafy/my-game:windows --userversion 1.2.0
butler push ./build leafy/my-game:windows --userversion-file build_number.txt
butler status leafy/my-game # list channels + latest builds/versions
butler push-preview ./build leafy/my-game:windows # NEW/MODIFIED/DELETED/SAME, uploads nothing
4. First-time, hidden, and filtered pushes
# Hide a brand-new channel from the page until you're ready (NEW channels only):
butler push ./build leafy/my-game:windows-beta --hidden
# Exclude files from the upload without copying the folder (--ignore is repeatable):
butler push ./build leafy/my-game:windows --ignore '*.pdb' --ignore '*.dSYM'
# Preview exactly what would be sent, without sending it:
butler push ./build leafy/my-game:windows --dry-run
Pitfalls
- Pushing an installer. itch.io patches portable builds; an installer (
.exe/.msi) defeats patching and the itch app's auto-update, and may need admin rights players don't have. Push the extracted, runnable folder instead. - Pre-compressed builds. Pushing a heavily compressed archive (or an archive of archives) makes patches huge — a tiny change rewrites the whole compressed blob. Push uncompressed files; itch.io compresses on its side.
- A folder containing only one
.zip. butler auto-unzips it and pushes the contents (to avoid a "zip in a zip"). Pass--no-auto-unziponly if you truly want the zip uploaded as one opaque file. - HTML5 game shows as a download. Two switches are required: set the page Kind to HTML and tag the channel playable in browser on the Edit game page after the first push — neither happens automatically from the channel name.
--hiddenon an existing channel errors. It only applies when the push creates a new channel. Unhide later from Edit game.- Channel typos make duplicate slots.
windowsandwin-finalare different channels and create separate downloads. Decide your channel names up front and reuse them. - 30 GB cap. itch.io rejects builds whose total uncompressed size exceeds 30 GB.
- Secrets in CI logs. A
BUTLER_API_KEYprinted in a public log is compromised — revoke it immediately on the API keys page. See the reference for safe CI usage.
References
- For CI/CD (GitHub Actions/GitLab) with
BUTLER_API_KEY, automated install viabroth, the full flag list, and the update-check API, readreferences/butler-ci.md. - Primary docs: the butler manual —
itch.io/docs/butler(installing, login, pushing).
Related skills
steam-publish— the same game on Steam via SteamPipe (often shipped alongside itch.io).game-jam— most jams are hosted on itch.io; this skill handles the upload step.prototype-fast— share an early prototype on a Draft/restricted itch page for playtesting.
Related skills
More from gamedev-skills/awesome-gamedev-agent-skills and the wider catalog.

level-design
Design playable levels through blockout-to-playable workflow: metrics, pacing, gating, and encounter design.

love2d-core
Set up and debug LÖVE 11.x games: the callback loop, delta-time movement, input, and screen states.

performance-optimization
Measure, find the bottleneck, apply the right fix—CPU pooling/allocation control or GPU batching/draw calls.

phaser-arcade-physics
Add movement and collision to Phaser games with the lightweight Arcade Physics engine.

phaser-core
Set up and debug Phaser 4 games: Game config, Scene lifecycle, asset loading, cameras, and cross-scene communication.

physics-tuning
Tune game physics for stable, responsive motion—fixed timestep, interpolation, CCD, mass/drag, and collision layers.