# 4. Versioning Branches and Checks Part of [[Publishing to itch.io and Steam]]. Prev: [[3. Steam Apps Depots and SteamPipe]]. Next: [[5. Worked Example Ship a Classroom Build]]. A build you cannot name is a build you cannot support. This part is the agreement between Player Settings, itch, and Steam. ## 4.1 One version string, three places Pick a string (`0.1.0`, `2026.11.10-r14`, whatever the class uses) and put it in: 1. **Player Settings** (product / bundle version) so the running player can display it, and so crash reports have a number. 2. The **README.txt** next to the executable. 3. The **store**: - itch: `butler push … --userversion 0.1.0` (or `--userversion-file`). Official butler docs: itch still orders builds by **upload time**, not by parsing the string as semver - the string is for *humans* and for your support log. - Steam: the build note / description on that SteamPipe build, and the branch you assign it to. If those three disagree, testers will report against the wrong slice. ## 4.2 itch channels as branches Treat channels as release trains: | Channel | Typical use | |---|---| | `windows` | Public (or class-visible) Release player | | `windows-beta` | Testers; still preferably Release, clearly labeled | | a hidden first channel | Instructor review, then unhide or push to `windows` | Do not clobber `windows` with a Development Build. Official `--hidden` only hides a **new** channel (see [[2. itch.io Pages and butler]]). Changing visibility after the fact is an Edit game / page-visibility problem, not a second `--hidden` push. ## 4.3 Steam branches On Steam, **branches** (not channels) point at builds: - `default` - what ordinary customers install. Leave this alone until the slice is actually ready, if you have customers at all. A class project can keep `default` empty or on a known-good build. - A named beta / playtest / `internal` branch - this is where the new depot upload should land first. - Testers opt into that branch in the Steam client (passworded betas exist in Steamworks; confirm the current partner-site steps when you use them). The failure mode this part exists to prevent: SteamPipe **succeeds**, nobody sets the branch, testers install yesterday's build and report "the fix is missing." ## 4.4 Test-install checklist Run this on a machine that is **not** the Editor that produced the build, or at least from a fresh extract of the downloaded artifact: - [ ] The downloaded itch build (or Steam-installed build) starts without the Unity Editor. - [ ] The version in the README, the window / about text if you show one, and the store agree. - [ ] Development Build / profiler hooks are off on the public channel. - [ ] A second platform, if present, is a second itch channel and a second Steam depot. - [ ] Addressable or streaming assets the slice needs are actually in the folder ([[Addressables]]). - [ ] No butler key, `config.vdf`, Steam password, or keystore landed in Git (`git status` and a quick `git log --all -- '*.vdf' '*butler*'` style check). - [ ] [[Profiling and Optimization]] numbers you quoted in a writeup came from a **player** build when you claimed they did, not only from Play Mode. ## 4.5 When CI and stores disagree If GameCI built `0.1.1` but butler pushed `--userversion 0.1.0`, the pipeline is wrong - pass the version as a single workflow input. If Steam's branch still points at build N-1, the partner-site step is missing, not the Unity script. ## 4.6 Exercise Take last week's artifact and this week's, push both to a `windows-beta` channel with distinct `--userversion` values, and write down how a tester can tell them apart from the page and from the README. If you have Steam, do the same on a non-default branch. ## Sources - https://itch.io/docs/butler/pushing.html (`--userversion`, `--hidden`, channels) - https://partner.steamgames.com/doc/sdk/uploading - [[1. Build Profiles]]