{"id":48837276,"url":"https://github.com/holdmybeer-gg/rustydemon","last_synced_at":"2026-05-02T23:06:04.469Z","repository":{"id":350728034,"uuid":"1207962088","full_name":"HoldMyBeer-gg/rustydemon","owner":"HoldMyBeer-gg","description":"Cross-Platform CASC Explorer for exploring games.","archived":false,"fork":false,"pushed_at":"2026-04-17T01:46:33.000Z","size":11326,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-17T02:03:43.301Z","etag":null,"topics":["blizzard","blizzard-games","casc","cross-platform","diablo4","games","linux","macos","rust","rust-lang","steam-os","windows","world-of-warcraft"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HoldMyBeer-gg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"HoldMyBeer-gg","patreon":"bytingjaws"}},"created_at":"2026-04-11T16:27:54.000Z","updated_at":"2026-04-17T01:46:37.000Z","dependencies_parsed_at":"2026-04-17T02:02:30.311Z","dependency_job_id":null,"html_url":"https://github.com/HoldMyBeer-gg/rustydemon","commit_stats":null,"previous_names":["jabberwock/rustydemon","holdmybeer-gg/rustydemon"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/HoldMyBeer-gg/rustydemon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HoldMyBeer-gg%2Frustydemon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HoldMyBeer-gg%2Frustydemon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HoldMyBeer-gg%2Frustydemon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HoldMyBeer-gg%2Frustydemon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HoldMyBeer-gg","download_url":"https://codeload.github.com/HoldMyBeer-gg/rustydemon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HoldMyBeer-gg%2Frustydemon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31954736,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blizzard","blizzard-games","casc","cross-platform","diablo4","games","linux","macos","rust","rust-lang","steam-os","windows","world-of-warcraft"],"created_at":"2026-04-15T00:03:37.597Z","updated_at":"2026-05-02T23:06:04.462Z","avatar_url":"https://github.com/HoldMyBeer-gg.png","language":"Rust","funding_links":["https://github.com/sponsors/HoldMyBeer-gg","https://patreon.com/bytingjaws"],"categories":[],"sub_categories":[],"readme":"# Rusty Demon - Cross-Platform CASC Explorer\n\nA fast, cross-platform explorer for CASC (Content-Addressable Storage Container)\narchives, written entirely in Rust.\n\n\u003e **Rusty Demon adds first-class support for the Steam distribution of\n\u003e Diablo IV's CASC archives** alongside the existing Battle.net format. The\n\u003e Steam build's key-layout flag bits, zlib-wrapped VFS roots, and split\n\u003e meta.dat / payload.dat scheme are a layout the established Battle.net-era\n\u003e libraries don't yet cover — rustydemon handles them natively. See\n\u003e [Steam D4 Support](#steam-d4-support) below.\n\n\u003e **For personal and educational use only.**\n\n[![CI](https://github.com/HoldMyBeer-gg/rustydemon/actions/workflows/ci.yml/badge.svg)](https://github.com/HoldMyBeer-gg/rustydemon/actions/workflows/ci.yml)\n[![Rust](https://img.shields.io/badge/rust-1.80%2B-orange?logo=rust)](https://www.rust-lang.org)\n[![Edition](https://img.shields.io/badge/edition-2021-blue?logo=rust)](https://doc.rust-lang.org/edition-guide/rust-2021/index.html)\n[![License](https://img.shields.io/badge/license-AGPL--3.0%20%2B%20Commons%20Clause-green)](./LICENSE)\n[![Platforms](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux%20%7C%20Steam%20Deck-lightgrey)](#preview-plugins)\n[![Steam D4](https://img.shields.io/badge/Steam%20Diablo%20IV-supported-red?logo=steam)](#steam-d4-support)\n\n---\n\n## UI Preview\n\n![rustydemon previewing a WoW M2 model](screenshots/wow_m2.png)\n\n*Three-panel layout: archive tree (left) · search results (centre) · file details with live 3D preview (right). Shown here previewing a WoW M2 character model.*\n\n---\n\n## Preview Plugins\n\n| About modal | D4 `.tex` texture |\n|-------------|-------------------|\n| ![About modal](screenshots/about.png) | ![D4 texture preview](screenshots/d4_tex.png) |\n\n| D4 `.pow` skill data | WoW `.m2` model |\n|----------------------|-----------------|\n| ![D4 power preview](screenshots/d4_pow.png) | ![WoW M2 model preview](screenshots/wow_m2.png) |\n\n---\n\n## Features\n\n- **Regedit-style global search** - searches *every* entry in the archive manifest,\n  not just the currently selected folder\n- **File tree navigation** - browse archives by folder with expand/collapse, Expand All / Collapse All\n- **Pluggable preview panel** - formats register themselves through a\n  [`PreviewPlugin`](rustydemon/src/preview/mod.rs) trait. Built-in plugins\n  cover BLP textures (WoW), `.tex` BC textures (D4), `.pow` skill data (D4),\n  `.vid` Bink Video 2 movies (D4), and a generic UTF-8 text fallback. Add a\n  format by dropping one file into `rustydemon/src/preview/`.\n- **Pluggable export buttons** - each preview plugin can register its own\n  export actions (e.g. *Export As PNG* for textures, *Export As BK2* for\n  movies). Raw export is always available as a fallback.\n- **Deep search** - optionally search *inside* container files via a parallel\n  [`ContentSearcher`](rustydemon/src/deep_search/mod.rs) plug-in interface\n  (`.pow` D4 skill data supported out of the box).\n- **Glob path search** - search bar and CLI accept literal paths *or* glob\n  patterns (`*.wmo`, `textures/*.tex`, `**/cinematics/*.vid`); matching is\n  case-insensitive and `**/` is auto-prepended for convenience.\n- **Headless CLI exporter** (`rustydemon-cli`) - batch-extract files from a\n  local CASC install without launching the GUI. Supports path/glob/FDID\n  selection, parallel workers, dry-run, flatten, and overwrite. See\n  [CLI](#cli) below.\n- **Auto product detection** - reads `.build.info` so you never need to know internal product codes (`fenris`, `wow`, etc.)\n- **Cross-platform** - Windows · macOS · Linux · Steam Deck (touch-ready via egui)\n- **Steam Diablo IV support** - native reader for the Steam-distribution\n  static container format (no `.build.info`, no encoding file, location\n  encoded directly in each EKey)\n- **Diablo II: Resurrected support** - reads D2R 3.1.2's TVFS-based layout,\n  including the multi-storage `Data/data` + `Data/ecache` split and\n  archive-style `.index` files, with an optional CDN fallback fetcher\n  (behind the `cdn` cargo feature).\n\n---\n\n## Steam D4 Support\n\nRusty Demon opens the Steam distribution of Diablo IV's CASC archives out\nof the box. The Steam build ships with a fundamentally different storage\nlayout than the Battle.net client, and we wrote a dedicated backend for it\nbecause the existing CASC libraries (which predate the Steam release) focus\non the Battle.net format:\n\n| | Battle.net D4 | Steam D4 |\n|---|---|---|\n| Manifest entry point | `.build.info` | `Data/.build.config` |\n| Archive files | `data.NNN` | `{chunk}/0x{archive}-{meta,payload}.dat` |\n| Location lookup | `*.idx` index files | Bits inside each EKey |\n| Encoding table | `encoding` file | *(none -CKey ≡ EKey)* |\n| VFS root wrapper | BLTE | Raw zlib (`espec = z`) |\n| Data header | 30-byte prefix | None |\n\nRustydemon auto-detects which layout is in use and picks the right backend.\nPoint **File → Open Game Directory…** at either\n`C:\\Program Files (x86)\\Diablo IV` (Battle.net) or\n`…/steamapps/common/Diablo IV` (Steam) and it just works.\n\n\u003e [CascLib](https://github.com/ladislav-zezula/CascLib) and\n\u003e [TACTLib](https://github.com/overtools/TACTLib) were our primary references\n\u003e for the CASC ecosystem, and TACTLib's static-container handler in particular\n\u003e guided rustydemon's understanding of the `key-layout-*` bit-extraction\n\u003e scheme used by Overwatch. The Steam D4 build extends that scheme with a\n\u003e few additional pieces — the 4th flag value in each `key-layout-*`, a\n\u003e zlib-wrapped VFS root, and a split `meta.dat` / `payload.dat` path layout —\n\u003e which rustydemon's `static_container` module in `rustydemon-lib` adds on\n\u003e top, verified against a real Steam install.\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n| Platform | Requirement |\n|----------|-------------|\n| All | [Rust stable toolchain](https://rustup.rs) (1.80+) |\n| Linux / Steam Deck | `libgtk-3-dev` (or equivalent) - see below |\n| Windows / macOS | Nothing extra; eframe bundles everything |\n\n**Linux / Steam Deck system deps:**\n\n```bash\n# Debian / Ubuntu / Kali\nsudo apt install libgtk-3-dev libxcb-render0-dev libxcb-shape0-dev \\\n                 libxcb-xfixes0-dev libxkbcommon-dev libssl-dev\n\n# Arch / Steam Deck\n# Note: Just try to run rustydemon first. SteamOS probably has these already.\n# If not, you'll have to `sudo steamos-readonly disable`, install, then \n# `sudo steamos-readonly enable` immediately after the install is done.\nsudo pacman -S gtk3 libxcb xkbcommon openssl\n\n# Fedora\nsudo dnf install gtk3-devel libxcb-devel libxkbcommon-devel openssl-devel\n```\n\n\u003e **Steam Deck (Desktop Mode):** SteamOS has very limited space outside `/home`, so install\n\u003e [Homebrew](https://brew.sh), `rustup`, and `gcc` to your SD card rather than the internal drive.\n\u003e Once Rust is available, install the Arch deps above via `pacman` and build normally.\n\u003e Game files live at `/home/deck/.steam/steam/steamapps/common/\u003cGame\u003e` -\n\u003e point **File → Open Game Directory…** there.\n\n### Build \u0026 Run\n\n```bash\ngit clone https://github.com/jabberwock/rustydemon.git\ncd rustydemon\ncargo run --release -p rustydemon\n```\n\nThe first build downloads and compiles all dependencies (~3–5 minutes).\nSubsequent builds are incremental and much faster.\n\n---\n\n## Usage Guide\n\n### 1 -Open a game directory\n\n**File → Open Game Directory…** and select your game's installation root\n(the folder that contains `.build.info` for Battle.net installs, or\n`Data/.build.config` for Steam installs).\n\nThe product UID is detected automatically:\n\n| Game | Detected as |\n|------|------------|\n| World of Warcraft | `wow` |\n| Diablo IV | `fenris` |\n| Diablo II: Resurrected | `osi` |\n| Diablo III | `d3` |\n| Hearthstone | `hs` |\n| Heroes of the Storm | `hero` |\n| StarCraft II | `s2` |\n| Overwatch | `pro` |\n\n### 2 -Load a listfile *(optional but recommended)*\n\nWithout a listfile, files are shown by hash only.\nWith one, the full virtual path is resolved and the tree is populated.\n\n**File → Load Listfile…** and pick a community listfile (CSV or plain text).\nA maintained listfile can be downloaded from the\n[wowdev community listfile](https://github.com/wowdev/wow-listfile) project.\n\n### 3 -Search\n\nType a filename fragment in the search bar and press **Enter** or click **Search**.\nResults are drawn from the *entire* root manifest, every locale and content\nvariant, so nothing is hidden behind an unexpanded folder.\n\nThe query can be a literal substring *or* a glob: `*.wmo`, `textures/*.tex`,\n`**/cinematics/*.vid`. Matching is case-insensitive, and `**/` is\nauto-prepended unless the pattern already anchors at `/` or `**/`.\n\n### 4 -Deep search *(optional)*\n\nCheck **Deep search** and click **🔍 Find All (Deep Search)** to also search\n*inside* supported container files:\n\n| Format | What is indexed |\n|--------|----------------|\n| `.pow` | D4 skill/power definitions, SF names, damage formulas |\n| *(more formats via the plug-in interface)* | |\n\n### 5 -Preview and export\n\nClick any file in the tree or search results to load it into the preview panel.\n\n- **BLP textures** render inline\n- **All other files** show a hex dump of the first 256 bytes\n- **Export As PNG** saves a decoded BLP to disk via a native dialog\n\n---\n\n## CLI\n\n`rustydemon-cli` is a headless batch exporter for scripting and\nserver-side extraction. The GUI binary remains the way to browse\ninteractively.\n\n```bash\ncargo run --release -p rustydemon-cli -- \\\n    --archive \"/home/deck/.steam/steam/steamapps/common/Diablo IV\" \\\n    --path    \"base/meta/Sound\" \\\n    --output  ./out\n```\n\nKey flags:\n\n| Flag | Purpose |\n|------|---------|\n| `-a, --archive \u003cDIR\u003e` | Game install root (Battle.net or Steam) |\n| `-p, --path \u003cPATH\u003e` | Literal folder, literal file, or glob (`*.wmo`, `**/cinematics/*.vid`) |\n| `--fdid \u003cN\u003e` | Extract a single WoW file by FileDataID (no listfile needed) |\n| `-l, --listfile \u003cFILE\u003e` | Listfile for WoW (required to resolve paths) |\n| `-o, --output \u003cDIR\u003e` | Host directory; created if missing |\n| `--flat` | Drop files into `--output` instead of mirroring virtual dirs |\n| `--dry-run` | Print matches without writing |\n| `--overwrite` | Replace existing files (default: skip) |\n| `-j, --parallel \u003cN\u003e` | Worker thread count (defaults to CPU cores) |\n| `-q, --quiet` | Suppress progress bar |\n\nD4 and other TVFS-based archives self-describe, so `--listfile` is not\nneeded there. For WoW, pass either `--listfile` or `--fdid`.\n\n---\n\n## Workspace Layout\n\n```\nrustydemon/\n├── rustydemon-blp2/   BLP0/1/2 texture decoder (palette, DXT1/3/5, ARGB, JPEG)\n├── rustydemon-lib/    CASC library (config, index, encoding, BLTE, root, search)\n├── rustydemon-cli/    Headless batch exporter (clap + rayon)\n└── rustydemon/        egui/eframe GUI application\n```\n\n---\n\n## Contributing\n\n1. Fork and create a feature branch\n2. `cargo test --workspace` must pass\n3. `cargo fmt --all` and `cargo clippy --workspace -- -D warnings` must be clean\n4. Open a PR - CI runs fmt, clippy, tests, and a RustSec security audit automatically\n\nListfile improvements and new deep-search plug-ins are especially welcome.\n\n---\n\n## Acknowledgments\n\nBuilt on the shoulders of the CASC reverse-engineering community:\n\n- **[CascLib](https://github.com/ladislav-zezula/CascLib)** by Ladislav\n  Zezula - the C library for reading CASC archives and our primary reference\n  for BLTE, encoding, root manifests, MNDX/MARR, and more.\n- **[CASC Explorer](https://github.com/WoW-Tools/CASCExplorer)** by the\n  WoW-Tools team - the original .NET GUI for browsing CASC archives.\n  Rusty Demon's UI takes cues from CASC Explorer's design.\n- **[TACTLib](https://github.com/overtools/TACTLib)** by the Overtools team -\n  a C# CASC implementation whose TVFS and static-container work was a useful\n  reference.\n- **[SereniaBLPLib](https://github.com/WoW-Tools/SereniaBLPLib)** by Xalcon -\n  BLP texture parsing and DXT decompression in `rustydemon-blp2` are derived\n  from this MIT-licensed C# library (see\n  [`rustydemon-blp2/CREDITS`](rustydemon-blp2/CREDITS)).\n- **[wowdev.wiki](https://wowdev.wiki/CASC)** and the datamining community -\n  for documenting CASC/TACT formats and maintaining the community listfiles.\n\n---\n\n## License\n\nSource licensed under [AGPL-3.0](./LICENSE) with the Commons Clause -\nfree to read, build, and use for personal and educational purposes.\n\nCommercial distribution (e.g. Steam store builds) is reserved to the\nmaintainers under a separate proprietary license. See\n[COMMERCIAL.md](./COMMERCIAL.md) for the dual-licensing details and the\ncontributor license grant that applies to pull requests.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fholdmybeer-gg%2Frustydemon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fholdmybeer-gg%2Frustydemon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fholdmybeer-gg%2Frustydemon/lists"}