Skip to content

About

See your whole D2R stash from your own save files: collection progress, where every item is, build gear, mule organizing. Runs in the browser; saves never leave your device.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Repository files navigation

Diablo II: Resurrected Collection Tracker

Diablo II: Resurrected Collection Tracker

繁體中文

Load your D2R save folder and see your whole stash at once: every unique, set item, runeword and rune, which character or stash page holds it, how many copies you have, and what you are still missing.

Live site: d2r.diamonddoge.org

Demo: new finds, search, the collection, a build's gear, organizing; then on a Steam Deck, organizing with a backup and a set

Your saves are read in your browser (WebAssembly) and never uploaded. There is no server side, no account and no tracking.

What it does

  • New finds. Drop what you find on the inbox pages of the shared stash and see at once whether each item is worth keeping: new to the collection, better than the copy you have, a duplicate some build could still use, or extra. It only reads, so it works with the game running.

  • Collection. Uniques, sets, runewords, runes and charms.

    • Uniques, sets, runewords and runes show how many you own out of how many exist and what is still missing; sets show their bonuses.
    • Runewords also has what your loose runes and empty bases make, in tabs: owned, can make, only missing a base, 1 rune short, 2 runes short. Bases Larzuk or the Horadric Cube could socket count too, with the runes and gem the cube recipe uses up.
    • Charms shows every charm you own, grouped grand, large and small, uniques first. Filter by purpose (skills, magic find, life, resistances, attack, attributes) and dim or hide low rolls.
  • Search. Find any item, owned or not, in any of the four languages, and see where every copy is.

  • Characters. Each character's equipment, inventory, stash, cube and belt drawn as the in-game grids, with item tooltips. Collection mules show their empty slots, so a gap is an item still missing.

  • Build gear. Pick one of 22 popular builds for a main character, click an equipment slot, and see which of the recommended items you have and where they are. The lists come from Maxroll guides, link back to them, and may be out of date.

  • Organize. Sort your mules and chosen shared stash pages into numbered mules by fixed rules:

    • uniques and set items in fixed "museum" slots (UW, UA, UJ, SET mules), always the best-rolled copy, so an empty slot is an item not owned yet;
    • then DUP (duplicates a build could use), RW, CHARM, LOWCHARM, JEWEL, LOWJEWEL, RING (and amulets), MAG (other magic and rare items), BASE, MISC, and TRASH for copies past what the builds of every class could use. Hardcore, legacy and classic mules get an H, L or C in front.
    • Charms and jewels never go to TRASH: low rolls go to LOWCHARM and LOWJEWEL, extra unique ones stay in DUP. Duplicates show whether they rolled better or worse than the museum copy.
    • The preview shows what would happen, with item tooltips.

    The page checks that every item is kept exactly once and hands the result back as a zip of the whole organized save folder; on the web it never writes to your save folder.

  • Languages. Traditional Chinese, Simplified Chinese, English and Korean, with the game's own item names.

Works with offline characters on PC and Steam Deck, including Reign of the Warlock saves. Online (Battle.net) characters live on Blizzard's servers and can't be read; consoles aren't supported.

Safety

Everything stays on your machine: saves are read in the browser or by the plugin on the Deck, never uploaded. Only the plugin on the Deck writes to the save folder. Before every write:

  • every file in the save folder is backed up first;
  • D2R is closed (it saves on exit and would undo the write; the plugin refuses while it runs).

Organizing and putting on a loadout also check, in the plugin and the page, that:

  • the saves are byte for byte the ones the page read, so a game save in between is never overwritten;
  • no item is lost or duplicated over all files;
  • for a loadout, every main character changed only in what the loadout covers, and other mains only lost the pieces taken.

A restore puts a backup back in place of the saves, and Clean TRASH deletes the TRASH mules with their items: both by design, after the same backup.

Files are written next to their targets, renamed over them and read back, the saves receiving items before the ones giving them up, so a write cut off half way (power loss, Decky killed) leaves an item on two saves rather than none (mules trading items with each other are the exception). Either way that write's backup is the way back: the plugin writes nothing more until it is restored or the warning dismissed.

Finding your saves

  • Windows: %USERPROFILE%\Saved Games\Diablo II Resurrected
  • Steam Deck: inside the game's Proton folder, a different path on every Deck.

docs/saves.md has the steps for both, how to copy saves off a Deck, and how to put organized saves back (quit the game, back up the folder, then replace its files with the zip's).

Organizing with your own rules

The web page uses one fixed set of rules. To change them, run the organize-stash skill with an AI coding agent such as Claude Code: it walks through backing up, a dry run explained in plain words, and writing only after you agree, using scripts/organize.mjs.

Steam Deck plugin

decky/ is a Decky Loader plugin that opens the tracker from the quick access menu in Game Mode with the Deck's own saves, and gets the item icons from your installed game. On the Deck the tracker can also do what the web page can't:

  • Pickup alerts. While you play, a toast over the game says whether a unique, set item or rune you just picked up is new to the collection. Turn it off in the plugin's panel.
  • Organize and clean TRASH for real. "Organize now" writes the organized saves into the save folder instead of handing back a zip, and deletes the emptied characters you tick. "Clean TRASH" deletes the TRASH mules, items and all, after a backup. Its list of TRASH copies has item tooltips; untick a copy as "not junk" and organizing keeps that copy (just that one) in DUP from then on.
  • Loadouts. On a main character's page, save what it and its mercenary wear and the charms in its inventory under a name. The page shows where every piece of a loadout is now (on it, a mule, the shared stash, another main). Put a loadout on in one checked write: the pieces come from the mules, the shared stash or other mains (untick one to leave it where it is), and what comes off goes into the mules as organizing puts it. Quest items never move. Loadout pieces count as kept: never TRASH, never cleaned.
  • Backups. Every write backs up the save folder first. The Organize page lists the backups with buttons to restore or delete them; the newest 10 and the oldest are kept, and so are interrupted ones and those from older plugin versions. A restore backs up the folder first too, so it can be undone.

It isn't in the Decky store. To install: Decky → settings → General → turn on Developer mode, then Developer → Install Plugin from URL, and enter

https://github.com/DozenTwelve/diablo2-tracker/releases/latest/download/d2r-collection-tracker.zip

(or download the zip from Releases and use Install Plugin from ZIP file). Open the plugin, press "Get item icons from the game files" once (about a minute), then "Open collection". To update, install from the same URL again.

Development

npm install
npm run dev

The app is React and Vite. src/lib/ holds the logic (reading saves, item lookups, organizing, translations), src/components/ the pages.

  • wasm/ wraps d2s (MIT) to read and write .d2s characters and .d2i shared stashes. The built package in wasm/pkg/ is committed, so building the site needs no Rust.
  • src/data/*.json is generated from the game's own tables and string files, extracted from its CASC storage (for example with casc-cli). Raw game files are not committed.
  • Item icons are converted from your own game files into public/items/ and are git-ignored: no Blizzard art is in this repository. Without them the site works, just without pictures.
  • src/data/builds.json is copied by hand from Maxroll's "Gear Options" tables.
Command What it does
npm run gen:data [dir] Regenerate item data from extracted game files (default ~/Projects/Diablo2/d2r-gamedata)
node scripts/gen-images.mjs [dir] Convert the game's inventory icons (data/hd/global/ui/items/<group>/<type>/*.sprite) to public/items/<type>/*.webp
npm run deploy Build with the local icons and upload to Cloudflare Pages (npx wrangler login once first)
npm run build:wasm Rebuild the save parser (needs Rust, the wasm32-unknown-unknown target and wasm-pack)
node scripts/check-saves.mjs <save dir> Read a save folder with the app's code and print a summary
node scripts/organize.mjs <save dir> <out dir> [--mode SoftCore:Modern] [--mules a,b] [--inbox 4,5] [--delete a,b] [--yes] Organize from the command line: prints the plan, and only with --yes writes to a new folder after the same checks as the web page
node scripts/check-organize.mjs <save dir> Regression checks for organizing (starting kit, gold, dead heroes, stash copies, running twice...) on a copy of a real save folder in memory
node scripts/check-parse.mjs <save dir> Regression checks for reading saves (cut-short stash, corpses, golems, dead heroes, ._ files, New finds verdicts); needs a folder with a ModernSharedStashSoftCoreV2.d2i
node scripts/check-pickups.mjs <save dir> Checks for the Deck plugin's pickup alerts on a real save folder, read only; prints how long parsing takes
node scripts/check-loadouts.mjs <save dir> [<save dir>...] Checks for saving and putting on loadouts (pieces taken from mules and other mains, unticked, blocked charm cells) on copies of real save folders in memory
node scripts/check-runewords.mjs [save dir] Checks for runewords to make on hand-made items, then, given a save folder, what it can make
node scripts/check-props.mjs Check every catalog property shows as text
node scripts/check-junk.mjs Check the likely-junk rules
node scripts/check-zip.mjs Check the zip writer used for organized saves
node scripts/check-builds.mjs Check every item in builds.json is in the catalog and every text is translated
python3 decky/test_tracker.py [sprite dir] Checks for the Deck plugin's backend (writes, backups, restores, cut-off writes, icons) on any computer
cd decky && npm install && ./pack.sh Build the plugin zip, decky/out/d2r-collection-tracker.zip (after npm install at the top)

ROADMAP.md records what was planned and why.

License

GPL-3.0. Diablo and Diablo II: Resurrected are trademarks of Blizzard Entertainment, which owns the game data, item names and art. This project is not affiliated with or endorsed by Blizzard.

About

See your whole D2R stash from your own save files: collection progress, where every item is, build gear, mule organizing. Runs in the browser; saves never leave your device.

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages