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
Your saves are read in your browser (WebAssembly) and never uploaded. There is no server side, no account and no tracking.
-
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,SETmules), 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, andTRASHfor copies past what the builds of every class could use. Hardcore, legacy and classic mules get anH,LorCin front. - Charms and jewels never go to
TRASH: low rolls go toLOWCHARMandLOWJEWEL, extra unique ones stay inDUP. 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.
- uniques and set items in fixed "museum" slots (
-
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.
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.
- 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).
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.
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
TRASHfor 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 theTRASHmules, items and all, after a backup. Its list ofTRASHcopies has item tooltips; untick a copy as "not junk" and organizing keeps that copy (just that one) inDUPfrom 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.
npm install
npm run devThe 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.d2scharacters and.d2ishared stashes. The built package inwasm/pkg/is committed, so building the site needs no Rust.src/data/*.jsonis 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.jsonis 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.
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.