/itch-publish
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
$ npx -y skills add gamedev-skills/awesome-gamedev-agent-skills --skill itch-publish --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/itch-publish
Context preview
The summary Claude sees to decide when to auto-load this skill.
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
SKILL.md
itch-publish.SKILL.mdname: 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
1. **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). 2. **Install butler and log in.** Download from `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. 3. **Prepare a portable build folder** — the exact files a player runs, nothing extra. Push a **folder** (or a single `.zip` *of* that folder), **not an installer** and **not a pre-compressed archive of archives** (hurts patching; see Pitfalls). 4. **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. 5. **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*. 6. **Version your builds** (optional but recommended): `--userversion 1.2.0` or `--userversion-file build.txt` so you control the version string players and the update API see. 7. **Update later** by pushing to the *same* channel again. Use `butler status <user>/<game>` to see channels/builds and `butler push-preview` to 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-unzip` only 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.
- **`--hidden` on an existing channel errors.** It only applies when the push *creates* a new
channel. Unhide later from *Edit game*.
- **Channel typos make duplicate slots.** `windows` and `win-final` are different channels and
create separate d
Read more
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
1. **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). 2. **Install butler and log in.** Download from `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. 3. **Prepare a portable build folder** — the exact files a player runs, nothing extra. Push a **folder** (or a single `.zip` *of* that folder), **not an installer** and **not a pre-compressed archive of archives** (hurts patching; see Pitfalls). 4. **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. 5. **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*. 6. **Version your builds** (optional but recommended): `--userversion 1.2.0` or `--userversion-file build.txt` so you control the version string players and the update API see. 7. **Update later** by pushing to the *same* channel again. Use `butler status <user>/<game>` to see channels/builds and `butler push-preview` to 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-unzip` only 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.
- **`--hidden` on an existing channel errors.** It only applies when the push *creates* a new
channel. Unhide later from *Edit game*.
- **Channel typos make duplicate slots.** `windows` and `win-final` are different channels and
create separate d
<img src="docs/assets/banner.png" width="820" alt="awesome-gamedev-agent-skills — game-dev skills for AI coding agents.
Repo: gamedev-skills/awesome-gamedev-agent-skills
Other skills on awesome-gamedev-agent-skills.
- /audio-design
Implement game audio practice — bus/mixer architecture and gain in decibels, ducking (sidechain), adaptive/dynamic music via layering and re-sequencing, SFX variation, and beat synchronization. Engine-neutral. Use when the user mentions audio mixing, audio buses,
Open skill - /camera-systems
Build game cameras that feel good — 2D follow with a deadzone, look-ahead, smoothing, and level-bounds clamping; 3D third-person orbit with collision and first-person look; plus multi-target framing and a shake hook. Engine-neutral techniques that pair with the engine's camera
Open skill - /create-game-assets
Plan, generate, source, normalize, and validate cohesive visual game assets. Use for art direction, style bibles, sprites, tilesets, backgrounds, UI art, icons, textures, concept art, or 3D asset briefs.
Open skill - /dialogue-systems
Build branching dialogue and narrative — a node/choice graph with conditions, variables, and localization hooks — and choose between authoring tools Ink and Yarn Spinner or a custom data-driven runner. Engine-neutral. Use when the user mentions dialogue system, branching
Open skill - /game-ai
Design NPC and enemy decision-making with finite state machines, behavior trees, steering behaviors, and A* pathfinding — engine-neutral algorithms that pair with the detected engine's navigation API. Use when building enemy AI, an FSM or behavior tree, steering/flocking, or
Open skill - /game-feel
Add "juice" and game feel that makes actions satisfying — screen shake, hit-stop/freeze frames, tweened/eased motion, squash & stretch, knockback, and layered audio-visual feedback — as engine-neutral techniques that pair with the detected engine's tween, particle, and camera
Open skill

