Turn your Day of Defeat 1.3 demos into highlight clips. DoD Studio finds every kill streak in a folder of demos, lets you review them in the game, records the ones you keep with HLAE, and renders them into finished videos. It also reads demos for match stats and fixes how demos look when they play back.
A creative fork of cgdangelo/dod-tools.
Get the latest release:
download setup.exe and run it. Windows 10 or 11, 64-bit.
- DoD Studio tells you when an update is out (the button beside Help) and installs it for you.
- Want new features before they're released? Pick the Experimental channel under Help › Check for Updates. It can have bugs the stable one doesn't.
- Just want stats from one demo? The web analyzer reads a demo in your browser, with nothing to install.
- Day of Defeat on Steam. Pre-Anniversary and 25th Anniversary are both supported.
- A separate copy of Half-Life just for movies is recommended. It keeps your movie configs, models and sounds away from the game you play online.
- HLAE, which records the game. Required.
- FFmpeg for video capture and for rendering clips. Optional, but you'll want it.
On first launch, a Setup window walks you through each one. The Capture page keeps a checklist until the required items are set.
- Find highlights: scan a folder (or a whole drive) of POV and HLTV demos. Every kill streak becomes a row you can tick, note and trim.
- Review them in the game: play every highlight and answer Yes, Maybe or No before you capture. Long walks between kills fast-forward.
- Capture in one batch: DoD Studio drives the game and HLAE, jumps between clips, and records each one, while the game stays behind your other windows.
- Render: turn the recorded takes into finished clips with FFmpeg, or have each batch finish them on its own, named from your own template.
- Make clips look right: an in-game DoD Studio window, spectating that looks like POV (gun animations, gunshots, crosshair, scope), a bigger kill feed with sharper icons, and switches that hide the scoreboard, spectator bars, voice menus, the red head-hit screen and more. Command profiles such as Clean clips set them in one go.
- HD textures: AI-upscaled map textures, models, sprites, HUD icons and skies, built from the HD Textures page.
- Players: give each player their own spray and crosshair in your clips.
- Demo tools: a match analyzer (scoreboard, kills on the map, flags, chat, rounds), and an auditor that renames demos, splits demos that span several maps, and finds duplicates across every drive.
The full list for each release is on the
Releases page, and every
in-game ds_* console command is in
docs/dodstudio_commands.md.
DoD Studio loads HLAE and its own hook DLL into the game and patches it in memory, which is exactly what VAC looks for. So:
- Only play demos in a game DoD Studio started. Never join a game server
from it. If HLAE asks "You are about to connect to a server", answer No,
unless it's an HLTV proxy you chose to watch. DoD Studio's hook DLL refuses
connectitself while it is loaded, except to an HLTV proxy that says VAC is off. - Never inject the hook DLL by hand (
inject.exe) into a game you then play online with. - To play online, start Day of Defeat from Steam, without DoD Studio. A separate copy of Half-Life for movies is recommended but never required: it keeps your movie configs, models, sprites and sounds out of the game you play online. It protects those files, not your account.
Every launch route and what protects it: docs/vac_safety.md.
The rest of this page is about the code.
The parts of this repository are at different levels of maturity. Read this before judging the codebase by whichever part you happen to open.
| Area | Status | Notes |
|---|---|---|
dod/ — DoD 1.3 message parsers |
Stable | Hand-written parsers for the mod's user messages. No public library covers this layer. |
analysis/ — match analytics |
Stable | Players, scoreboard, kills, rounds, chat, survival times, highlights. Validated across 624 demos; derived kill counts reconcile exactly with the game server's own frag counter for ~75% of players and within one kill for ~90%. |
dem-patch/ — demo reader/writer |
Stable | Vendored fork of the dem crate. See Why the fork below. |
hl-demo-auditor/ — duplicate finder |
Stable | Small, self-contained. The app's Demo Auditor builds on it. |
native/ — capture engine & patcher |
Active development | Capture planning, batch scheduling, take management and FFmpeg. Changes often. |
goldsrc-hooks/ — in-game DLL |
Active development | The ds_* console surface, HLTV fixes, HUD control and HD textures, on both engine builds. See its README. |
studio/ — Tauri desktop app |
Released, changing fast | Ships as DoD Studio. Expect new features and UI changes between releases. |
web-analyzer/ — browser demo viewer |
Active development | analysis/ compiled to wasm, deployed to GitHub Pages on every push to main. |
If you are here to look at demo parsing or stats extraction, dod/ and
analysis/ are the parts to read, and they are the parts you can rely on.
dod/ nom-based parsers for DoD 1.3 network messages (no I/O)
analysis/ match analytics built on top of dod/
dem-patch/ vendored + patched `dem` crate (GoldSrc demo read/write)
native/ capture engine, demo patcher, take management, FFmpeg
hl-demo-auditor/ duplicate-demo detector and lost-frames check (--integrity)
benchmark/ parsing/patching performance harness
goldsrc-hooks/ 32-bit DLL injected into hl.exe: HLTV fixes, HUD control, HD textures
studio/ Tauri v2 + Vite frontend
web-analyzer/ analysis/ compiled to wasm, browser-based demo viewer
Analyse a demo and print match analytics:
cargo run -p analysis --bin parse_demo -- path/to/demo.dem
Headless preview CLI (accepts a demo or a folder):
cargo run -p native --bin preview_cli -- path/to/demo-or-folder
Check demos for silently lost frames, one line each, non-zero exit if any is
broken (#41; see docs/goldsrc_demo_salvage.md):
cargo run --release -p hl-demo-auditor -- --integrity path/to/demo-or-folder
Desktop app:
cd studio
npm install
npm run tauri dev
Tests:
cargo test --workspace
Contributing: CLAUDE.md holds the repository's rules (branch
and PR names, CI, engine quirks). Every pull request targets dev.
Tokens are stored bare — lowercase, no #. The # is a lookup-time sigil
meaning "resolve this as a token", not part of the name, which is Valve's own
convention: every shipped game file stores keys without it. translate_key
normalizes on both insert and lookup, so a file written either way resolves.
dem-patch/ is dem v0.2.3 with the parse path hardened. Upstream resolves
delta-decoder tables with .unwrap() in seven files; when a demo does not carry
the expected delta-description table, that is a panic rather than a parse
error, which kills the whole process mid-batch. The fork falls back to the
library's built-in initial delta table where one exists and returns a graceful
parse failure otherwise. As of upstream v0.3.0 all 29 of those call sites are
still present, so the patch is still required.
Engineering notes live in docs/ (index): architecture
decisions, GoldSrc and DoD engine quirks, and HLAE protocol constraints.
docs/features.md describes what the app does, page by page.
docs/dodstudio_commands.md lists the in-game ds_* console commands. Bugs
and planned work are tracked in GitHub Issues; retired planning docs are in
docs/archive/.
This project is MIT (see LICENSE), which carries two copyright lines.
Charles D'Angelo's is from cgdangelo/dod-tools,
which this is a fork of — MIT requires that notice be retained, so it stays.
The second covers the work done here since the fork.
One directory is not MIT: dem-patch/ is LGPL-3.0. It is a vendored
fork of upstream dem and keeps upstream's
terms; dem-patch/LICENSE is the authority for that directory.
Because dem-patch/ is linked into every binary this workspace builds, anyone
redistributing those binaries is redistributing LGPL-3.0 code and takes on that
licence's obligations for the library portion -- principally the requirement
that recipients be able to relink against a modified version of it. The MIT
licence at the repository root does not override that, and is not intended to
suggest otherwise.
Local modifications to dem-patch/ are described under Why the fork of dem
above and are themselves LGPL-3.0, being changes to an LGPL work.