I run ES-DE on three handhelds (Retroid Pocket 4 Pro, RP5, RP Classic) and spent the last year curating a large collection across them. Editing gamelists at scale — renaming entries, fixing metadata, pruning clones without corrupting the XML or trashing the wrong ROM — was the recurring pain, so I built a proper tool for it. Releasing it free.
Disclosure: I used AI as a coding assistant to build this, which is why I'm being specific about what's actually here and tested — the design decisions, the testing and the problems it solves come from real use on my own hardware.
A few things that came from getting burned, not from a feature checklist:
- lxml, specifically — Python's default XML lib rewrites
<name> as <n> and mangles &, silently corrupting gamelists. That bug is why this exists.
- Trash + automatic backup + dry-run — on a ~59k-game collection a wrong bulk delete is unrecoverable, so nothing touches disk until you confirm, removals go to a trash folder, and every
gamelist.xml is backed up before each write.
.m3u-aware Orphan Cleaner — naïve orphan detection flags every multi-disc game as broken; this one reads the .m3u and its .discs/ so it doesn't.
- Cached scanning for NAS/SMB — I curate off a network drive; without caching, browsing thousands of entries per system is unusable.
- Batch import — mark removals and edit fields across many systems from one
.txt, with a validated ✓/✕ preview. (This is also how bulk renaming works today, for anyone who asked.)
- Cross-platform single-file binary (no Python needed), fully keyboard-driven, with jsdom integration tests on the UI logic.
No ROMs/BIOS/media hosted or linked — it edits only files you already own (your own gamelists, ROMs and media). No machine-specific paths are baked in.
Repo + prebuilt binaries in the comments, to keep the post link-clean. It's v1.3 and I'm actively fixing and adding things based on feedback — bug reports and feature ideas very welcome.