Changelog
What changed in each release of MediaHub v1.x.
v1.11.4 (10 April 2026)
- Fixed: Corrected the v1.11.0 container rename migration so it works reliably across all ProcessWire versions.
v1.11.3 (10 April 2026)
- Fixed: Clicking "Choose" on a MediaHub inputfield inside a newly added (unsaved) Repeater Matrix item no longer opens duplicate stacked picker modals.
- Fixed: Resolved an upgrade error ("You may not modify 'name'") that could occur during the v1.11.0 container rename migration (corrected in v1.11.4).
v1.11.2 (10 April 2026)
- Fixed: License settings screen improvements. Fixed a display issue where a link in the license key description was rendered as raw text instead of a clickable link. Updated the example key format and improved the registration status messages shown after entering a key.
v1.11.1 (7 April 2026)
- Changed: Internal update to licence registration endpoint. No action required; existing installs continue to work automatically.
v1.11.0 (3 April 2026)
- New: All asset types in TinyMCE picker. The MediaHub picker opened from the TinyMCE toolbar now shows all file types — images, PDFs, videos, audio, documents — not just images. The type filter dropdown is available for narrowing.
- New: MIME-aware insertion. Selecting an asset from the TinyMCE picker inserts the correct HTML for the file type:
<img>for images,<video controls>for video,<audio controls>for audio, and<a>download links for documents. All inserted elements carrydata-mediahub-idfor rename tracking. - New: Context-aware confirm button. The picker confirm button label adjusts based on the selected asset: "Insert image", "Insert video", "Insert audio", or "Insert link".
- New: MediaHub assets in Insert Link → Select File. Files from MediaHub fields on the current page appear in the Insert Link dialog's Select File dropdown as "Media File: filename.ext".
- New: "Select from Media Hub" in Insert Link dialog. A new collapsible section with a Browse button lets editors link highlighted text to any asset in the full MediaHub library without leaving the Insert Link dialog.
- New: Non-image tiles always show identity. In Library grid and masonry views, non-image tiles display their title, filename, and type/size badges regardless of the Details toggle state.
- New: Non-image cards auto-lock to detail layout. Non-image files in MediaHub fields render as compact detail cards (icon + title + filename + badges) regardless of the chosen view mode. The size slider has no effect on these cards.
- New: Edit/remove overlay on non-image cards. Non-image files now show the same hover overlay (edit pencil, remove X) as image thumbnails.
- New: "Images" → "Assets" container rename. The internal container page is automatically renamed from "Images" to "Assets" on upgrade to reflect the expanded file type support.
- Fixed: Offcanvas edit panel shows a file-type icon instead of a broken image placeholder for non-image assets.
- Fixed: Non-image cards no longer collapse or render with broken geometry in proportional view.
- Fixed: "Images" → "Assets" upgrade migration now fires reliably for all sites upgrading from earlier versions.
v1.10.0 (2 April 2026)
- New: Drag-and-drop onto Collections. Drag one or more selected asset tiles and drop them onto any collection or folder in the sidebar panel to assign them instantly. Multi-asset selection is respected. A custom canvas-rendered ghost image shows a card stack with a count badge.
- New: Thumbnail size slider in InputfieldMediaHub. A slider to the left of the view toggle buttons controls the display size of image thumbnails inside the field. Applies to images only. State persists via
localStorage. - New: Proportional display in InputfieldMediaHub. Images now display at their natural aspect ratio instead of being forced into a square frame. Landscape and portrait images each take a width that matches their proportions.
- New: Collections submenu in tile context menu. A Collections… entry always appears in the asset tile ⋯ context menu. Clicking it opens a cascading flyout listing every collection with a checkbox. Toggling immediately assigns or removes the asset (AJAX, no reload). Includes a Done button; Escape and click-outside also close the flyout.
- New: Library state persistence — zero flash. Chosen view (Grid / Masonry / Table), Details toggle, and Collections sidebar collapsed state all persist across page reloads, logouts, and browser sessions. Inline scripts read
localStoragebefore elements paint — no flash of incorrect state. - New: Click-to-select rows in Table view. Clicking anywhere in a row selects it (toggles the checkbox), except the Title column which continues to navigate to the asset detail page.
- New: Sticky Collections panel. The Collections sidebar sticks to the top of the viewport while scrolling a long library.
- New: Logging control. Logging is now off by default. A new Enable logging module setting and Clear Logs button are available in module configuration.
- Improved: Collections panel UI — smaller heading, tighter folder indentation, better row spacing.
- Improved: Tile context menu and Collections flyout use a portal pattern (appended to
<body>when open) so they always render on top in any grid layout. - Improved: Table view — horizontal scrolling on narrow viewports; corrected link colours; filename column wraps freely.
- Fixed: Tags input: guard against
[object Object]appearing as a tag token after pressing Enter.
v1.9.0 (30 March 2026)
Major performance overhaul for the site-wide Scan & Import feature and library view. Tested with 25,000 images across 316 pages. See the full write-up for methodology and numbers.
- Improved: Scan performance (825x faster). Removed
getVariations()from the scan loop (was 96% of processing time). ReplacedPageimageobject hydration withfindRaw()for image metadata. Thumbnails in scan results now use the original image scaled by CSS instead of server-side GD resize. A 25,000-image scan completes in 2-3 seconds locally, 6-8 seconds on shared hosting. - Improved: Import performance (18x faster). Deferred thumbnail generation from import to first library view (was 88% of import time). Reduced database saves from 3 to 2 per image. Cached source page/field lookups for batch imports. Increased client-side batch size from 5 to 25 images per AJAX request. File copy uses hardlink where possible.
- Improved: Library loads instantly after import. New
pkdMhFastThumb()function checks for existing thumbnail variations without triggering GD. Assets without thumbnails are served as CSS-scaled originals. Background JavaScript generates thumbnails silently via AJAX; subsequent page loads serve the smaller files. - New: Scan results pagination. Results table paginates at 100 images per page with navigation controls. Combined with
loading="lazy"on images, the browser only loads what is visible. - New: Image counts in filter dropdowns. Field and template filters show how many images each contains (e.g. "images_cars (2,500)"), helping users gauge import scope and stagger imports by category.
- New: Estimated import time. The import confirmation dialog shows a time estimate based on measured per-image performance before the import begins.
- Fixed: Cached scan results that exceeded storage limits no longer cause a fatal error; the user is prompted to run a new scan instead.
v1.8.1 (27 March 2026)
- Changed: Default
max_upload_batchlowered from 200 to 50 for safer out-of-the-box behaviour on lower-spec servers. - Fixed: Privacy disclosure in the Licensing fieldset was rendering raw HTML instead of formatted text.
- Improved: Custom crop preset placeholder text lightened to clearly distinguish empty fields from filled values.
- Improved: Upload Automation layout: ratio column now matches other column widths; group headings use the standard heading colour with more spacing above.
- Improved: Refined license key field description and notes copy.
v1.8.0 (25 March 2026)
Knowing which sites run MediaHub (and which version they're on) makes support faster, helps prioritise compatibility testing, and gives a clearer picture of how the module is used in the wild. This release adds an optional, non-blocking license registration field to the module settings. It does not gate any functionality: every feature works identically whether or not a key is entered.
- New: Optional license registration. A "Licensing" fieldset on the module config page accepts your license key. On save, the key is validated and the install is registered. The status is shown inline: activated, invalid format, quota reached, or not registered.
- New: Fully non-blocking. An incorrect, expired, or missing license key never prevents the module from loading, saving, or rendering. MediaHub is fully functional at all times.
- New: Automatic environment migration. If you move a site from local to production (or between hosts), the license re-registers itself on the next admin page load. No manual deactivation required.
- New: Local/dev detection. Localhost,
.local,.test,.dev,.ddev.site, non-standard ports, and private IP ranges are all recognised as development environments. Local installs do not consume your production activation quota. - New: Privacy disclosure. A collapsible note on the config screen explains exactly what data is sent (license key and site URL). No other data is transmitted.
v1.7.0 (25 March 2026)
- New: One-step install. ProcessWire now installs all three modules automatically when you install MediaHub, and uninstalls them in reverse order. No more manual three-step process.
- New: Two uninstall modes.
removeAll(delete everything, the default) orkeepAssets(remove module infrastructure, keep your uploaded files on disk). - New: Config-based uninstall gate. Add
$config->MediaHubUninstall = 'removeAll'or'keepAssets'tosite/config.phpbefore uninstalling. Without this setting the uninstall is blocked, preventing accidental data loss. - New: Uninstall audit in module settings: a collapsible panel showing exactly what will be removed (page counts, disk usage, templates, fields) before you proceed.
- New: Uninstallation section in README covering backup recommendations, mode selection, and what is removed.
- Fixed: Uninstall now reliably removes all pages, templates, and fields across all module versions.
- Fixed: Parent page deletion no longer fails after children are removed.
- Fixed: Uninstall cleanup always completes, even if individual page deletions encounter errors.
v1.6.1 (23 March 2026)
- Fixed: Removed stale "Renaming changes the file URL" warning from the asset detail drawer. Renaming now automatically updates all rich text embeds.
v1.5.0 (23 March 2026)
- New: Custom crop preset groups: assign a group name (e.g. Social, Front Page, Editorial) to any custom preset. Groups appear as collapsible sections in the crop editor sidebar, field settings, and module settings.
- New:
ensureCropImage($preset, $width, $height)for lazy crop generation in templates. Creates a mathematically-centred crop on first call; returns the existing crop on subsequent calls. Never overwrites an editor-curated crop. - New: Admin-side lazy generation: when a MediaHub field with inline crop presets is rendered in the page editor, any missing preset crops are auto-generated silently. Editors see filled badges immediately.
- New: Template restriction for crop badges: a per-field AsmSelect limits badge visibility to specific templates. Leave blank to show badges on all templates.
- New: Key uniqueness enforcement: custom preset keys that collide with a Default key or another custom key are auto-suffixed (
_2,_3, …) at runtime with a builder warning. - New: Human-readable preset labels in the TinyMCE/picker drawer (e.g. 4:5 instead of 4_5).
- New: Crop position restored on preset selection in the full-page editor; revisiting a preset restores the previously saved position for fine-tuning.
- New: Group name shown in badge hover popup and as a muted sub-label in the Crops table on the asset detail page.
- Changed: Built-in renamed to Default throughout the admin UI (crop editor, field settings, module settings).
- Changed: Redundant Presets heading removed from crop editor sidebar; group names serve as the visual hierarchy.
- Changed: Full-page crop editor resets to Freeform on fresh open; no stale preset selection from a previous session.
- Fixed: Crop pages selected from the picker disappeared on save.
- Fixed: On this page tab in the TinyMCE picker did not show images referenced on the current page.
- Fixed: Editing a crop via badge, then saving the page, could break the crop image reference in rich text.
- Fixed: Error during lazy crop generation on certain page setups.
- Fixed: Template restriction for badge visibility was not applied correctly.
v1.4.0 (18 March 2026)
- New: Library UX overhaul: masonry view, collapsible details toggle, and pagination.
v1.3.1 (18 March 2026)
- New: Control size system (
pkd-mediahub-ctrl-sm) for uniform toolbar control sizing. - Fixed: Responsive toolbar; import thumbnail pre-generation on scan.
v1.3.0 (18 March 2026)
- New: Fullscreen picker overlay matching crop editor style.
- New: Grid, masonry, and list modes in the media picker; unified picker and library design system.
- New: Upload queue UX improvements: progress display, filename normalisation, no duplicate results.
v1.2.0 (18 March 2026)
- New: TinyMCE integration: insert MediaHub images into rich text with rename-safe URL tracking.
- New: Live search, improved search matching, and collection tooltips in the picker.
- Changed: PHP 8.0 is now the minimum required version.
- Changed: Unified versioning: the three modules (
MediaHub,ProcessMediaHub,InputfieldMediaHub) now share a single version number.
v1.1.3 (15 March 2026)
- New:
max_upload_batchmodule config setting (default 50) prevents browser tab crashes when hundreds of files are batch-selected. Excess files are dropped with a dismissible warning explaining the limit. - New: Crop badges now appear immediately when a new image is added to a MediaHub field; no page save required. Status is fetched via the
get-crop-statusAPI and badges are injected into the card dynamically. - New: Slide-out panel exposes editable Title and Filename fields (with extension badge and rename warning) and a labelled Alt text field with a "Screen reader description" hint.
- Fixed: Crop badge hover previews now display at the correct aspect ratio; thumbnails are generated width-only (240 px) so landscape, portrait, and square crops each show their true shape.
- Fixed: Slide-out panel now shows the image name and filename above the thumbnail again (accidentally removed in an earlier rewrite).
- Fixed: Slide-out panel form field styling now matches the asset detail page (font size, border, background, and placeholder text are all consistent).
- Fixed: Crop thumbnails on the asset detail page display proportionally with a chequered background (previously fixed 160×120 squares).
- Fixed: Edit and delete action buttons are now consistently positioned top-right on newly-added cards.
- Changed: Slide-out panel Apply renamed to Save to match detail page wording.
- Changed: Crop Image removed from the slide-out panel Actions section; cropping is managed from the dedicated asset detail page.
- Changed: Built-in crop presets on the module config page are now rendered as read-only rows matching the Custom Presets layout.
- Changed: Usage table on the asset detail page now enforces fixed column widths with ellipsis truncation, preventing long page names from breaking the layout.
v1.1.2 (13 March 2026)
- Fixed: Removed
webpfrom the default allowed file extensions. GD cannot resize WebP source images, so allowing WebP uploads by default caused images to silently display at original size. Sites that need WebP uploads should enable Imagick and addwebpmanually in module configuration. - Changed: Module configuration UI description for maximum image dimensions now clarifies that WebP uploads are not resized unless Imagick is available.
v1.0.10 (18 March 2026)
- New: Compact list-style upload queue with parallel XHR uploads and per-file progress display.
- New: Library thumbnail pre-generation: thumbnails are created immediately after upload so the library loads instantly without on-demand generation delays.
- New: Retry button on failed upload queue rows.
v1.0.7 (12 March 2026)
- Fixed: Undefined variable notice and invalid
foreach()warning on the asset detail page after saving a crop.$legacyVariantswas assigned as$_legacyVariantsat the top of the detail view but referenced without the underscore in both variant loops. Both loops now also use?: []so they degrade safely to empty on modern installs.
v1.0.6 (12 March 2026)
- Fixed: WebP thumbnail generation now correctly detects that GD cannot resize WebP source images. The previous check tested whether GD could write WebP output, not read it as input. Imagick is now required for WebP resize; GD falls back to the original image.
- Fixed: PHP 7.x compatibility: the
match()expression in the image resize helper has been replaced with aswitch/caseblock. - Fixed: Fresh installs at v1.0.4 or later were missing all crop infrastructure because the installer did not run the crop setup steps. The installer now runs all upgrade steps idempotently.
- Changed: The delete button has been removed from the grid tile hover overlay; it was too easy to trigger accidentally. Delete is now a clearly separated danger item at the bottom of the ⋯ context menu, with a confirmation modal.
v1.0.5 (12 March 2026)
- Fixed: Broken thumbnail images on servers where GD cannot write WebP variations. A shared
pkdMhSafeThumb()helper now checks whether a variation file actually exists before using its URL, falling back to the original image throughout the library, detail page, picker, inputfield, and import scan. - Improved: All native browser
confirm()andalert()dialogs replaced with styled modals consistent with the rest of the admin UI.
v1.0.4 (12 March 2026)
- InputfieldMediaHub registered as an available inputfield for FieldtypePage fields.
v1.0.3 (10 February 2026)
The biggest internal change in the v1 series: images now live in a dedicated FieldtypeImage field, unlocking the full ProcessWire image API for all assets.
- New: Images stored in
pkd_mediahub_image(FieldtypeImage), giving full PW image API support (resize, crop, width, height, srcset). Non-image assets continue to use the file field. - New:
image()method onPkdMediahubAssetPagereturns aPageimage. Thefile()method still works for both images and documents. - New: Upload routing: MIME type is detected before storage; images are routed to the image field automatically.
- Upgrade: Existing image assets are migrated from the file field to the image field on module upgrade.
v1.0.2 (10 February 2026)
- Fixed: Selected assets now persist correctly after page save.
- Fixed: Field template configuration is auto-corrected on save to ensure asset pages are accepted by the field.
v1.0.1 (February 2026)
- Picker modal with single and multi-select mode, asset thumbnails, and remove/replace actions.
- Auto-registration with InputfieldPage's allowed inputfield classes.
v1.0.0 (February 2026)
- Core module (
MediaHub): installs templates, fields, thepkd_mediahub_usagedatabase table, and the library page structure. - Admin module (
ProcessMediaHub): top-level admin page with library, upload, asset detail, API, and tags views. - Configuration (
MediaHubConfig): allowed file extensions, max upload size, items per page. - Upload processing: file validation and storage via
MediaUploader. - Admin views: library, detail, upload, picker modal, and tag management.