Download
depot / docs / filelists

Surgical downloads

Depots are sealed containers, but you don't have to take the whole crate. With a filelist you pull exactly the files you name — one map out of 60 GB, every config and nothing else — and with -manifest-only you can read the packing slip before downloading a single byte. Together they're the most underrated corner of the tool, and the part I reach for most often in my own day-to-day testing.

01The problem this solves

The situations are all variations on one theme — the depot is huge and your interest is tiny. You need a single .vpk map out of a Source game's content depot. You want every .cfg from a server build without the 12 GB of assets around them. You're bisecting a bug across builds and only the binary changed. You're mining one model set from CS:GO's 30 GB asset depot. Downloading everything to keep 0.1% of it is what people do when they don't know these two flags exist.

02Step zero: read the packing slip with -manifest-only

Before filtering, you need exact file paths — and guessing them is miserable. -manifest-only skips all content download and instead writes a human-readable listing of the manifest — every file path with its size — into your -dir, named after the depot and manifest it describes:

$ ./DepotDownloader -app 440 -depot 441 -manifest-only -dir ./recon

It costs seconds and a few megabytes regardless of depot size, because manifests are metadata — the deep dive explains why they're tiny. Open the resulting text file, find your targets, copy the paths verbatim. This listing is the source of truth for the next step: paths in your filelist must match what the manifest says, not what you remember from your install folder. The first time I tried this I typed paths from memory off my install directory and got a silent empty download for my trouble — the manifest listing exists precisely so you don't repeat my mistake.

03Filelist syntax

A filelist is a plain text file, one entry per line, two kinds of entry:

# files.txt — exact paths, verbatim from the manifest listing tf/maps/ctf_2fort.bsp tf/steam.inf # or patterns, one regex per line, prefixed with regex: regex:.*\.cfg$ regex:tf/materials/models/.*

Plain lines match exactly one file each. regex: lines match every file in the manifest whose path fits the pattern — standard .NET regex syntax, so anchor with $ and escape dots if you mean literal dots. You can mix both kinds freely in one file; a file matched by any line gets downloaded.

04Putting it together

$ ./DepotDownloader -app 440 -depot 441 -filelist files.txt -dir ./slice

Only the matched files arrive, in their full depot-relative folder structure. Everything else on this site composes with it: add -manifest and you're extracting a file as it was in an old build — the single most elegant trick in the toolbox, fetching one historical binary in seconds instead of resurrecting a whole 2019 install (subject, as always, to old-manifest gating). Add -os and it's a file from another platform's build. Anonymous server depots work too — a fresh server.cfg baseline without re-downloading the server.

05The diff workflow: what did the patch actually change?

The pairing that earns -manifest-only its keep. Take listings of two builds of the same depot — the old one via its manifest ID, the current one without:

$ ./DepotDownloader -app 440 -depot 441 -manifest OLD_ID -manifest-only -dir ./before $ ./DepotDownloader -app 440 -depot 441 -manifest-only -dir ./after $ diff ./before/*.txt ./after/*.txt

The diff is the patch's table of contents: files added, removed, and — via changed sizes — touched. Modders use it to see what an update broke before testing anything; server admins use it to judge whether tonight's patch warrants a maintenance window; the curious use it to fact-check patch notes. Then, if something specific changed, a two-line filelist pulls just those files from both builds for the real comparison. Total downloaded: kilobytes of metadata plus the files you actually cared about.

06Gotchas

  • Paths must match the manifest, not your disk. Case, separators, the depot-relative root — take them from the -manifest-only listing, not from memory. A silently-empty download almost always means paths that matched nothing.
  • It's .NET regex, not glob. *.vpk is not a pattern, it's a typo — you want regex:.*\.vpk$. If you're getting odd extras, your pattern is under-anchored.
  • Filtering doesn't beat licensing or gating. A filelist selects within a manifest you're allowed to download — it doesn't help with depots you don't own or manifests that won't get a request code.
  • Files arrive whole. Filtering is per-file; there's no partial-file download. One 8 GB pack file in your list is still an 8 GB download.
  • The flags pair per-depot. Multi-depot runs with -depot a b apply the same filelist to each — fine for patterns, surprising for exact paths that only exist in one depot.

My rule of thumb: I run -manifest-only first on anything I don't already know cold, then build the filelist from that text — it's saved me more wasted bandwidth than any other habit. Flag reference for everything used here: the CLI reference. And if what you actually want is the opposite — every platform and language of everything — that's preservation mode.