Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/gamedev-skills-itch-publish/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 68% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 36% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 42% | 0% |
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.
uploading a build with butler push, choosing channel names, versioning uploads, or shipping a jam/demo/release build to itch.io.
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).
itch.io/game/new. Set the Kind of project: keepDownloadable 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).
itchio.itch.io/butler, add it to PATH,then butler login (opens a browser to authorize). Verify with butler version. For CI, use BUTLER_API_KEY instead — see the reference.
folder (or a single .zip of that folder), not an installer and not a pre-compressed archive of archives (hurts patching; see Pitfalls).
butler push <dir> <user>/<game>:<channel>. The channel namedetermines the platform tag (see Patterns). The first push uploads everything; later pushes to the same channel upload only the diff.
correctly, then Save. For browser games also flip the page to HTML and tag the channel playable in browser.
--userversion 1.2.0 or--userversion-file build.txt so you control the version string players and the update API see.
butler status <user>/<game>to see channels/builds and butler push-preview to see what a push would change before sending it.
butler pushbash# 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)
textSubstring 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).
bashbutler 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
bash# 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
.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.
makes patches huge — a tiny change rewrites the whole compressed blob. Push uncompressed files; itch.io compresses on its side.
.zip. butler auto-unzips it and pushes the contents(to avoid a "zip in a zip"). Pass --no-auto-unzip only if you truly want the zip uploaded as one opaque file.
HTML and tag the channel playable in browser on the Edit game page after the first push — neither happens automatically from the channel name.
--hidden on an existing channel errors. It only applies when the push creates a newchannel. Unhide later from Edit game.
windows and win-final are different channels andcreate separate downloads. Decide your channel names up front and reuse them.
BUTLER_API_KEY printed in a public log is compromised — revokeit immediately on the API keys page. See the reference for safe CI usage.
BUTLER_API_KEY, automated install via broth, thefull flag list, and the update-check API, read references/butler-ci.md.
itch.io/docs/butler (installing, login, pushing).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.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 13,191 | 7,017 | -47% | 1 | 1 | 0% | 2,198 | 2,898 | +32% | 0 | 0 | — |
case-01 | fail→pass | 8,620 | 9,813 | +14% | 1 | 1 | 0% | 1,616 | 2,714 | +68% | 0 | 0 | — |
case-02 | pass→pass | 16,046 | 12,219 | -24% | 1 | 1 | 0% | 1,916 | 2,977 | +55% | 0 | 0 | — |
case-03 | pass→pass | 18,396 | 13,056 | -29% | 1 | 1 | 0% | 2,017 | 3,072 | +52% | 0 | 0 | — |
case-04 | pass→pass | 11,423 | 5,720 | -50% | 1 | 1 | 0% | 1,631 | 2,932 | +80% | 0 | 0 | — |
case-05 | fail→pass | 18,495 | 6,937 | -62% | 1 | 1 | 0% | 2,210 | 2,997 | +36% | 0 | 0 | — |
case-06 | pass→pass | 7,778 | 7,413 | -5% | 1 | 1 | 0% | 509 | 2,177 | +328% | 0 | 0 | — |
case-07 | fail→pass | 13,878 | 8,924 | -36% | 1 | 1 | 0% | 1,486 | 2,437 | +64% | 0 | 0 | — |
case-08 | pass→pass | 14,635 | 11,604 | -21% | 1 | 1 | 0% | 1,920 | 2,989 | +56% | 0 | 0 | — |
case-09 | pass→pass | 16,195 | 5,194 | -68% | 1 | 1 | 0% | 1,824 | 2,701 | +48% | 0 | 0 | — |
case-10 | pass→pass | 10,522 | 8,638 | -18% | 1 | 1 | 0% | 1,952 | 3,282 | +68% | 0 | 0 | — |
case-11 | fail→pass | 7,073 | 3,822 | -46% | 1 | 1 | 0% | 1,215 | 2,413 | +99% | 0 | 0 | — |
case-12 | pass→pass | 15,203 | 4,068 | -73% | 1 | 1 | 0% | 1,883 | 2,343 | +24% | 0 | 0 | — |
case-13 | fail→pass | 17,792 | 11,259 | -37% | 1 | 1 | 0% | 1,953 | 2,772 | +42% | 0 | 0 | — |
case-14 | pass→pass | 8,071 | 5,661 | -30% | 1 | 1 | 0% | 1,444 | 2,674 | +85% | 0 | 0 | — |
case-15 | pass→pass | 5,454 | 2,084 | -62% | 1 | 1 | 0% | 903 | 2,096 | +132% | 0 | 0 | — |
case-16 | pass→pass | 7,702 | 2,307 | -70% | 1 | 1 | 0% | 1,355 | 2,140 | +58% | 0 | 0 | — |
case-21 | fail→fail | 20,904 | 20,744 | -1% | 1 | 1 | 0% | 2,843 | 4,584 | +61% | 0 | 0 | — |
case-17 | pass→pass | 5,054 | 2,229 | -56% | 1 | 1 | 0% | 805 | 2,078 | +158% | 0 | 0 | — |
case-18 | pass→pass | 8,295 | 6,521 | -21% | 1 | 1 | 0% | 1,350 | 2,779 | +106% | 0 | 0 | — |
case-19 | pass→pass | 11,261 | 10,021 | -11% | 1 | 1 | 0% | 1,677 | 3,271 | +95% | 0 | 0 | — |
case-20 | pass→pass | 9,968 | 7,098 | -29% | 1 | 1 | 0% | 1,597 | 2,947 | +85% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.