MediaHub 1.19.25: custom fields, upload refresh, and a unified library
Custom metadata on shared assets via ProcessWire's field model, a refreshed upload screen, on-demand library thumbnails (4 files per image down to 1 at upload), unified library and picker toolbars, and Import page images with Repeater support.
Peter Knight
18 June 2026
Organise uploads: collections, labels, and a refreshed upload screen
Uploading assets to MediaHub is a fundamental part of the module and one of the first experiences a user will have. It was also one of the first parts I designed. As the rest of the module became more refined, the upload experience needed a review.

The upload page had grown a lot of capability behind a layout that still felt like an early prototype. 1.19.25 reframes it around a scrollable card queue: file-type icon or lazy thumbnail for images, inline status, per-file progress, and inline filename editing on each row.
Above the dropzone, an Organise uploads bar lets you assign collections and labels before the batch starts, using the same filter-button and portalled picker pattern as library bulk actions.

Selected tags collapse into a dismissible summary strip when the panel is closed. Upload settings stay hidden until you add files (or open them via the gear on the dropzone), then slide in smoothly.
During a batch you can cancel in flight (completed files stay done; pending files return to the queue), retry individual failures, and watch a master progress bar with byte-weighted percentage across the whole batch. Oversized files stage with a clear warning but are excluded from upload. The queue header shows a live count badge that turns green when the batch completes.

If you upload from a page editor instead, direct field upload from 1.19.0 is unchanged in spirit: same validation pipeline, same immediate cards. The library upload page is where the visual refresh landed.
Custom fields: ProcessWire's model, MediaHub's shared-asset context
In ProcessWire, images and files come with a default set of fields: Title and Alt/Description. You get remarkable mileage from those alone. Almost every image needs a title and description, but there are times when you want editors to associate a little more data with a file: a copyright note, a checklist of social media channels an image has been authorised for, or anything else your organisation needs.
I've never really used custom fields in my work, but it was an early request from a user. I knew I wanted to support it. Importantly, MediaHub should not build a parallel field system. It should integrate with ProcessWire's standard custom-field workflow instead, so it feels instantly familiar to developers who have used custom fields on native image or file fields before. Create a field in Setup, attach it to a template, and MediaHub discovers it automatically. The asset template is pkd-mediahub-asset (show system templates in Setup to find it). Your field appears on the asset detail page in the library and, by default, in every InputfieldMediaHub drawer wherever editors pick that asset on a page.
The part that matters for shared assets is the inherit-with-override model, which matches how Title and Alt already behave:
- The library master (asset detail) holds the canonical value. Edit it on the asset detail page and every reference inherits it by default.
- On a page level, custom fields are displayed below the usual Title, filename, Description, and Tags. The page drawer lets an editor override that value for one reference only. The override saves when the page saves. No separate save button on the custom fields block.
- A small reset control appears next to any overridden field so you can revert to the library value in one click.
- On a MediaHub input field, the developer might choose to display custom fields in a different order than on the asset detail page.

For template output, direct field access still returns the master: $asset->copyright. When you need the effective value (override if present, else master), use MediaHub::getRefValue($page, 'gallery', $asset, 'copyright').
High-volume read paths can opt custom fields into findRaw() and get override-aware values without loading full page objects.
Two tiers when one drawer is not enough
Some metadata belongs to the asset everywhere (photographer credit, licence URL). Other metadata belongs to how the asset is used on a specific field (a homepage-only social media line). MediaHub 1.19.25 supports both:
- Tier 1 (asset-level): fields on
pkd-mediahub-asset. Master + per-reference override + reset. - Tier 2 (field-specific): create a file-less template named
mediahub-field-{fieldName}(mirroring ProcessWire's nativefield-{fieldName}pattern for image fields). Fields on that template appear only in that MediaHub field's drawer. Values are per-reference only; there is no library master.
We have verified functionality with the following field types: Text, Textarea, and Options (select, radio, checkboxes).
Other standard ProcessWire fieldtypes should work on the asset detail page; the drawer is best kept to simple inputs. Complex types (CKEditor, Repeater) are detail-page territory for now.
Full setup, API examples, and troubleshooting: Custom Fields documentation.
Import and custom fields
MediaHub has two places where you can import existing images into your library: Scan and import, and Import page images. Both copy files and map built-in metadata.
Currently, they do not migrate custom asset field values from legacy Pageimage fields. Plan to re-enter editorial metadata after import, or script a one-off migration if you have hundreds of rows. A dedicated migration tool is on the roadmap, but custom field integration is simple enough that you might prefer to do this manually for now.
Smarter thumbnails: less work at upload, faster bulk imports
Previously, every upload into MediaHub generated several thumbnail sizes up front, in anticipation of needing them across the module. In practice that meant four separate resized copies on the server: grid, retina grid, list, and inputfield preview. A batch of 100 images could produce 400 new files before you opened the library, often doubled again if your site writes WebP companions.
1.19.25 takes a leaner approach:
- One preview at upload. Each image gets a single small proportional preview for inputfield cards. That is roughly 75% fewer auto-generated files at upload time.
- One library thumb per asset. Grid, Masonry, and List share the same canonical proportional thumbnail. CSS handles grid cropping.
- Built on first browse. The full library size is generated the first time you scroll that asset into view, not during upload. Bulk batches finish faster and the library no longer triggers a resize storm on first open.
- No grey placeholders. While the library size is being prepared, the upload preview already on disk is shown immediately.
The asset picker and Import Existing Images scan table use the same on-demand model. Scan table cells no longer pull full-size originals into 72px frames.
Library bulk actions and toolbar polish
When you select one or more assets in the library, the breadcrumb row swaps for a compact bulk action bar in the same context bar: clear selection, count, then icon actions for Collections, Labels, and Delete. The Details toggle stays on the right. Search and filter controls in the toolbar above stay available.

Collections and Labels bulk actions open the same checkbox picker pattern: search, assign, unassign, create new. The old separate "Add to collection" and "Remove from collection" buttons are replaced by a single unified collection picker (also used from per-tile menus). Bulk delete confirmation is usage-aware for a single asset and reports total crop variants across a multi-select.

The toolbar filter row (Type, Collections, Labels, Crops, Sort) now uses custom button menus with tick marks instead of native selects, in both the library and the picker. Sort is a single icon button with a context menu. Press Escape or use the clear control in the bulk bar to deselect all.
Sidebar counts (All Assets, Favourites, Recently Added, Labels, All Collections) cache for 60 seconds to cut repeated queries. Assigning a label or collection no longer bumps the asset's modified timestamp, so organised assets do not reappear under Recently Added by accident.
Library and picker unification
As MediaHub has grown, the library needs to appear in more than one place depending on what the user is doing. There are three instances: the main Image Library, the library shown when picking from a MediaHub field, and a third when selecting an asset from the TinyMCE icon.
Although visually and functionally similar, the three views could drift as features or UX landed in one place and not the others: different filter controls, different collection paths in dropdowns, a missing sidebar, six columns on wide screens while the library capped at five.
To avoid those inconsistencies, 1.19.25 takes a more modular approach. Shared partials now drive the toolbar, sidebar (with a read-only mode for the picker), and filter JavaScript so the surfaces stay aligned.
The picker gains a collapsible filter-only sidebar on the Media Hub tab (hidden on "On this page"), the same searchable Collections filter, clearable filter pills, hover title/filename overlays when Details is off, and layout that keeps the Insert footer visible without scrolling the grid. Choosing a Type filter no longer makes the filter button vanish when the field has a hard type restriction: that restriction moved to a separate lock param so editors can still change the filter within allowed types.
Import page images
The per-field Import page images workflow (gradual migration from native image fields) gets a visual overhaul and deeper scanning. Badge copy is rationalised to New, Exact match, Likely match, Possible match, and Already added. Stats, legend, "Select all new (N)", and filters sit in a sticky subheader while you scroll the list.

Repeater and RepeaterMatrix items are now included: the scan walks nested items up to three levels deep and groups results under breadcrumb headings like Gallery → Slides → Images. The import endpoint uses each image's physical source page id so files inside repeater item pages resolve correctly.

Large pages and modest hosting get explicit hardening: longer time and memory limits on scan/import endpoints, server-side try/catch with JSON errors, a 200-selection cap per import request, and client-side checks so an HTML error page from a timeout does not surface as a cryptic JSON parse failure.
See Import page images and Limitations for scope and beta notes.
Asset detail sidebar
The metadata sidebar on the asset detail page is now split into Asset details (Title, Filename, Alt/Description, plus custom fields in a compact nested card) and Asset Internal Notes (About, Collections, Labels). The old "Library Organisation" heading is gone. The intent is to separate content metadata editors might quote on the front end from internal library housekeeping you use for filtering and workflow.
Fixes worth knowing about
- Bulk selection is preserved when switching between Grid, Masonry, and List views.
- Collections created from the asset detail page are now published pages, consistent with collections created via Folders.
- Import Existing Images cache banner counts update after a successful import; "Select all new" resets correctly between scans.
- Library view switches no longer cause a horizontal layout jump when the collections sidebar is collapsed; Details toggle state no longer flashes the wrong way on view change.
- JSON API routes discard buffered PHP noise before responding, which fixes false upload Retry errors on dev sites with display_errors enabled.
- Animated GIF thumbnails no longer trigger ImageSizer resize errors in the upload queue.
Upgrading
No database migration is required. No breaking API changes. Sites on 1.19.0, 1.19.1, or the 1.19.2 preview upgrade in place through the normal Modules screen.
After upgrade, existing library images pick up the new on-demand thumbnail behaviour the next time you browse those assets. Bulk imports and fresh uploads should feel noticeably lighter on disk and CPU.
Custom field definitions live in ProcessWire's own field tables. They survive module upgrades and uninstall (flagged as Preserve in Uninstall Preparation). Reinstalling MediaHub recreates the asset template with built-in fields only; re-attach your custom fields to pkd-mediahub-asset to surface them again. No data loss.
Download
MediaHub 1.19.25 is available from the 1.19.25 download page. The full list of changes is in the changelog. New docs: Custom Fields. Updated guides: Uploading, The Admin, Import page images.