01The three contenders
DepotDownloader — community tool by SteamRE (the SteamKit2 people), C#/.NET, shipped as self-contained binaries. Built around the idea that a depot's history is addressable: manifests are a first-class argument, not an afterthought. The thing this entire site documents.
SteamCMD — Valve's official headless Steam client. The tool game developers document for dedicated servers, the one hosting panels are built around. Its centre of gravity is app_update: give me the current build of this app, validated. Everything else it does, it does reluctantly.
steamctl — community tool from the ValvePython project, pip install steamctl. The widest net of the three: depots and workshop, but also Steam Guard authenticator management, Steam Cloud files, WebAPI queries, master-server browsing. A Swiss army knife where the other two are crowbars.
02The feature matrix
| DepotDownloader | SteamCMD | steamctl | |
|---|---|---|---|
| Made by | SteamRE community | Valve, official | ValvePython community |
| Runs on | Win · Linux · macOS · ARM64, self-contained | Win · Linux · macOS (32-bit libs needed on Linux) | Anywhere with Python 3 |
| Latest build of a game | YES | YES — its home turf | YES |
| Old builds by manifest | FIRST-CLASS — -manifest flag | CLUNKY — download_depot console command | SUPPORTED — added later, historically patchy |
| Anonymous mode | YES | YES | YES |
| QR / passwordless login | YES | NO | NO |
| Partial downloads (file lists, regex) | YES — -filelist | NO | LIMITED |
| Workshop / UGC by ID | YES — -pubfile / -ugc | PER-GAME — workshop_download_item | YES |
| Repair in place | -validate | app_update … validate | — |
| Beyond downloads (Guard, Cloud, WebAPI) | NO | NO | YES — its whole point |
| Community GUI | SteamDepotDownloaderGUI | assorted wrappers | NO |
One row that isn't there, deliberately: "bypasses manifest gating". Nobody does. All three ask the same Steam servers for the same request codes and get the same answers — a manifest Valve won't serve is unavailable in every tool, and anything claiming otherwise belongs on the safety page's warning list, not in this table.
03The axes that actually decide it
History. If old builds are the job, the gap is wide. DepotDownloader treats app/depot/manifest as its native coordinates. SteamCMD can do it — download_depot 220 221 manifestid in its console — but it buries the result in steamapps/content/, gives terse errors, and the workflow reads like the afterthought it is. steamctl gained proper request-code handling later than the others and the depot corner of the project has seen rougher edges (a long-standing 401-on-old-manifests bug taught its users that lesson). Worth knowing: SteamCMD's console occasionally disagrees with DepotDownloader on what it'll serve — both directions — so the desperate two-minute cross-check is legitimate.
Login UX. DepotDownloader has QR sign-in and stores revocable tokens (details). SteamCMD wants the password typed or — worse, and exactly what every forum tutorial shows — passed inline in the command. steamctl sits between, with the curious twist that it can be your two-factor authenticator. On a shared or rented box, QR alone can settle the choice.
Surgical downloads. Only DepotDownloader does file-level filtering (-filelist with regex support) — pulling three files from a 60 GB depot instead of the depot. If your use case is diffing builds or extracting assets, that's the decisive row of the matrix.
Operational fit. SteamCMD is what the game's own documentation assumes, what panels like AMP or Pterodactyl integrate, what Valve keeps working forever. Migrating a documented server workflow to a different tool buys you nothing unless you need that tool's tricks. Linux footnote: SteamCMD is a 32-bit binary and drags lib32gcc along; DepotDownloader's self-contained build has no such ask; steamctl needs a Python environment.
04When SteamCMD is the right answer
Production game servers, plainly. If the developer's wiki documents app_update 740, do that — official tool, official support surface, and every hosting integration on earth speaks it. It's also the only one of the three made by the people who run the platform: when Steam changes, SteamCMD is updated by definition. I run DepotDownloader for server work because I value one recipe across all my boxes and cron-friendly flags — but if SteamCMD is already wired into your panel and works, switching for its own sake is hobbyism.
05When steamctl is the right answer
When the download is the boring part of a bigger Steam automation. steamctl manages Steam Guard from the terminal, pulls Steam Cloud saves, queries the WebAPI, parses SteamIDs — none of which the other two attempt. If you live in Python and want one dependency that pokes all of Steam, it's genuinely good. For depot work specifically it's the third choice of three, and I think its own maintainers would shrug agreeably at that — depots are one tool in its drawer, not the point of it. One real edge: steamctl is pure Python, so it runs where DepotDownloader's .NET can't — if you're on a BSD or an exotic platform with no .NET runtime, that platform reach is steamctl's to win.
06Two more you'll see mentioned
Searches keep pairing DepotDownloader with two things that aren't really alternatives, so to settle them:
- ArchiSteamFarm (ASF). Also built on SteamKit2, also account-oriented — but it doesn't download game files at all. ASF farms trading cards and manages licenses (its
addlicenseadds free games to an account); it has no depot-download function. "ASF vs DepotDownloader" is a category error: one adds licenses and farms cards, the other downloads the content of games you're licensed for. Different jobs entirely. - The Steam console
download_depotcommand. The built-in client trick — no extra tool. It used to be a real fourth option for old versions, but it's effectively retired for that: today it mostly fetches the current build or refuses old manifests. The full why-and-migration is on the download_depot page.
07Task → tool
| You want to… | Reach for |
|---|---|
| Download an old build by manifest ID | DepotDownloader — the downgrade guide |
| Run a production server the dev documents via SteamCMD | SteamCMD — follow the game's docs |
| Provision/update servers your own way, scripted | DepotDownloader — one recipe, every game |
| Pull specific files out of a huge depot | DepotDownloader — filelists |
| Log in without typing a password on a sketchy box | DepotDownloader — QR |
| Workshop items on a headless machine | DepotDownloader or steamctl — workshop guide |
| Manage Steam Guard, Cloud saves, WebAPI from a terminal | steamctl — nothing else does |
| Click buttons instead of typing anything | DepotDownloader via the GUI |
| Add a free game's license / farm trading cards | ArchiSteamFarm — it doesn't download game files |
| Run on a BSD / platform with no .NET runtime | steamctl — pure Python, no .NET needed |
| Defeat Valve's old-manifest restrictions | Nothing. Server-side gate, all tools equal — status page |
And since all three are free and small, the honest meta-advice: install two. The cross-check costs nothing and settles arguments faster than any comparison table — including this one.