# 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]]