MediaHub 1.19.1: safer uninstall, sharper thumbnails, sidebar tidy-up
A focused follow-up to 1.19.0. The uninstall flow is now safe and predictable, the library and inputfield serve correctly sized retina thumbnails again, and sidebar labels and collections are strictly separated.
Peter Knight
5 June 2026
MediaHub 1.19.1 is a focused follow-up to 1.19.0. It does not add new features. It makes the uninstall flow safe and predictable, fixes a thumbnail correctness regression in the library and inputfield, separates sidebar labels and collections strictly so labels stop appearing in collection-only places, and aligns view-mode icons across the library and the MediaHub inputfield.
If you are happy with 1.19.0 in production and don't plan to uninstall any time soon, the headline reason to upgrade is the thumbnail fix. If you do ever uninstall, 1.19.1 is the version you want.
Safer uninstall
MediaHub's uninstall flow is supported but opt-in: you have to declare your intent in site/config.php by setting $config->MediaHubUninstall to either 'removeAll' or 'keepAssets'. The flag is there to prevent accidental data loss. Before 1.19.1, the safeguard worked, but it ran a beat too late. By the time the validation triggered, ProcessWire had already started removing the companion modules (the admin UI and the picker inputfield) and their nav pages. You would see a clear error notice in the admin, but parts of the install were already gone underneath it.
1.19.1 hoists that validation into a hookBefore('Modules::uninstall') that fires before ProcessWire's own teardown sequence. If the config flag is missing, you get the same styled error notice as before, but nothing is touched. You can fix the config and try again, or close the dialog and walk away.
While we were in there, the rest of the uninstall flow got hardened too:
- The two companion modules are now uninstalled cleanly alongside the core module. Before, they could be left orphaned in the modules table, which led ProcessWire to re-create MediaHub pages and re-run install hooks on the next admin request: a kind of zombie reinstall loop that left a confusing trail.
- The MediaHub admin page (and its hidden nav children) is now reliably deleted. A stale page-children cache could previously omit hidden children created earlier in the same request, leaving the parent page undeletable.
- Three internal crop-reference fields added back in v1.12 are now cleaned up during uninstall instead of being left orphaned in the
fieldstable. - If any part of the teardown fails, the whole uninstall now aborts with a clear error rather than continuing in a half-state.
If you have ever uninstalled MediaHub on a 1.19.0 or earlier site and ended up with leftover artifacts, the 1.19.1 uninstall is the cleanup you wanted.
Library and inputfield thumbnails
After a fresh import of existing images (the Setup → Media Hub → Import Existing path), the library grid, masonry, and table views could show full-resolution originals instead of small thumbnails. Browsers happily downloaded several megabytes per tile, and the grid felt sluggish on portfolio sites with hundreds of images.
The root cause was a thumbnail lookup that only checked for pre-existing image variations on disk. If none were there yet (and after Import Existing they were not), it fell back to the original. Importantly, it had no mechanism to generate the thumbnail later.
1.19.1 generates thumbnails on first view if they do not already exist (a one-time cost per image; instant on subsequent loads), and eagerly during the import process so the first library view after import lands at full speed. While we were in there:
- Library grid tiles, masonry cards, table rows, and MediaHub inputfield thumbnails now output retina-ready
srcset(1x / 2x) for sharper display on high-DPI screens without oversized downloads on standard displays. - MediaHub inputfield thumbnails are now loaded with
loading="lazy"to reduce initial page weight on content with many asset fields. The library already had this; this change brings the inputfield in line.
Sidebar labels and collections
1.19.0 added Labels to the sidebar as a dedicated section, sitting underneath Collections. Visually they look similar (a list of named rows you can click to filter the library, with counts and drop targets), and that visual similarity was reflected in the underlying class structure: label rows and collection rows shared a generic sidebar-item class for layout.
The trouble was that some collection-specific code looked at that class to find collections. Two visible bugs followed:
- The bulk Add to Collection dropdown listed sidebar labels alongside the actual collections. Picking a label here did not do anything useful.
- Dragging an asset onto a sidebar label also fired a phantom collection assignment in addition to the intended label assignment. The asset ended up correctly labelled, but the network tab told a confused story.
1.19.1 splits the sidebar class taxonomy properly. A new base class is applied to every sidebar row (quick filters, collections, and labels) for shared layout, and the collection-specific class is restricted to actual collection rows. The bulk dropdown shows only collections; label rows accept label drops only. Labels and collections are now strictly separate row types throughout the sidebar.
UI consistency
The library and the MediaHub inputfield each have their own view-mode toggle (grid, proportional or masonry, detail or list). 1.19.0 mixed icon sets between the two surfaces, which made navigating from a field into the library and back feel slightly off. 1.19.1 aligns them on the same Lucide set:
- Grid uses the cleaner two-by-two grid icon, replacing the busier three-by-three.
- Proportional / Masonry uses the layout-dashboard icon.
- Detail / List uses the list icon.
The asset-detail transparency-grid toggle and the crops grid view-toggle pick up the same two-by-two grid icon for consistency. Internal mode IDs and visible labels are unchanged; only the iconography is.
Module version format
This one is for ProcessWire developers reading the modules table. MediaHub's three modules each report a version in getModuleInfo(). Prior to 1.19.1, the version was an integer (1191), and ProcessWire's formatVersion() helper rendered it as 1.1.91 because integer versions only support single-digit segments. 1.19.1 switches all three modules to semver strings ('1.19.1'), which render correctly. Existing sites upgrade without manual steps; the module's own ___upgrade() handles the format change cleanly.
Third-party attribution
1.19.1 also adds a new LICENSE_thirdparty file alongside the main LICENSE. It documents the attribution requirements for two open-source components MediaHub bundles: Lucide icons (ISC for Lucide originals, MIT for Feather-derived icons) and Cropper.js (MIT). The main LICENSE is unchanged; this file just makes the third-party situation explicit for anyone auditing.
Upgrading
No database migration is required for 1.19.1. No breaking changes. Existing sites pick up the fixes by upgrading; the version-format change is handled transparently.
If you saw the "thumbnails are the full size of the original" issue and your library already contains existing images, the fix kicks in the next time you view those library pages: missing thumbnails are generated on demand, and from then on they are served instantly.
Download
MediaHub 1.19.1 is available from the 1.19.1 download page. The full list of changes is in the changelog; the Admin docs still hold for editor workflows, and the findRaw API docs from 1.19.0 are unchanged.