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 ./reconIt 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 ./sliceOnly 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/*.txtThe 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-onlylisting, not from memory. A silently-empty download almost always means paths that matched nothing. - It's .NET regex, not glob.
*.vpkis not a pattern, it's a typo — you wantregex:.*\.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 bapply 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.