steamroom
Utilities for interacting with Steam's API
History
This project is a cleanroom reimplementation of DepotDownloader.
I originally used an LLM to translate DepotDownloader to Rust, and put all of that DepotDownloader-rs. However, I realized that GPL licensing is a pain in the ass for Rust projects because of static linking, and decided to do the following:
- Generate docs for the conversion library
- Delete the source code from the docs
- Copy that + the file tree and old
ddlbinary to a new repo - Instruct a new LLM session how to reverse engineer steam (using Binary Ninja MCP + Steam libs loaded)
- Told it to reimplement it to the API spec
- ???
- 4 Hours later, we're GPL-free
Any major improvements done to this library should, in spirit of collaboration, be shared back to the SteamRE/DepotDownloader project in the spirit of advancing everyone's capabilities.
Not to air my personal grievances with GPL in this README, but DepotDownloader has been a godsend for many projects and I do believe in the spirit of upstreaming changes you make to libraries you use. I don't like the idea of GPL infecting things which statically link against the library, however. And that is the only reason why this library exists as a cleanroom reimplementation.
Install
Quick Start
# Download Spacewar (free game, no login required)
# Download with authentication (prompts for password + 2FA)
# QR code login (scan with Steam mobile app)
# Use a saved token (auto-detected from ~/.depotdownloader/tokens.json)
Commands
download
Download depot content to a local directory.
# Basic download
# Specific manifest version
# Download a specific branch
# Filter files by regex
# Filter files by list
# Verify existing files (skip up-to-date, re-download changed)
# Control parallelism
info
Show app metadata, depots with sizes, and branches.
# Filter depots by OS
# Include redistributable depots
# JSON output for scripting
Example output:
App ID: 730
Name: Counter-Strike 2
Type: Game
Depots:
ID CONFIGURATION SIZE DL.
2347770 64-bit 50.44 GiB 42.93 GiB
2347771 Windows 7.07 GiB 5.05 GiB
2347772 macOS 9.06 KiB 1.66 KiB
2347773 Linux, 64-bit 6.62 GiB 4.71 GiB
2347774 64-bit 1023.01 MiB 843.02 MiB
...
Branches:
NAME DESCRIPTION BUILD TIME BUILT TIME UPDATED
animgraph_2_beta Animgraph 2 Beta 22720547 2d ago 2d ago
1.41.4.1 1.41.4.1 22627914 9d ago 9d ago
public 22627914 9d ago 9d ago
1.41.4.0 1.41.4.0 22370414 26d ago 26d ago
...
manifests
List depot manifest IDs for a branch.
Example output:
Manifests for branch 'public':
depot 229006 -> --
depot 481 -> 3183503801510301321
save-manifest
Download and save a depot manifest without downloading content. Saves the raw CDN response (.zip), decompressed manifest (.manifest), and depot key (depot.json).
# Save latest manifest
# Save a specific manifest version
files
List files in a depot manifest.
# Plain output (one filename per line, for piping)
# Raw byte sizes
# JSON output
# Read from a local manifest file (key auto-detected from depot.json)
# Explicit depot key (hex)
# Show raw encrypted filenames (no key needed)
Example output:
Depot: 481
Manifest: 3183503801510301321
Created: 2019-02-06 21:51:33 UTC
Size: 1.82 MiB
Files: 8
FILENAME SIZE CHUNKS
DejaVuSans.txt 2.76 KiB 1
sdkencryptedappticket.dll 558.28 KiB 1
DejaVuSans.ttf 703.96 KiB 1
installscript.vdf 514 B 1
steam_api.dll 219.78 KiB 1
SteamworksExample.exe 374.00 KiB 1
controller.vdf 1.53 KiB 1
D3D9VRDistort.cso 576 B 1
diff
Compare two manifests and show added, removed, and changed files.
packages
Query Steam package (sub) details by ID.
workshop
Download Steam Workshop items.
local-info
Show locally cached depot keys and beta branches from Steam's config.vdf.
Daemon mode
steamroom can run as a background daemon that holds an authenticated Steam session and
services CLI invocations over a local socket. Reusing the session avoids the per-command
CM discovery, handshake, and logon round trip, so repeated commands run faster.
The daemon authenticates either at launch, when daemon start is given auth flags, or
lazily on its first job, when started without them (using an auto-detected saved token, or
anonymous). It serves one account for its lifetime; to switch accounts, stop and restart
it. It reconnects if the CM connection drops.
# Start a daemon. With auth flags it logs in now; without them it logs in
# lazily on the first job.
# Route commands through the daemon. If none is running, --use-daemon
# starts one in lazy auth mode first.
# Jump the queue.
# Submit without waiting, then reattach by job id.
# Observe.
# Stop.
Job history persists across restarts, so daemon status and daemon attach can see jobs
from earlier daemon runs.
Auth flags (--username, --password, --qr, --use-steam-token, --remember-password,
--device-name) and --capture are ignored, with a warning, under --use-daemon; the
daemon serves the account it authenticated as. Set them on daemon start instead.
Authentication
steamroom supports multiple authentication methods:
| Method | Flag | Notes |
|---|---|---|
| Anonymous | (none) | Works for free games |
| Password | --username X --password Y |
Prompts if password omitted |
| Password + 2FA | --username X |
Prompts for guard code |
| QR code | --username X --qr |
Scan with Steam mobile app |
| Saved token | --username X |
Auto-loads from ~/.depotdownloader/tokens.json |
| Steam token | --use-steam-token |
Reuses cached token from local Steam installation |
Tokens are saved automatically after successful login and reused on subsequent runs.
Legacy Compatibility
Set DD_COMPAT=1 to use single-dash arguments compatible with the original DepotDownloader:
DD_COMPAT=1
Features
- TCP and WebSocket CM transports
- HTTP/2 multiplexed chunk downloads with CDN server pool rotation
- Chunk-level delta downloads (only fetches changed chunks via Adler-32 comparison)
- Local Steam credential reuse (
--use-steam-token) on Windows, Linux, and macOS - Local depot key and beta hash reuse from Steam's config.vdf (
--local-keys) - Manifest diff, package queries, manifest-only download, local manifest reading
- Non-atomic write mode for direct chunk-to-file writes
- Serde deserializer for Valve KeyValue format
- C/C++ FFI bindings via Diplomat, Python bindings via nanobind
- Proto extraction tool for steamclient64.dll
- Fuzz targets for binary parsers
Architecture
steamroom — Core Steam protocol: crypto, connection, transport, depot, messages
steamroom-client — High-level: download orchestration, manifest cache, credentials
steamroom-cli — CLI binary (produces `steamroom` executable)
steamroom-ffi — C/C++ FFI bindings via Diplomat
steamroom-proto-extract — Tool to extract protobuf definitions from Steam binaries
Benchmarks
Compared against DepotDownloader v3.4.0 (C#/.NET) using hyperfine. Anonymous login, Windows 11, same network.
| Benchmark | steamroom | DepotDownloader | Speedup |
|---|---|---|---|
| App info query (480) | 0.67s ± 0.06s | 2.85s ± 1.02s | 4.3x |
| File listing (480/481) | 1.67s ± 0.06s | 3.34s ± 1.01s | 2.0x |
| Download Spacewar (1.8 MB) | 1.23s ± 0.14s | 4.04s ± 0.16s | 3.3x |
| Download CS2 content (2.5 GB) | 23.6s | 32.1s | 1.4x |
Both tools are network-bound for large downloads. Results will vary by network and hardware. Run bench/run.sh to reproduce on your own setup.
# Build release
# Run with hyperfine (clean state each run to prevent resume skew)
Or use the included benchmark script with nix:
See FEATURES.md for a full feature comparison.
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)
at your option.