= 4.3.3 =
*Release Date - May 6, 2026*

* added: filters for plugins that offload media to cloud storage to integrate with S3 detection, props @alessandrocarrera
* fixed: performance regression when Lazy Load checks parent elements for skip-lazy exceptions

= 4.3.2 =
*Release Date - February 10, 2026*

* fixed: Easy IO domain not reset after site URL is updated
* fixed: PHP 8.5 compatibility
* fixed: PHP warnings and notices

= 4.3.1 =
*Release Date - December 4, 2025*

* fixed: Lazy Load auto-sizing makes images too small when screen size changes
* fixed: failure to decode CSS background images contained in encoded quotes (&apos;)

= 4.3.0 =
*Release Date - November 18, 2025*

* added: Lazy Load support for background images in external CSS files
* added: View CDN bandwidth usage on settings page
* changed: Lazy Load checks parent element for skip-lazy class
* changed: Lazy Load auto-sizing honors High DPI setting
* changed: Easy IO fills in 450px wide image when responsive (srcset) images have a gap
* improved: Lazy Load performance when searching for img elements
* improved: Lazy Load placeholder generation is faster and works better with Safari
* fixed: Lazy Load for iframes breaks WP Remote Users Sync plugin

= 4.2.1 =
*Release Date - August 26, 2025*

* fixed: Some preload URLs not updated

= 4.2.0 =
*Release Date - July 15, 2025*

* added: Easy IO support for dynamic cropping (crop=1) on WordPress.com sites
* fixed: PHP warnings related to HTML parsing
* fixed: PHP warnings when link URLs contain special regex characters

= 4.1.0 =
*Release Date - March 26, 2025*

* added: exclude private BuddyBoss media from Easy IO with page:buddyboss exclusion
* added: ability for 3rd party plugins to hook into Lazy Load HTML parser
* changed: improved performance of custom *_option functions on multisite
* fixed: Easy IO rewriting some URLs when full page exclusions are used

= 4.0.0 =
*Release Date - November 26, 2024*

* added: Above the Fold setting for Lazy Load (previously EIO_LAZY_FOLD override)
* changed: gravatar images excluded from Above the Fold/EIO_LAZY_FOLD counts
* fixed: Easy IO adding images to srcset combined with broken WooCommerce gallery thumbnails causes oversized image sizes to be loaded
* fixed: Easy IO srcset filler using incorrect width for calculations

= 3.9.4 =
*Release Date - October 31, 2024*

* fixed: Lazy Load for iframes results in empty src attribute
* fixed: Lazy Load breaks --background CSS variable

= 3.9.3 =
*Release Date - September 12, 2024*
* fixed: HTML syntax for noscript fall-back when lazy loading picture elements
* fixed: is_file wrapper method triggers PHP warning 
* fixed: some strings not properly i18n 

= 3.9.2 =
*Release Date - July 25, 2024*

* changed: skip lazy load for LCP images based on fetchpriority when auto-scaling is disabled
* changed: improve performance of ewwwio_is_file(), props @rmpel
* changed: require PHP 8.1 or higher
* fixed: Lazy Load and Easy IO fail to decode URLs with HTML-encoded characters, which causes esc_url to break the URL
* fixed: Easy IO fails to update CDN domain if site is re-registered while still active

= 3.9.1 =
*Release Date - May 29, 2024*

* added: warning when hiding query strings with Hide My WP
* changed: much better resizing for PNG8 and other paletted PNG images
* changed: apply async loading to lazyload JS using WP core functionality

= 3.9.0 =
*Release Date - April 23, 2024*

* added: Easy IO delivery for JS/CSS assets from additional domains
* added: Easy IO support for Divi Pixel image masks
* changed: Lazy Load checks for auto-scale exclusions on ancestors of lazyloaded element
* fixed: Help links broken in Firefox's Strict mode

= 3.8.0 =
*Release Date - April 11, 2024*

* added: Lazy Load can use dominant color placeholders via Easy IO
* added: ability to filter/parse admin-ajax.php requests via eio_filter_admin_ajax_response filter
* changed: improved smoothing of LQIP for Lazy Load when using Easy IO

= 3.7.0 =
*Release Date - March 20, 2024*

* added: support for upcoming Slider Revolution 7 rendering engine
* added: update existing image preload URLs
* added: Lazy Load automatically excludes preloaded images
* fixed: Easy IO skipping Slider Revolution 6 URLs
* fixed: Lazy Load incorrectly auto-scales fixed group background images

= 3.6.0 =
*Release Date - February 14, 2024*

* added: Lazy Load for CSS background images in external CSS files or internal CSS sections
* fixed: Easy IO applying resize parameters to existing (re)sizes
* security: improve authentication for some plugin actions

= 3.5.5 =
*Release Date - January 4, 2024*

* fixed: Easy IO incorrectly modifies JS/CSS URLs when using S3 on multisite

= 3.5.4 =
*Release Date - November 28, 2023*

* fixed: Easy IO strips extra sub-folders in non-image URLs
* fixed: PHP notice from VC fix

= 3.5.3 =
*Release Date - November 2, 2023*

* fixed: too much scaling for Visual Composer background images with zoom effect

= 3.5.2 =
*Release Date - September 21, 2023*

* fixed: Lazy Load compatibility with X/Pro themes and Cornerstone builder
* security: sanitize and escape a few remaining strings

= 3.5.1 =
*Release Date - September 5, 2023*

* changed: use updated coding standards
* changed: sanitize/escape remaining strings on settings page
* security: randomize filename of debug log

= 3.5.0 =
*Release Date - July 19, 2023*

* added: Easy IO rewrites poster/thumbnail image URLs for video elements
* changed: Easy IO + Auto Scale checks images on load and resize events to reduce browser upscaling
* changed: prevent Easy IO font substitution when OMGF is active
* fixed: Auto Scale downscales too much for landscape images displayed in portrait containers
* fixed: Easy IO compatibility with Brizy thumbnail generation endpoint

= 3.4.0 =
*Release Date - June 28, 2023*

* added: deliver Google Fonts via Easy IO or Bunny Fonts for improved user privacy
* fixed: incorrect syntax for constants in namespaced code

= 3.3.0 =
*Release Date - May 9, 2023*

* breaking: namespaced and reorganized several classes, third party integrations should check for compatibility
* added: Easy IO support for BuddyBoss images, video, and documents
* added: improved support for Hide My WP Ghost in Lazy Load 
* changed: improved Auto Scaling when using full-width layout in Elementor
* changed: style tag search/regex cleaned up to prevent excess markup
* fixed: content dir functions don't resolve symlinks
* fixed: Easy IO image URLs leaking into image gallery block via post editor
* fixed: clearing debug log does not redirect back to settings page in rare cases

= 3.2.4 =
*Release Date - March 23, 2023*

* changed: allow video files to go through Easy IO CDN (pass through)
* fixed: PHP 8.1 deprecation notices from usage of add_submenu_page and add_query_arg

= 3.2.3 =
*Release Date - December 1, 2022*

* changed: improved Brizy Builder compatibility
* fixed: Easy IO fails to apply crop for custom size in some cases
* fixed: Easy IO not applying watermark consistently on PNG images
* fixed: Easy IO not scaling watermark when scaling original image

= 3.2.2 =
*Release Date - October 18, 2022*

* changed: improved detection for site URL changes
* fixed: Lazy Load JS throws error if inline script vars are missing
* fixed: Easy IO + Lazy Load auto-scale produces invalid URL if an image with no query string is constrained by height

= 3.2.1 =
*Release Date - October 4, 2022*

* fixed: PHP notices when Easy IO filters srcset URLs

= 3.2.0 =
*Release Date - September 26, 2022*

* added: exclude by page for Easy IO and Lazy Load
* changed: include upstream lazysizes unveilhooks for use by developers, props @saas786
* fixed: better compatibility with S3 Uploads when using autoload
* fixed: Easy IO srcset URL construction not accounting for object versioning with S3 (or other cloud storage)

= 3.1.3 =
*Release Date - August 25, 2022*

* added: image watermarking, configure at https://ewww.io/manage-sites/
* fixed: prevent WP core from generating duplicate WebP images

= 3.1.2 =
*Release Date - July 28, 2022*

* fixed: trailing space on image URL handled incorrectly
* fixed: lazy load sometimes incorrectly scales images in AffiliateWP portal

= 3.1.1 =
*Release Date - July 20, 2022*

* fixed: Lazy Load not using EWWWIO_CONTENT_DIR
* fixed: Lazy Load Auto-scale adds query parameters to SVG images
* fixed: Lazy Load prevents image loading in GiveWP iframe
* fixed: Auto Scale crops too much for object-* images in Oxygen

= 3.1.0 =
*Release Date - June 7, 2022*

* added: AVIF support via Easy IO, enable on site management at ewww.io
* added: ability for Easy IO to get full-size path when using offloaded media
* fixed: front-end HTML parsers running within Bricks editor
* fixed: Easy IO not finding scaled full-size for dynamic size generation
* fixed: cover images not cropped properly by Easy IO
* fixed: Easy IO URLs leaking into post editor with WP 6.0

= 3.0.2 =
*Release Date - May 19, 2022*

* changed: Easy IO WebP quality can be defined separately from the JPG quality used for resizing operations
* fixed: Lazy Load integration with WooCommerce Product Recommendations handling AJAX output incorrectly

= 3.0.1 =
*Release Date - April 7, 2022*

* changed: image links constrained to 2560px, use EIO_PRESERVE_LINKED_IMAGES to override

= 3.0.0 =
*Release Date - April 5, 2022*

* added: Lazy Load and CDN support for multiple background images and mixing with gradients
* changed: all Easy IO settings available to all plan levels
* fixed: LQIP and SVG placeholder options not auto-loaded correctly
* fixed: invalid path in translation loader

= 2.9.2 =
* fixed: Easy IO was adding srcset markup for SVG images

= 2.9.1 =
* added: use decoding=async to prevent images from blocking text render
* fixed: Auto-scale incorrectly handles Divi parallax background images
* fixed: native lazy loading used on inline PNG placeholders

= 2.9.0 =
* changed: Lazy Load no longer excludes first image in a page due to potential CLS issues and auto-scaling suppression
* fixed: AMP detection throws notices in some cases
* fixed: Easy IO misses some image URLs on multi-site when using domain-mapping
* fixed: Lazy Loader incorrectly parses fall-back iframe from Google Tag Manager, triggering 403 errors in some WAF systems
* fixed: Easy IO URL rewriter changing links if they matched a custom upload folder
* fixed: Easy IO incompatible with Toolset Blocks
* fixed: Easy IO incorrectly sizing wide/full width cover blocks
* fixed: SWIS CDN compat called too early in some cases

= 2.8.2 =
* fixed: error when disabling Easy IO
* updated: instructions for disabling Jetpack site accelerator

= 2.8.1 =
* changed: first image in a page is assumed to be "above the fold" and will not be lazy loaded, override with EIO_LAZY_FOLD constant
* fixed: mismatched quotes break HTML markup in some cases
* fixed: Lazy Loader incorrectly parses fall-back iframe from Google Tag Manager, triggering 403 errors in some WAF systems
* fixed: Easy IO could not properly resize PNG-8 images
* fixed: default WebP quality was too high

= 2.8.0 =
* added: EIO_LAZY_FOLD override to configure number of images above-the-fold that will be skipped by Lazy Load
* added: Easy IO URLs for custom (non-WP) srcset markup
* added: Easy IO support for CSS background images with relative URLs
* fixed: Easy IO scaling not working on full-size images without srcset/responsive markup
* fixed: Lazy Load skips images dynamically created by Brizy builder
* fixed: Easy IO conflict on Elementor preview pages
* fixed: EXACTDN_CONTENT_WIDTH not effective at overriding $content_width during image_downsize filter

= 2.7.4 =
* added: Easy IO and Lazy Load support for AJAX responses from FacetWP
* changed: Vimeo videos excluded from iframe lazy load
* changed: use 'bg-image-crop' class on elements with CSS background images that need to be cropped by auto-scaling
* fixed: sub-folder multi-site installs which use separate domains could not activate Easy IO
* fixed: Lazy Load PNG placeholders cannot be cached if the WP_CONTENT_DIR location is read-only (notably on Pantheon servers)
* fixed: is_amp() called too early
* fixed: Fusion Builder (Avada) does not load when Lazy Load or Easy IO options are enabled

= 2.7.3 =
* fixed: local PNG placeholders enabled with Easy IO when placeholder folder is not writable
* fixed: iframe lazy loading breaks Gravity Forms and FacetWP when parsing JSON
* fixed: is_amp() called too early

= 2.7.2 =
* fixed: Lazy Load not automatically creating placeholder folder

= 2.7.1 =
* added: integration with JSON/AJAX respones from Spotlight Social Media Feeds plugin
* fixed: img element search parsing JSON incorrectly

= 2.7.0 =
* changed: PNG placeholders are now inlined for less HTTP requests and better auto-scaling
* fixed: LQIP query strings not allowing resize operations
* fixed: Lazy Load throws error when ewww_webp_supported not defined in edge cases.
* fixed: Lazy Load regression prevents above-the-fold CSS background images from loading
* fixed: WebP source images ignored by URL rewriter
* fixed: Lazy Load scripts loading for page builders when they shouldn't be
* fixed: Easy IO does not rewrite image (href) links if image_downsize integration has rewritten the img tag

= 2.6.1 =
* added: disable "deep" integration with image_downsize filter via EIO_DISABLE_DEEP_INTEGRATION override
* fixed: LQIP query strings not allowing resize operations
* fixed: Lazy Load throws error when ewww_webp_supported not defined in edge cases.
* fixed: Lazy Load regression prevents above-the-fold CSS background images from loading
* fixed: WebP source images ignored by URL rewriter

= 2.6.0 =
* added: enable -sharp_yuv option for WebP conversion with the EIO_WEBP_SHARP_YUV override
* added: Lazy Load for iframes, add 'iframe' in exclusions to disable
* added: preserve metadata and apply lossless compression to linked versions of images via Easy IO with EIO_PRESERVE_LINKED_IMAGES constant
* added: Easy IO rewrites URLs in existing picture elements
* changed: native lazy loading is now enabled for right-sized PNG placeholders, override with EIO_DISABLE_NATIVE_LAZY constant
* changed: move Easy IO check-in to wp_cron
* fixed: Add Missing Dimensions overwrites smaller width/height attribute if only one is set
* fixed: replacing an existing attribute (like width) with a numeric value is broken

= 2.5.5 =
* fixed: Easy IO's Include All Resources compat with Oxygen Builder and Beaver Builder
* fixed: regex to detect SVG images in use elements caused excessive backtracking
* fixed: WebP version of full-size image not removed when attachment deleted due to undefined variable
* fixed: Easy IO adds invalid zoom parameter of 1920 to srcset URL

= 2.5.4 =
* fixed: Lazy Load fails to auto-scale with img-crop class for Easy IO
* fixed: Lazy Load throws JS error in SCRIPT_DEBUG mode
* fixed: warnings due to empty needle in strpos() function call

= 2.5.3 =
* added: use 'img-crop' id/class, or data-img-crop attribute to force cropping with Easy IO + Lazy Load.
* changed: lazysizes script moved to footer of page
* changed: use core wp_getimagesize() for proper error handling

= 2.5.2 =
* fixed: lazy load threshold missing from minified code

= 2.5.1 =
* change: added setting to enable adding of missing width/height dimensions, disabled by default
* fixed: warning from plugins using core wp_lazy_load filter without second parameter/argument

= 2.5.0 =
* added: ability to use SVG placeholders for more efficient lazy load via EASYIO_USE_SIIP override
* added: Easy IO and Lazy Load add missing width and height to image elements
* added: Lazy Load - right-sized placeholders can be generated for full-sized images
* added: configure Lazy Load pre-load threshold via EIO_LL_THRESHOLD constant
* changed: Lazy Load for external (non-inline) CSS images must be configured for specific elements
* changed: Easy IO's Include All Resources unlocked for all plans
* changed: native lazy loading is now disabled when using Easy IO lazy load, override with EIO_ENABLE_NATIVE_LAZY constant
* changed: Lazy Load pre-load threshold increased from 500px to 1000px
* changed: Lazy Load picture elements use right-sized img placeholder instead of 1x1 inline GIF
* fixed: native iframe lazy load disabled in WP 5.7+
* fixed: removing metadata clobbers APNG animations
* fixed: some JSON elements still being altered by Lazy Load
* fixed: Easy IO throws warnings when WP content is not in a sub-directory

= 2.4.3 =
* fixed: syntax error on PHP 7.2 or less

= 2.4.2 =
* changed: Easy IO supports img tags with SVG images
* fixed: error when a class attribute with no value is encountered

= 2.4.1 =
* fixed: lazy load for external CSS breaking div elements in JS/JSON
* removed: JS defer with Easy IO, use SWIS Performance instead: https://ewww.io/swis/

= 2.4.0 =
* added: Lazy Load for external CSS and separate style blocks (div elements only for now)
* added: Easy IO/CDN rewriting for Ultimate Member AJAX-powered activity wall
* changed: better compatibility with Theia Smart Thumbnails
* changed: Lazy Load auto-sizing will no longer decrease the image size, only increasing is allowed
* changed: filter to include additional HTML element types via eio_allowed_background_image_elements filter for Lazy Load and Easy IO
* fixed: compatibility between Easy IO and Autoptimize
* fixed: Easy IO uses hard crop when constraining an image via a width/height found in the style attribute
* fixed: Easy IO uses hard-coded wp-content/ and wp-includes/ paths in some cases
* fixed: Easy IO doubles part of image URL when there are no thumbnails, but one is requested by a plugin or theme
* fixed: Easy IO minifier breaks Beaver Builder
* fixed: Lazy Load breaks Beaver Builder text editor

= 2.3.1 =
* changed: Easy IO verification performed via API for better reliability
* fixed: Easy IO missing https availability for admin-ajax.php requests when home_url is using plain http
* fixed: Easy IO silently fails to rewrite URLs when using CNAME with WP Offload Media
* fixed: wp_lazy_loading_enabled filter should have 3 parameters
* fixed: Easy IO shows alert for domain change when a non-default WPML language is active

= 2.3.0 =
* fixed: Easy IO missing https availability for admin-ajax.php requests when home_url is using plain http
* fixed: wp_lazy_loading_enabled filter should have 3 parameters
* fixed: Easy IO shows alert for domain change when a non-default WPML language is active

= 2.2.9 =
* added: display total savings on settings page
* fixed: Lazy Load breaks JSON-encoded img elements
* fixed: Easy IO adds excess markup for images with height and/or width set to 'auto'
* fixed: memory_limit check should be case-insensitive: g vs. G
* fixed: Easy IO skips images in AJAX Load More requests

= 2.2.8 =
* fixed: lazy loader not loading

= 2.2.7 =
* added: alert on domain change for Easy IO, like if you clone from a production environment to staging
* changed: Easy IO domain and plan_id refresh automatically when visiting settings page
* fixed: error with Lazy Load and AMP

= 2.2.6 =
* changed: The browser-native portion of the Lazy Load feature obeys the wp_lazy_loading_enabled filter
* changed: prevent parsing of sitemap.xml
* fixed: Lazy Load placeholders not rewritten for CDN usage by Autoptimize and WP Offload Media Assets Add-on
* fixed: ensure video files do not have extra query parameters added

= 2.2.5 =
* fixed: errors with WP Offload Media 2.4
* fixed: Easy IO hard crops images when requested height/width is 9999
* fixed: Lazy Load parser running on customizer preview pane

= 2.2.4 =
* added: GIF to WebP conversion with API and Easy IO
* added: disable Lazy Load auto-scale by defining EIO_LL_AUTOSCALE as false

= 2.2.3 =
* fixed: lazy load skips img elements with unquoted src attributes
* fixed: sites using S3 fail verification after upgrade

= 2.2.2 =
* fixed: Lazy Load has nested fall-back img elements if an image is found multiple times in a page
* fixed: Easy IO mangles srcset URLs when src URL is relative instead of absolute
* fixed: Easy IO URLs leaking into block editor for new uploads

= 2.2.1 =
* added: EXACTDN_DEFER_JQUERY_SAFE override for when inline scripts depend on jQuery
* changed: Easy IO uses better query-string fall-back for plugins
* changed: Easy IO enforces https if available rather than protocol-relative URLs

= 2.2.0 =
* added: defer jQuery also with EXACTDN_DEFER_JQUERY override
* added: Lazy Load supports VC grid layouts retrieved via AJAX
* fixed: Lazy Load prevents loading of images in oEmbed endpoint
* fixed: jQuery exclusion was preventing deferral of jQuery extensions also
* fixed: Lazy Load parsing Owl Lazy images
* fixed: Easy IO adds srcset/sizes to feeds

= 2.1.1 =
* added: defer JS with Easy IO via EXACTDN_DEFER_SCRIPTS override
* fixed: AMP compatiblity for Lazy Load was broken
* fixed: images not loading on WPURP/WPRM print recipe pages

= 2.1.0 =
* added: Easy IO replaces image URLs within style elements for page builders like Elementor and Divi
* changed: potentially expensive db queries disabled by default
* fixed: verification fails if server is blocking test.png with a 403
* fixed: Include All Resources rewrites wrong URLs when quotes are html-encoded
* fixed: <picture> tags do not follow Lazy Load exclusions
* fixed: <picture> tags broken when excluding images from Lazy Load

= 2.0.3 =
* fixed: debug_message() throws a warning with non-string values
* fixed: notices when parsing JSON data from Envira
* fixed: fatal error when a WP_Error is passed from Envira to Easy IO

= 2.0.2 =
* removed: data-pin-media attribute, as Pinterest is handling WebP images properly now

= 2.0.1 =
* fixed: data-pin-media attribute added to linked images incorrectly

= 2.0.0 =
* added: Easy IO sets pre-scaled image in data-pin-media for Pinterest
* added: Envira Pro cache cleared when activating Easy IO
* fixed: background image lazy-loading could be interrupted by other plugins copying elements
* fixed: Easy IO misses some images with Envira Gallery Pro layouts
* fixed: missing www in domain prevents rewrites for Easy IO
* fixed: Lazy Load parsing X/Pro theme admin pages

= 1.9.0 =
* added: automatic plan upgrade detection
* changed: plugin can be activated network-wide, though configuration is still per-site
* updated: embedded help beacon code
* updated: lazysizes.js to version 5.2
* fixed: custom domain for Easy IO prevents auto-scaling
* fixed: full-width background images auto-scaled due to scroll bars

= 1.8.0 =
* changed: better compatibility with other implementations of "native lazy load"
* fixed: Easy IO detects wrong domain when using separate domains for site and content

= 1.7.0 =
* added: exclude images from Easy IO in settings
* added: exclude images from Lazy Load by string or class name
* added: prevent auto-scaling with skip-autoscale
* added: exclusions can be defined as overrides (single value as string, multiple values as an array)
* fixed: errors due to duplicate ssl= arguments in URLs

= 1.6.0 =
* added: support background images on a/link elements
* fixed: partial wp-content URLs being rewritten for some plugins
* fixed: inconsistent settings page links
* updated: new version of lazysizes JS

= 1.5.0 =
* added: disable native lazy-load attributes with EASYIO_DISABLE_NATIVE_LAZY
* added: ability to choose LQIP or blank placeholders for lazy load
* added: better compatibility with Divi filterable grid images and parallax backgrounds
* changed: default to blank placeholders with Easy IO
* fixed: Divi builder will not load with Easy IO and Include All Resources active
* fixed: image cover block with fixed width scaled too much
* fixed: low-quality placeholders sometimes had larger dimensions than necessary
* fixed: Slider Revolution dummy.png not properly handled by Easy IO

= 1.4.0 =
* changed: turn off WebP conversion when premium optimization is disabled
* fixed: incorrect debug function in ExactDN class
* fixed: wrong translation slug for some strings

= 1.3.0 =
* added: GCS sub-folder rewriting with ExactDN for cleaner URLs

= 1.2.0 =
* changed: better URL detection with WP Offload Media activated
* changed: lazy placeholders limited to 1920px wide

= 1.1.0 =
* added: use native loading="lazy" for even better performance
* updated: lazysizes core library
* fixed: ExactDN incorrectly scales Elementor background images rather than cropping
* fixed: ExactDN cannot work with Divi/Elementor background images due to use of external CSS files
* fixed: Lazy Load auto-scaling breaks if background image is enclosed in encoded quotes

= 1.0.0 =
* First release (ported from EWWW Image Optimizer)
