Changelog
What changed in each release of MediaHub v1.x.
v1.17.0 (20 May 2026)
The headline release of the v1.17 cycle: Focus Point cropping. Set the important part of an image once, and MediaHub uses it when framing auto-generated crops and when you open the crop editor. Also in this release: opt-in SVG upload support and improved compatibility with the ProcessWire KONKAT light admin theme.
Focus point cropping
- New: Focus point on images. A Focus point button appears on the asset detail page, on MediaHub field cards (Detail mode), and in the crop editor toolbar. Drag the marker to your subject and click Save focus point. The marker defaults to the centre of the image until you move it.
- New: Focus-aware crop generation. When you move the focus point away from that default centre, auto-generated crops (including inline crop badges on MediaHub field cards) frame around it. In the crop editor, toggle Focus on or off to show or hide the marker while you work. Crop and focus editing share the same canvas, and choosing a preset positions the initial crop around your focus point. Existing crops are not regenerated automatically; delete and re-create a crop, or re-save from the crop editor, to apply a new focus point to an existing preset.
- New: Per-field Focus point setting. Each MediaHub field has a Focus point selection option (Enabled / Disabled) under its Input settings. Enabled by default. Switch it off for fields that hold icons, logos, or other decorative graphics.
Crop editor
- New: Unified crop editor. One consistent editor now opens from every crop entry point: the asset detail page, inline crop badges, and MediaHub field cards. Action buttons sit at the bottom of the modal.
- Changed: Crop preset sidebar visibility is now intent-based. The sidebar appears when you are choosing a preset to crop with; it stays hidden when you are adjusting an existing crop or editing focus only.
- Changed: Improvements to the rendering of the crop boundary when the editor opens.
- Fixed: A CSS fix means the inline crop stays within the selection when re-editing a saved crop badge.
- Fixed: Crop editor now opens correctly from MediaHub field cards (toolbar and handles no longer clipped by the admin layout).
- Changed: Redundant "Presets" heading removed from the crop sidebar.
SVG support (opt-in)
- New: SVG uploads, off by default. A new SVG Support section in module config (Modules → Configure → MediaHub) holds an Allow SVG uploads checkbox and a sanitiser status indicator. Existing sites see no change after upgrade until SVG is explicitly enabled.
- New: Sanitisation required. SVG uploads require Ryan Cramer's FileValidatorSvgSanitizer module. If the sanitiser is not installed while the option is enabled, uploads are refused with a clear message.
- Changed: Crop and Focus are not available for SVG assets. The Crop and Focus buttons are hidden on SVG asset cards and on the SVG asset detail page. Inline crop badges are not rendered for SVGs.
MediaHub field — Detail mode
- Changed: Refreshed card layout. Detail-mode image cards now show a Crop · Focus · Edit action strip directly below the filename, with file metadata (dimensions · size · format) inline to the right. The image drawer toolbar uses the same style.
- Changed: Inline crop badges are regular-weight with more breathing room between chips.
- New: Focus point button in the Edit drawer. The side drawer opened from the pencil icon now includes a Focus point button alongside Crop.
- Fixed: Newly-added field cards in Detail mode now show the correct aspect ratio and thumbnail immediately, without requiring a page save.
- Fixed: Focus point button appears on newly-added field cards without requiring a page reload.
Asset detail page
- Changed: Refreshed layout. The main detail panel is now a bordered card; the page background shows through around it.
- New: Modified column in the Crops table. Shows when a crop was last edited, alongside the existing Created column.
- Changed: Crop thumbnails in the table view now display at their natural aspect ratio.
- New: Usage-aware delete confirmation. Deleting an asset or crop now warns you if the item is referenced on other pages, with a link to view usage. Crop variants attached to an image are mentioned in the same confirmation.
Admin UI
- Changed: Improved compatibility with the ProcessWire KONKAT light admin theme.
Bug fixes
- Fixed: The focus point indicator updates correctly after saving on every surface: asset detail page, field cards, and the edit drawer.
- Fixed: Asset titles in the picker's Crops panel no longer display as
[object Object]on multilingual sites. - Fixed: Saving a focus point no longer fails silently on modern ProcessWire versions.
- Fixed: Changing the focus point now regenerates cached image variations so front-end resized images reflect the new framing.
- Fixed: Focus dot state resets cleanly when switching between Focus and Crop on the same image.
v1.16.0 (9 May 2026)
A consolidated release covering admin-navigation improvements, a new drag-to-reorder feature in MediaHub fields, several bug fixes, and a small security hardening pass for the URL importer.
Admin navigation
- Optional MediaHub link in the admin top bar. A new module setting (Show MediaHub link in main navigation) adds Media Hub to the admin top bar, sitting alongside Pages, Setup, Modules, and Access. Disabled by default; the existing Setup → Media Hub entry-point is always present and unaffected.
- Custom label for the top-bar link. When the top-nav option is on, a new Custom label field lets you override what appears in the top bar. Useful when the localised "Media Hub" string is verbose (e.g. Polish Centrum multimedialne, Welsh Canolbwynt y Cyfryngau) or when your team prefers a different term (Media, Assets, Library, DAM). Leave blank to keep the localised default. The Setup → Media Hub label is unaffected.
Library and inputfield
- Drag-to-reorder thumbnails in MediaHub fields. When a field has two or more selected assets, you can now drag any thumbnail to a new position in any view mode (grid, proportional, detail). The new order is reflected in
$page->yourFieldimmediately on Save, so template helpers like->first(),->last(), and->eq(N)return assets in the order you arranged them. - Master "select all visible" checkbox in the list view header. Tick the column header to select every row currently rendered; untick to clear.
- "Add more" button now matches stock InputfieldFile in font, colour, hover state, and icon spacing across AdminThemeUikit, Reno, and Default.
Bug fixes
- Library search now covers Alt/Description, Labels, and Collections. Previously search only matched the asset title and filename. Searching by exact ID is also now reliable.
- Renamed filename and title in the upload queue are now applied on upload. Editing the filename stem or title in the upload queue rows had no effect; the values were not transmitted to the server. Both fields are now picked up and saved with the new asset.
- Duplicating an asset preserves its Collections and Labels. Cloned assets were losing the page-reference fields. Both are now copied explicitly to the new asset. The duplicate confirmation message also clarifies that crops are not copied (they can be re-generated on the duplicate).
- Cleaned up a stray PHP warning in the library view left over from the v1.15.0 Tags → Labels rename.
- PHP 8.5 deprecation notice in the MediaHub inputfield resolved (explicit nullable parameter typing).
Defensive changes
- Server-side upload batch limit now matches the configured browser-side limit. Previously the server hard-capped to 50 files per request even if Maximum upload batch had been raised higher; both ends now read the same setting.
- Bulk-import requests are now capped at 500 selections per request. Selecting thousands of existing site images at once was holding a single PHP request open for many minutes with no progress feedback and no resume path on failure. Larger jobs now surface a clear message asking you to import in batches.
- Upload temp-file cleanup window extended from 60 seconds to 5 minutes, to avoid deleting an in-flight temp file mid-write on slow connections.
- Container pages at the site root reinforced as hidden + system on upgrade, so the data-tree containers (Media Hub, Labels, Collections, Assets, Crops) cannot accidentally appear in front-end navigation.
Security
- Import-by-URL is now safer on shared and self-hosted servers. Imports from external URLs are now hard-capped at 5 MB per file (typical web images are well under that; anything larger should be downloaded manually and added with the regular file uploader), refuse URLs that resolve to private or reserved IP ranges (mitigating server-side request forgery), and reject any non-HTTP(S) protocol on the initial request and on any redirect.
v1.15.4 (21 April 2026)
- Fixed: Crop export dimensions now match the preview. Saved crops were smaller than the preview dimensions showed when the image was displayed at less than 100% scale in the crop editor. The export now uses the original image pixel dimensions regardless of how the image is scaled in the UI.
- Fixed: Transparent PNGs are preserved through cropping. Cropping a PNG with transparency was producing a JPEG with a black background. The crop export and all auto-generation paths now detect the source format and preserve transparency for PNG, WebP, and GIF sources.
- Fixed: "Auto-generate crops on upload" restored. The checkboxes in module settings for auto-generating crops on upload were not triggering crop creation. Checked presets now generate a centred crop for each new image at upload time. A duplicate guard prevents redundant crops when multiple processes trigger generation simultaneously. The settings section includes an advisory note about hosting impact when many presets are checked.
v1.15.3 (16 April 2026)
- Changed: Composition grid in the crop editor. The rule-of-thirds grid lines that Cropper.js v2 already renders inside the crop selection are now visible by default, in both the library crop editor and the inline crop editor on input fields. The lines stay subtle over the image but are bright enough to use for composition.
- Changed: Larger resize handles. The eight resize markers on the corners and edges of the crop boundary go from Cropper.js v2's default 5×5 px to a 12×12 white square with a thin dark outline, so they're easier to spot and drag, particularly on dense images and high-DPI displays.
- Changed: Two save options in the input field crop editor. When you open the crop editor from a field — either by clicking the Crop image button on a card or by re-cropping a preset badge — the toolbar now shows Save as crop and Save as new asset, matching the asset detail page. "Save as crop" creates a child crop linked to the source. "Save as new asset" creates a standalone Library asset and adds it to the field as a new card. The previous single button has been replaced.
- Fixed: Freeform "Save as crop" from the input field now lands in the Library. When you opened the crop editor freeform from a card's Crop image button and chose Save as crop, the crop was being saved against the current page and field with no place to view it, so the success message felt like nothing had happened. Freeform Save as crop now saves the crop at the library level so it appears on the source asset's detail page in the Crops section. Re-cropping a named preset badge still saves against the current page and field, preserving per-page-per-preset customisation.
- Fixed: Crop save notification now tells you where the crop went. The success notification was a generic "Crop saved successfully." It now reads Crop saved to "[Asset Title]" for library-scoped crops and Crop saved for this field. for preset badge crops, so you can find the crop after saving.
v1.15.2 (16 April 2026)
- Fixed: Freeform "Crop image" always starts from the full image. Clicking the Crop image button on an asset card or on the image editor toolbar was restoring whichever freeform crop had previously been saved for that asset, often surfacing an off-centre, small selection from a legacy save. The freeform editor is now treated as a one-shot action: it always opens with the selection fitted to the entire image. Named preset crops (Square, 16:9, etc.) still restore their saved boundaries when re-edited from the inline crop badges.
- Fixed: Crop boundary alignment in the inline crop editor. The starting selection was offset down and to the right by 20px because the calculation measured the image position against the outer canvas wrapper, which has 20px of padding. The selection now measures against the inner Cropper.js canvas element so the boundary lines up exactly with the image edges.
v1.15.1 (16 April 2026)
- Fixed: Crop editor opens with a sensible starting selection. The library crop editor and the inline crop badge editor previously opened with a small, off-centre crop boundary (Cropper.js's default 50% coverage), which looked random and required manual adjustment for every crop. The boundary now fills the entire image for a freeform crop, or the largest area matching the chosen aspect ratio (centred on the image) for a preset crop. Switching presets while the editor is open also resizes the boundary to fit, instead of resetting to the small default.
v1.15.0 (16 April 2026)
The big release of the cycle. See the 1.15 release blog post for the story behind these changes; the list below is the canonical, complete change list.
Breaking
- Library Tags renamed to Labels. The global taxonomy that powers internal filtering and search is now called "Labels" throughout the module, removing the long-standing confusion with the per-reference display tags editors assign on individual page references. Per-reference display tags are unchanged. Template code needs a search-and-replace:
$asset->tags()becomes$asset->labels(),$asset->hasTag(...)becomes$asset->hasLabel(...). The selector field namepkd_mediahub_tagsbecomespkd_mediahub_labels. The admin URL changes from/setup/media-hub/tags/to/setup/media-hub/labels/. The migration is automatic and idempotent: fieldgroups, templates, fields, the admin nav child page, and the container page are all renamed in place on upgrade. Existing label assignments are preserved. - Search-and-replace guide:
->tags()→->labels(),->hasTag(→->hasLabel(,pkd_mediahub_tags→pkd_mediahub_labels.
Drawer save model
- New: Per-reference Title, Alt/Description and Tag edits auto-apply as you type. The misleading "Save" button in the offcanvas drawer has been removed. The card updates in real time, the page's own Save button is now the one and only commit point, and the drawer hint reads "Changes apply as you type. Save the page to commit them." This is the same model every other ProcessWire field uses.
- New: Explicit "Rename file" button next to the filename input. File rename is a separate, immediate action that physically moves the file on disk, so it has its own button. Disabled until the filename stem changes. Embedded references in TinyMCE rich-text editors and any field-level crops are updated automatically.
- New: Reset-to-inherited buttons. When a per-reference override is active for Title or Alt/Description, a small refresh icon appears next to the label. Clicking it reverts that field to the global library value with one click.
Drawer and card visual polish
- Changed: File-type identity icon in the drawer header sits to the left of the asset title and filename. Images get an image icon, PDFs a document icon, video / audio / spreadsheet / presentation files each get their own.
- Changed: Consistent label spacing across all four drawer fields (Title, Filename, Alt/Description, Tags). All labels now share a single CSS rule for font, weight, colour and gap to input.
- Changed: Drawer image preview reframed. Removed the grey-blue background; image now sits in a thin 1px border consistent with other framed elements, with extra top and bottom margin.
- Changed: "Alt text" relabelled to "Alt/Description" everywhere. Drawer field, thumb card label, library detail page, TinyMCE picker, module config, README. Aligns the label with ProcessWire's native description field convention. The
$assets->description($asset)helper continues working as a deprecated alias for$assets->altText($asset). - Changed: Removed the "Screen readers & SEO" hint below Alt/Description (the label is self-explanatory) and the Actions section (Download, Copy URL) from the drawer.
Non-image assets in fields
- Changed: Non-image cards in grid and proportional view modes match the Library tile design. Type-specific Lucide icon, bold title, monospace filename, badge row with breathing room, single remove button. The icon column has a white background; the title/filename column has a subtle muted background. File type and size badges have been dropped in grid and proportional views to keep the cards compact (they remain in detail view).
- Fixed: Inline crop badges no longer appear on non-image assets added client-side.
- Fixed: Checkerboard transparency background suppressed on non-image detail-mode cards. Replaced with a plain subtle background and a centred type icon.
- Fixed: Drawer image preview shows the file icon for non-image assets, instead of attempting to render a broken image element.
- Changed: Alt/Description field hidden in the drawer for non-image assets. Alt text is an HTML
<img>attribute and isn't part of the standard for other file types.
Inputfield toolbar styling
- Changed: Active view-mode button (Grid / Proportional / Detail) uses the brand pink instead of the dark blue admin theme colour, so the current view is unambiguous.
- Changed: Size slider redesigned. 100px wide, 7px high, no border, with a solid pink fill to the left of the dragged circle.
TinyMCE
- New: Dedicated MediaHub image editor in TinyMCE. Double-clicking a MediaHub image in a rich-text field, or inserting a new one from the picker, now opens a purpose-built editor with three alignment buttons (left, centre, right, with centre as the default for new inserts), width and height inputs (aspect ratio locked, so changing one updates the other), a size slider for quick scaling, an Alt/Description field, and a checkerboard toggle for previewing transparent PNGs. Non-MediaHub images continue to use ProcessWire's native dialog.
- Fixed: MediaHub embeds keep their link to the library asset across page saves. On certain configurations the marker that connects an embedded image, video, audio or download link back to its source asset was being lost during the save round trip, breaking double-click-to-edit and rename tracking on subsequent saves. MediaHub identity now persists reliably across all supported asset element types.
- Fixed: Double-click on a MediaHub image in TinyMCE opens the MediaHub image editor again. A handler ordering issue meant ProcessWire's native image dialog was capturing the event before the MediaHub editor could. Non-MediaHub images continue to open ProcessWire's native dialog as before.
- Fixed: File rename from the inputfield drawer now works. A request format mismatch caused renames triggered from the drawer to fail silently. Renames now reach the server and complete as expected.
- New: Live rename sync to TinyMCE editors. When you rename a file from the inputfield drawer, any open TinyMCE editor on the page is updated immediately so the embedded image continues to load. No page reload required.
Per-reference metadata
- Fixed: Field-level Title and Alt/Description edits no longer overwrite the global asset. Drawer edits were being treated as global updates instead of per-reference overrides, so customising a title on one page was changing the title on every page that used the asset. Drawer edits are now correctly scoped to the page+field they came from, the same way Tags already were.
- Fixed: Per-reference overrides are removed when an asset is removed from a field. Previously the override stayed behind, and re-adding the same asset later re-applied stale title and alt text. Overrides are now reconciled with the assets actually in the field on every page save.
- Fixed: Thumb cards reflect per-reference overrides. The card title and alt text were rendering the global asset values directly, making your overrides invisible until you opened the drawer.
- Changed: Thumb card "Description" block relabelled "Alt text" to match the drawer field. Legacy override entries from earlier versions are normalised on load.
Admin
- Changed: "Labels" menu item moved below "Folders" in the Setup → Media Hub navigation. The order is now Library / Upload / Folders / Labels / Import.
Documentation
- Changed: Crop architecture documented. The docs now explain the distinction between library crops (visible in MediaHub's Crops table, reusable everywhere, created in the Library) and field-level crops (scoped to a specific page+field combination, hidden from the Library, created by the inline crop badges on the inputfield). The lookup chain
resolvedCropImage()is documented alongsideensureCropImage(). - Changed: TinyMCE rename tracking documented. A note explains that MediaHub embeds keep a link back to the source asset so renames update the embed automatically, and that this link is preserved across page saves.
- Changed: Every MediaHub doc page updated for the Labels rename: API examples, selectors, nav references, the Tags page rewritten as Labels.
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 labels 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 label management.
Last updated