Download
depot / docs / branches

Branches & betas

A surprising number of "how do I get the old version" problems have a one-word answer: the old version is sitting right there as a named branch, and you can pull it by name instead of hunting a manifest ID. But a branch is a pointer, not a snapshot — and knowing the difference between asking for a branch and pinning an exact build is the whole game. Here's how branches work and how DepotDownloader downloads them.

01What a branch actually is

In Steam's plumbing, a branch (the older word is beta; Valve uses both) is a named pointer to a particular build of an app — that is, to a specific set of depot manifests. The default branch is called public: it's the live version everyone gets unless they choose otherwise. Developers create additional branches for all the reasons software needs parallel versions — an experimental branch for testing, a staging branch for QA, and, the one this audience cares about, branches that park an old version in place so players can drop back to it: legacy_1.6, version-1.5, default_old, 1.4.3-legacy, and so on.

That last category is why branches matter so much for downgrading. When a developer keeps a public branch around for an old patch, you don't need SteamDB archaeology — the old build has a name, and you can ask for it by name. SteamDB puts it plainly: branches other than public "are often used for storing an older version of the game for people to downgrade to, or for testing new patches/content." Whole guides on this site lean on exactly this — Project Zomboid, RimWorld and Subnautica all hand you the old version as a labelled branch.

02The two flags

DepotDownloader exposes branches through two flags:

FlagWhat it does
-branch <name>Download from the named branch instead of public. Default is public, so leaving it off and passing -branch public are identical.
-branchpassword <pass>Supply the access code for a password-protected branch (section 04). Only valid alongside -branch.

Pulling a named public branch is as simple as it sounds:

> .\DepotDownloader.exe -app 264710 -branch legacy \ -username you -remember-password -dir .\subnautica-legacy
If your old guide says -beta

The flags used to be -beta and -betapassword, and a lot of tutorials still show them. They still work — current 3.x keeps -beta/-betapassword as living synonyms for -branch/-branchpassword (internally the config field is even still called BetaPassword). Use whichever your muscle memory prefers; if you pass both, the -branch form wins. The CLI reference lists them together.

03Pointer vs pin — the distinction that matters

This is the part worth slowing down for, because it decides whether your download is reproducible next month.

A branch is a moving pointer: '-branch legacy' points at whichever build the developer currently assigns and can be moved, while '-manifest B' pins one exact build permanently.
A branch points; a manifest pins. -branch gives you whatever the branch aims at today — the developer can move it. -manifest locks one exact build that never changes. Original diagram, drawn for this page.

-branch resolves to wherever the branch points right now. When you ask for -branch legacy_1.6, DepotDownloader looks up that branch's current manifest and downloads it. That's convenient — no manifest ID to find — but it means you're trusting the branch to keep pointing where it does today. A developer can move a branch to a newer build, rename it, or delete it entirely, and your "same command" will then fetch something different or fail.

-manifest pins an exact build and ignores branches completely. If you pass a manifest ID, DepotDownloader skips the whole branch-resolution step and fetches precisely that historical build — immune to the developer moving or deleting any branch. The two even compose: use -branch to discover the manifest a branch currently serves (run with -manifest-only to dump it), then record that manifest ID and pin it forever.

-branch <name>-manifest <id>
Resolves tothe branch's current buildone exact build
Needs an ID?no — just the nameyes — from SteamDB
Survives the dev moving things?noyes
Best for"give me the current legacy build""give me this build, reproducibly"

Rule of thumb: a branch is the friendly front door for "the developer's blessed old version," and a manifest is the archival lock for "the exact build I tested against." For a one-off downgrade, the branch name is usually all you need; for anything you want to reproduce later — a server you'll rebuild, a modding baseline, a preservation copy — note the manifest ID and pin it. (Remember a manifest ID is not a build ID; the find-your-IDs page untangles those.)

04Password-protected and private branches

Some branches are gated. A developer can attach a password to a branch — historically to hand QA or backers access to a build the public shouldn't see. DepotDownloader handles these with -branchpassword:

> .\DepotDownloader.exe -app xxxxxx -branch privatebeta -branchpassword thecode -username you

Two honest points about what the password does and doesn't do:

  • It is not a substitute for owning the game. You still need a license on the account you log in with. The password only unlocks the branch's manifest list — Steam won't even show you the branch's contents without it. Ownership and branch access are two separate locks; you need both.
  • It's per-run, not stored. Unlike your login token, the branch password isn't cached to disk — you pass it each time. Pass -branchpassword without a -branch and the tool refuses outright ("Cannot specify -branchpassword when -branch is not specified").
The November 2024 change

Valve reworked password-protected branches into fully private ones that are invisible in the public app metadata — SteamDB now can't see them at all, and neither can third-party tooling that relies on that metadata. The practical effect: a brand-new private branch may not be discoverable or resolvable the way older password branches were. Old-style password branches that predate the change generally still behave as above; genuinely private modern ones are, by design, not something an external tool can enumerate.

05Finding what branches exist

DepotDownloader has no "list the branches" command — it downloads a branch you name, but it won't enumerate them for you. So you find the name elsewhere first:

  • SteamDB. An app's page lists its public branches (under the depots/betas info), with the build each currently points to. This is the fastest way to see whether an old version is parked as a named branch — but it only shows public branches, not gated ones.
  • The Steam client. Properties → Betas (newer UI: "Game Versions & Betas") shows the branches your account can currently select, including any you've unlocked with a code. Read the name there, then feed it to -branch — verbatim.

Why pull a branch with DepotDownloader at all, when the Steam client has that dropdown? Because the client switches your installed copy in place and auto-updates it — picking a beta replaces what you have, and going back means another full download. DepotDownloader drops the branch into an isolated -dir folder without touching your live install, so you can hold several versions side by side. That's the same isolation argument the downgrade guide is built on.

06Gotchas worth knowing

  • The silent fallback to public. The most confusing one: if you misspell a branch name (or it no longer exists), DepotDownloader doesn't stop — it warns Depot … does not have branch named "…". Trying public branch. and downloads public instead. If you "downgraded" and got the current version, check your scrollback for that warning before blaming anything else — and cross-check the it-launched-the-current-version page.
  • Branch names are case-exact. Only public itself is matched case-insensitively. For any custom branch, match the name exactly as SteamDB or the Steam client shows it — legacy_1.6 is not Legacy_1.6.
  • public and no flag are the same thing. There's no difference between omitting -branch and writing -branch public; both resolve to the default.
  • A branch can still be gated by the request-code system. Asking for an old branch's current manifest is usually fine, but if a branch points at an old manifest Valve has restricted, you can still hit the "no manifest request code" wall — branch access and manifest authorization are different gates.

Net of it: branches are the easy, human-readable door to a developer's supported old versions, reached with -branch and (when gated) -branchpassword; manifests are the durable lock for an exact build, reached with -manifest. Most downgrades start at the door. If you want the download to still mean the same thing a year from now, write down the manifest behind it. The glossary keeps the one-line definitions, and the CLI reference has every flag these examples used.