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
MediaHub 1.19.25 is the release where several long-running threads come together: custom metadata on shared assets, a calmer and faster upload and library experience, and a picker that finally shares the same toolbar and filters as the main library. If you installed the early 1.19.2 preview, this is the same feature set with fixes on top. The version number bumped so ProcessWire detects the update cleanly on sites that already had the preview.
Nothing here is breaking for existing template code. Your foreach ($page->gallery as $asset) loops keep working. Custom fields and the upload refresh are additive. The thumbnail work changes what happens on disk over time, not how you query assets in templates.
Custom fields: ProcessWire's model, MediaHub's shared-asset context
Built-in Title and Alt/Description cover a lot, but they are not enough for every site. Newsrooms want credits and embargo notes. Marketing teams want OG descriptions that can differ per article without cloning assets. Agencies want channel clearance flags that travel with the file in the library.
MediaHub did not build a parallel field system for this. It integrates ProcessWire's standard custom-field workflow: 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 in the 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 holds the canonical value. Edit it on the asset detail page and every reference sees it by default.
- 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.
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 OG line). 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.
Verified end-to-end in this release: 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
Import paths (Scan and import, Import page images, Import by URL) copy files and map built-in metadata. 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.
Upload screen refresh
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: type-coloured icon, lazy thumbnail preview, 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.
Smarter thumbnails: 4 files per image down to 1
Previously, every completed upload automatically created four separate resized copies on the server (grid, retina grid, list, and inputfield preview sizes). A batch of 100 images could mean 400 new files on disk from upload alone, often doubled again if your site generates WebP companions. Import Existing Images could trigger the same pattern: lots of resize work up front, then a sluggish first library view.
1.19.25 changes the contract:
- Upload: one small proportional preview per image (for inputfield cards), not four. 100 uploads = 100 thumbnail files, not 400.
- Library views: Grid, Masonry, and List share one canonical proportional thumbnail per asset (CSS handles grid cropping). MediaHub no longer stores a separate file per view mode.
- On first browse: the full library thumbnail is built the first time you scroll an asset into view, not during upload or import. Bulk jobs finish faster; the library no longer triggers a resize storm on first open.
- On screen: lazy loading plus the upload preview or a low-quality placeholder while the library-size thumb is prepared, so freshly uploaded or imported images do not sit as empty grey boxes.
- Import Existing Images and the asset picker follow the same on-demand model. The scan table loads small previews on demand (reusing existing ProcessWire variations where they already exist) instead of generating multiple sizes per imported asset up front.
Library bulk actions and toolbar polish
When you select assets in the library, action icons for Collections, Labels, and Delete appear in the breadcrumb row itself. Same bar, same space: a selected count, clear control, and the action icons sit where the filter trail was. You do not jump to a different toolbar or lose the surrounding context.
That reverses a common old workflow. Before, bulk organisation often meant creating a collection or label first (in the sidebar or under Folders), then dragging tiles onto it or choosing a target from a dropdown. Now you tick the assets you want, then open one picker to assign memberships, search existing collections or labels, or create new ones inline. The same unified collection picker is 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.
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 consistency
Mostly a tidy-up, but worth calling out: for a long time the TinyMCE and Inputfield picker could drift from the main library (different filter controls, different collection paths in dropdowns, a missing sidebar, six columns on wide screens while the library capped at five). 1.19.25 extracts shared partials for the toolbar, sidebar (with a read-only mode for the picker), and filter JavaScript so both 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: a reminder, then the 1.19.25 polish
Per-field Import page images is not new in this release. It has shipped since MediaHub v1: turn on Import from page images in a field's picker settings and editors see an Import page images button next to Choose whenever the page has other image fields with files in them. The workflow is deliberately gradual. You add MediaHub fields beside legacy FieldtypeImage fields, open a page, scan what is already there, confirm matches, import, and move on. When a template is fully migrated you drop the old fields. No site-wide flip, no guessing in the library picker about which tile matches the hero already on the page.
What makes it worth revisiting is the matching engine. Every source image is compared against the whole Hub on four independent signals:
- Filename stem (same name without extension)
- File size (exact byte count)
- Dimensions (width and height)
- Perceptual hash (dHash): a 64-bit visual fingerprint from a 9×8 grayscale resize. Hamming distance ≤ 5 counts as visually identical, so
IMG_4523.jpgon the page can matchoffice-team.jpgalready in the Hub even after a re-save or compression pass.
Those signals roll up into confidence badges: New, Exact match, Likely match, Possible match, and Already added. When at least one secondary signal confirms a match (not filename alone), import adds a reference to the existing Hub asset. No duplicate file, no second copy on disk. Low-confidence rows can still be imported as new assets if you choose. Alt text, PW image tags (as Hub labels), and an audit line in About travel with confirmed imports.
What 1.19.25 actually changes
This release is mostly a visual and reliability pass on top of that existing workflow:
- Modal UI overhaul: sticky subheader with stats, legend, Select all new (N), and filters while you scroll
- Rationalised badge copy across badges, legend, and tooltips
- Repeater and RepeaterMatrix scanning up to three levels deep, grouped under breadcrumb headings like Gallery → Slides → Images
- Each scanned image carries the ID of the page it physically lives on (the content page or a repeater item page), so imports resolve files inside nested repeaters correctly
- Hardening for large pages: extended time and memory limits, JSON errors instead of HTML on failure, 200-selection cap per request, client-side guards against timeout pages masquerading as JSON
Full matching tables, enable steps, and beta notes: Import page images and Limitations.
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.
- Label autocomplete on the asset detail page, library and picker filter dropdowns, the upload organise bar, and the Folders move picker could return empty titles instead of the label name, so suggestions were unusable. Label titles are now serialised correctly everywhere those pickers appear.
- Labels are included in asset detail autocomplete regardless of publication status.
- 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.