Displays diff between local game files and Steam depot file list (from SteamDB), and lets you delete extra files per-file to Recycle Bin.
Tested with D:\Games\Assassin's Creed (AppID 15100) — correctly identifies mod extras: scripts/*, dinput8.dll, imgui.ini, REXAGAMES.COM.url, testapp.exe.
- Scan Local: recursively enumerates
Game Folder(relative\paths, case-insensitive, likeSak32009PathHelper.NormalizeKey). - Fetch Depot:
- Primary (no ownership needed): embedded
WebView2(Edge) tohttps://steamdb.info/app/{AppID}/depots/and/depot/{DepotId}/. You solve Cloudflare captcha manually if prompted, then clickExtract Depots/Extract FilesorAuto Fetch All. JS mirrorsSak32009/GetDataFromSteam-SteamDB:- Depots:
tr[data-depotid]+td[data-sort]+ OS detection (Windows/macOS/Linux/all). - Files:
#files.tab-pane .table.depot-filesDataTable().data()fallback to plaintbody trparsing, hash truncatedfirst10***last10handling (HashService.HashMatches).
- Depots:
- Fallback:
Import manifest(hash *pathtext,*.manifest,DepotDownloader -manifest-onlyoutput, orSak32009export). AlsoLoad/Save cache(%AppData%\SteamGamesCleaner\cache\{AppID}.json, 3-day expiry). - Advanced: bundle
DepotDownloader(SteamKit2) for owned games:DepotDownloader.exe -app X -manifest-only -username ...then import manifest.
- Primary (no ownership needed): embedded
- Compare:
DiffService(ce.withSteamDBlogic) →Extra (local only),Missing (depot only),Modified (hash mismatch),OK. Merge across selected depots (default Windows/all). Path separatorse/oenormalized. - Hash: optional streaming
SHA1(HashService.ComputeSHA1Async) with progress, truncated-hash support. Without hashes, diff is filename+size; with hashes, exact/partial match. - Delete: checkbox per row (Extra pre-checked) →
RecycleService(Microsoft.VisualBasic.FileIO.FileSystem.DeleteFile(..., RecycleOption.SendToRecycleBin)), confirm dialog, bulk delete with log, empty dirs not removed automatically (safe).
- Run
publish\SteamGamesCleaner.exe(orbin\Release\net8.0-windows\SteamGamesCleaner.exe). Requires Edge WebView2 Runtime (preinstalled on Win11). - Enter
AppID(e.g.15100) andGame Folder(Browse…). - Click
Scan Local. - In left browser, wait for
https://steamdb.info/app/15100/depots/to load. IfJust a momentappears, solve captcha, wait for table. - Click
Extract Depots→ depots appear in list (check desired OS, e.g. Windows). - Either:
- Visit each depot (
https://steamdb.info/depot/{id}/) and clickExtract Files, or clickAuto Fetch All(iterates checked depots automatically). - Or
Import manifestif you have a.manifestfile (fromManifestAutoUpdateetc).
- Visit each depot (
- Click
Compare (build diff). Filter viaFilter+Search. - Optional:
Compute SHA1 for Extra/Mismatch(slow for large.forgefiles) for hash verification. - Check files to remove,
Delete Selected → Recycle Bin(restorable).
- SteamDB blocks direct
HttpClient(403verified). This app uses user-initiated WebView2 so you solve captcha once — no auto-bypass, respectssteamdb.info/faqno-scraping rule. - Some depots show
File names are encrypted/No files→ SteamDB bot doesn't own that depot (needs donation/key since 2022manifest request codes). UseImport manifestworkaround. - Depot file hashes are truncated
10+10in HTML; the app correctly matchesstartsWith/endsWithlikeSak32009.
dotnet build SteamGamesCleaner.csproj -c Release
dotnet publish SteamGamesCleaner.csproj -c Release -r win-x64 --self-contained falseRequires .NET 8 SDK and Microsoft.Web.WebView2 NuGet (already restored).
Models/DepotFile.cs— DepotFile, DepotInfo, DiffRowServices/PathHelper.cs—oe/senormalizationServices/LocalEnumerator.cs,HashService.cs,DiffService.cs,CacheService.cs,RecycleService.csServices/SteamDbExtractor.cs— JSJsExtractDepots/JsExtractFilesMainWindow.xaml/MainWindow.xaml.cs— UI + orchestration
- Defaults to Recycle Bin, never permanent unless Shift+Delete is added (not enabled).
Extraonly pre-checked;Missing/OKrows not selected.- Confirm dialog shows count + size + 12 sample paths.
MIT (Sak32009 logic ported per MIT).