When the library needs sorting out, the usual responses are: a cleaner plugin, a long afternoon of guessing, or a bigger hosting plan. Here's the honest breakdown against all three.
Cleaner-style plugins have been at this for years and handle the common cases — but the failure mode is well known: a reference format they don't parse (a page builder's JSON, a custom field storing a bare id) and a live image lands in the "unused" pile. Deleting from that list is how hero images vanish. Manual triage — opening images one by one and searching the site for each — is accurate and takes roughly forever; nobody finishes a 1,400-image library that way. Buying more storage is the default outcome of the other two failing: the bloat compounds into every backup, migration and bill, forever. WP Media Audit (this site) is built around trust: usage resolved everywhere references really live — classic and block content, featured images, Elementor page data (ids and URLs inside the JSON), ACF fields verified through ACF's own field-key twin so coincidental numbers never count, site settings, widgets and term images — with the reasoning shown per image, over-capture by design, re-verification at the moment of trashing, and a cleanup that only ever goes to the restorable trash. The plugin never deletes a file itself.
| Feature | WP Media Audit | Cleaner plugins | Manual triage | More storage |
|---|---|---|---|---|
| Finds truly unused images | ✓ Proven, reasoning shown | ◐ Verdicts without reasons | ✓ Eventually | ✗ Keeps everything |
| Elementor data coverage | ✓ Ids AND urls in the JSON | ◐ Varies — the classic breakage source | ◐ If you think to check | ✗ N/A |
| ACF fields without false alarms | ✓ Twin-verified only | ◐ Naive matching is common | ◐ Depends who's looking | ✗ N/A |
| Safe to act on | ✓ Re-verified at trash time, restorable | ◐ Acts on the stored scan | ✓ You checked yourself | ✓ Nothing happens |
| Duplicates by content hash | ✓ Renamed copies caught | ◐ Often a second plugin | ✗ Invisible by eye | ✗ Stored twice, paid twice |
| Oversized incl. kept camera originals | ✓ The -scaled trick accounted for | ✗ Rarely surfaced | ✗ Practically invisible | ✗ That IS the bill |
| Alt-text audit, split by in-use | ✓ One click to the images | ✗ Not their job | ◐ A separate spreadsheet | ✗ N/A |
| Client-ready deliverable | ✓ White-label report + PDF + CSV (Pro) | ✗ No | ◐ Whatever you write up | ✗ An invoice |
| Stays audited afterwards | ✓ Weekly/monthly digest w/ deltas (Pro) | ✗ One-off cleanups | ✗ Nobody does it twice | ✗ Compounds instead |
| Cost | From $49/yr · $599 lifetime | Free–$70/yr | Free + your weekends | Forever, per gigabyte |
Your library is small and young enough to know by heart — manual works fine at fifty images. And if an established cleaner plugin has served you without incident on your specific stack, that's a real track record; we'd rather acknowledge it than pretend otherwise. The setup we'd talk you out of is deleting from any tool's "unused" list without shown reasoning, on a site with a page builder or custom fields — that's the exact combination that ends with a restore from backup.
The library has history — years of uploads, several hands, a page builder, custom fields — and you want the unused list proven rather than guessed, the duplicates found by content, the storage weight explained, and a cleanup you can undo. That's us.
One honest line: no scanner can see references stored in a format it has never met, ours included. That's why detection over-captures, why every image is re-verified at the moment of trashing, and why cleanup only ever goes to the restorable trash — the failure mode is designed to be boring.