New: “Optimize It” button in the Media Library list view — click to optimize any existing JPEG, PNG, or SVG attachment on demand without re-uploading.
New: File Size column in the Media Library — shows the current on-disk size of every attachment. Can be toggled off in Settings.
Improvement: Media Library column CSS moved to a dedicated stylesheet (assets/css/media.css) and properly enqueued, keeping PHP templates clean.
Fix: “Show Filesize Column” toggle was placed outside the settings form and never saved correctly — now included in the form submission.
1.3.0
New: Secure SVG upload support — administrators can now enable SVG uploads for specific user roles via Settings > BinsOptimizer.
New: Role-based SVG upload permission — choose exactly which user roles (Administrator, Editor, Author, etc.) are allowed to upload SVG files.
New: Server-side SVG sanitization — every SVG is cleaned with a DOMDocument-based sanitizer before it is stored. Strips <script> tags, <foreignObject>, event-handler attributes (on*), dangerous href/xlink:href URI schemes (javascript:, vbscript:, data:application/), and unsafe CSS constructs before saving.
New: SVG media library compatibility — SVG attachments now display correctly in the Media Library grid and modal, report accurate intrinsic dimensions, and render properly in the Block Editor image block.
New: SVG frontend display — wp_get_attachment_image() and responsive image helpers work correctly for SVG attachments; srcset generation is disabled for SVGs (vector format needs no size variants).
New: SVG Auto-Optimization setting — a separate toggle controls whether SVG files are automatically converted to WebP on upload (off by default). When disabled, SVGs are uploaded and stored as native SVG files.
1.2.0
New: Optimization column added to the Media Library list view — each attachment now shows a colour-coded badge displaying the savings percentage and output format (e.g. “42.3% webp”).
New: Hovering the savings badge reveals a tooltip with the original file size, optimised file size, and total bytes saved.
New: The Optimization column is fully sortable — click the column header to rank media items from most-saved to least-saved (or vice versa).
New: Unoptimised attachments display a neutral “Not optimized” badge so the column is informative for every item in the library.
Improvement: Savings percentage is now also persisted as a dedicated post meta key (_biio_savings) alongside the existing attachment metadata, enabling reliable numeric sorting without serialized-field parsing.
1.1.0
Fix: Media Library stats panel never rendered in the single-column Details view due to incorrect Backbone template override — switched to a render() override matching the correct pattern.
Fix: Fatal JavaScript TypeError when conversionTime is absent from stored metadata — added null guard before calling .toFixed().
Fix: canvas.getContext(‘2d’) could return null for very large images — added explicit null check before drawing to canvas.
Fix: Metadata queue stored in transients was vulnerable to object-cache eviction — migrated to a persistent WordPress option (biio_metadata_queue).
Fix: Typo in save-error button label “Fied to Save” corrected to “Failed to Save”.
Fix: Save success button label showed “Saving Changes” after the save had already completed — corrected to “Saved!”.
Fix: Redundant __biio_converted event flag removed; a single biio_converted flag is sufficient to prevent re-processing loops.
Fix: Removed dead is_admin() guard inside admin_enqueue_scripts hook (the hook already only fires in admin context).
Improvement: Removed all debug console.log / console.warn statements from production JS bundles.
Improvement: Deactivation hook now cleans up the persistent option queue instead of a transient.