{"id":396831,"date":"2026-11-03T15:09:32","date_gmt":"2026-11-03T15:09:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/spinix-image-optimization\/"},"modified":"2026-11-04T00:21:16","modified_gmt":"2026-11-04T00:21:16","slug":"spinix-image-optimization","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/spinix-image-optimization\/","author":20076940,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Spinix Image Optimization","header_author":"Spinix Technologies Ltd","header_description":"Compresses your images and serves them as WebP, with smart lazy loading and Core Web Vitals fixes. Originals are never modified.","assets_banners_color":"1a2158","last_updated":"2026-11-04 00:21:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/spinixtechnologies.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":79,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"muheyu","date":"2026-11-03 15:09:16","revision":3782094},"1.1.0":{"tag":"1.1.0","author":"muheyu","date":"2026-11-04 00:21:16","revision":3782844}},"upgrade_notice":{"1.1.0":"<p>Hooks for add-ons and a Pro tab. No change to how your images are optimized.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3782094,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3782094,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3782094,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3782094,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3782094,"resolution":"1","location":"assets","locale":"","width":1400,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3782094,"resolution":"2","location":"assets","locale":"","width":1400,"height":1000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3782094,"resolution":"3","location":"assets","locale":"","width":1400,"height":2199},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3782094,"resolution":"4","location":"assets","locale":"","width":1400,"height":1040},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3782094,"resolution":"5","location":"assets","locale":"","width":1400,"height":1000},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3782094,"resolution":"6","location":"assets","locale":"","width":1400,"height":1000}},"screenshots":{"1":"Dashboard: library progress, live speed timer, savings and PageSpeed boosters.","2":"Images: every image with its status, savings, time taken and the reason for any failure.","3":"Settings: compression level, WebP delivery, Core Web Vitals and exclusions.","4":"Tools: server and plugin compatibility checks, retry, re-optimize and delete.","5":"Deactivation: keep your data, delete everything, or just pause.","6":"Spinix hero image box in the page editor: automatic, choose the hero image yourself, or switch it off for a page."}},"plugin_section":[],"plugin_tags":[56174,187460,29161,4884,15376],"plugin_category":[],"plugin_contributors":[288298],"plugin_business_model":[],"class_list":["post-396831","plugin","type-plugin","status-publish","hentry","plugin_tags-compress-images","plugin_tags-core-web-vitals","plugin_tags-image-optimization","plugin_tags-lazy-load","plugin_tags-webp","plugin_contributors-muheyu","plugin_committers-muheyu"],"banners":{"banner":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/banner-772x250.png?rev=3782094","banner_2x":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/banner-1544x500.png?rev=3782094","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/icon-128x128.png?rev=3782094","icon_2x":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/icon-256x256.png?rev=3782094","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/screenshot-1.png?rev=3782094","caption":"Dashboard: library progress, live speed timer, savings and PageSpeed boosters."},{"src":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/screenshot-2.png?rev=3782094","caption":"Images: every image with its status, savings, time taken and the reason for any failure."},{"src":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/screenshot-3.png?rev=3782094","caption":"Settings: compression level, WebP delivery, Core Web Vitals and exclusions."},{"src":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/screenshot-4.png?rev=3782094","caption":"Tools: server and plugin compatibility checks, retry, re-optimize and delete."},{"src":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/screenshot-5.png?rev=3782094","caption":"Deactivation: keep your data, delete everything, or just pause."},{"src":"https:\/\/ps.w.org\/spinix-image-optimization\/assets\/screenshot-6.png?rev=3782094","caption":"Spinix hero image box in the page editor: automatic, choose the hero image yourself, or switch it off for a page."}],"raw_content":"<!--section=description-->\n<p>Spinix Image Optimization makes your images smaller and your pages faster, right on your own server. Every image is compressed and served as WebP whenever that makes it smaller, the first images on each page load right away while the rest are lazy-loaded, and the hero image gets priority. Your original files are never changed.<\/p>\n\n<p>Spinix Image Optimization is developed and maintained by <a href=\"https:\/\/spinixtechnologies.com\">Spinix Technologies Ltd<\/a>, a UK company.<\/p>\n\n<p>It fixes these PageSpeed Insights warnings:<\/p>\n\n<ul>\n<li><strong>Serve images in next-gen formats.<\/strong> Every JPEG and PNG is converted to WebP (the original is kept in the rare case it is already smaller).<\/li>\n<li><strong>Efficiently encode images \/ Increase the compression factor.<\/strong> Smart compression finds the right quality for each image automatically.<\/li>\n<li><strong>Largest Contentful Paint image was lazily loaded.<\/strong> The first images on a page are never lazy-loaded, and the hero image gets <code>fetchpriority=\"high\"<\/code>.<\/li>\n<li><strong>LCP request discovery \/ fetchpriority=high should be applied.<\/strong> When the hero is a CSS background image (for example an Elementor section background), it is preloaded in the page head with high priority, so the browser finds it right away.<\/li>\n<li><strong>Image elements do not have explicit width and height.<\/strong> Missing dimensions are added to prevent layout shift.<\/li>\n<\/ul>\n\n<h4>Your originals are safe<\/h4>\n\n<p>All optimized files are written to a separate folder, <code>spinix-webp<\/code>, inside your uploads folder. Your original uploads are never changed. Switch delivery off, pause, deactivate or delete the plugin, and your site goes straight back to the original images.<\/p>\n\n<h4>Fast<\/h4>\n\n<p>Images are encoded directly with GD or Imagick (whichever your server has). Each image is read once, the right quality is found in memory before anything is written, and the bulk optimizer processes several images in parallel. Progress, time per image and images per minute are shown live on the dashboard.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Automatic optimization of every new upload<\/li>\n<li>Background bulk optimization of your existing library, starting the moment you activate the plugin<\/li>\n<li>Three compression levels: Smart (recommended), Smallest files and Best quality<\/li>\n<li>PageSpeed-safe compression that stays above a safe quality floor<\/li>\n<li>WebP delivery with <code>&lt;picture&gt;<\/code> tags (automatic fallback) or direct URL replacement<\/li>\n<li>WebP for CSS background images, including page builder CSS files (Elementor and others)<\/li>\n<li>Smart lazy loading that never delays the first images on the page<\/li>\n<li>Hero image priority for a better LCP: automatic on every page, works for normal images and background images, with an optional manual choice per page<\/li>\n<li>Missing width and height added to prevent layout shift (CLS)<\/li>\n<li>Works with page caching plugins and CDNs (no server rewrite rules required)<\/li>\n<li>Plays well with WP Rocket, Elementor and other plugins that also lazy-load or prioritize images: you choose which plugin does it, so nothing is done twice<\/li>\n<li>Images list with status, savings, time taken and the reason for any image that could not be optimized<\/li>\n<li>Media Library column with savings per image, optimize again or serve the original<\/li>\n<li>Exclusions by file name, class or folder<\/li>\n<li>Pause and resume, plus a choice to keep or delete all data when you deactivate<\/li>\n<li>WP-CLI: <code>wp spinix-images optimize<\/code>, <code>wp spinix-images status<\/code>, <code>wp spinix-images reset<\/code><\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not connect to any external service. All images are processed on your own server, nothing is sent anywhere and nothing is tracked.<\/p>\n\n<p>The dashboard has a \"Test on PageSpeed\" button. Only when you click it, a new browser tab opens Google PageSpeed Insights (https:\/\/pagespeed.web.dev\/) with your site's home page address, so that you can test your site there. Google's terms: https:\/\/policies.google.com\/terms, privacy policy: https:\/\/policies.google.com\/privacy.<\/p>\n\n<h3>Source code<\/h3>\n\n<p>All JavaScript and CSS in this plugin is the original, unminified source code. There are no build tools, no compiled files and no third-party libraries.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install the plugin from Plugins \u2192 Add New (search for \"Spinix Image Optimization\") or upload the ZIP file, then activate it.<\/li>\n<li>Open <strong>Spinix Image Optimization<\/strong> in the admin menu.<\/li>\n<li>Your existing images are optimized in the background right away. New uploads are optimized automatically.<\/li>\n<\/ol>\n\n<p>Your server needs WebP support in the GD or Imagick PHP extension. The Tools tab shows whether it is available.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20happens%20to%20my%20images%20if%20i%20remove%20the%20plugin%3F\"><h3>What happens to my images if I remove the plugin?<\/h3><\/dt>\n<dd><p>Nothing. Your original images are never modified. Optimized copies live in the <code>spinix-webp<\/code> folder inside your uploads folder. When you delete the plugin, that folder and all plugin settings are removed (you can turn this off under Settings \u2192 When you uninstall).<\/p><\/dd>\n<dt id=\"my%20server%20says%20webp%20is%20not%20supported\"><h3>My server says WebP is not supported<\/h3><\/dt>\n<dd><p>Ask your hosting company to enable WebP support in the GD or Imagick PHP extension. Most hosts can switch it on in a minute. The Tools tab shows exactly what is missing.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20caching%20plugins%20and%20cdns%3F\"><h3>Does it work with caching plugins and CDNs?<\/h3><\/dt>\n<dd><p>Yes. The WebP markup is written into the page itself, so cached pages and CDNs serve it like any other HTML. Clear your page cache after the first bulk optimization.<\/p><\/dd>\n<dt id=\"another%20plugin%20also%20lazy-loads%20images%20or%20prioritizes%20the%20hero%20image.%20is%20that%20a%20problem%3F\"><h3>Another plugin also lazy-loads images or prioritizes the hero image. Is that a problem?<\/h3><\/dt>\n<dd><p>No. Spinix Image Optimization detects WP Rocket, Elementor, Perfmatters, FlyingPress, Autoptimize, LiteSpeed Cache and other common plugins and lets you choose which plugin handles lazy loading and the hero image, so nothing is done twice.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20together%20with%20another%20image%20optimizer%3F\"><h3>Can I use it together with another image optimizer?<\/h3><\/dt>\n<dd><p>Two image optimizers on one site convert and rewrite the same images and break each other. Spinix Image Optimization therefore asks you to deactivate the other optimizer first, and pauses itself if one is activated later.<\/p><\/dd>\n<dt id=\"how%20does%20hero%20image%20priority%20work%3F%20automatic%20or%20manual%3F\"><h3>How does hero image priority work? Automatic or manual?<\/h3><\/dt>\n<dd><p><strong>Automatic<\/strong> (the default, on every page): Spinix looks below your site header and takes the first large image or background image. A normal image gets <code>fetchpriority=\"high\"<\/code> and is never lazy-loaded. A background image (Elementor, other page builders, inline styles) is preloaded in the page head with <code>fetchpriority=\"high\"<\/code>, with a separate image for phones and tablets if your design uses one. Only this image gets priority, so other images no longer compete with it.<\/p>\n\n<p><strong>Manual<\/strong> (optional, per page): if PageSpeed Insights shows another image as the \"Largest Contentful Paint element\", open that page in the editor and use the <strong>Spinix hero image<\/strong> box in the sidebar. Choose the right image, or switch hero priority off for that page. Pages you do not change stay automatic.<\/p>\n\n<p>You can see what Spinix chose at the end of the page source: <code>&lt;!-- ... hero image = ... --&gt;<\/code>.<\/p><\/dd>\n<dt id=\"how%20can%20i%20compare%20a%20page%20with%20and%20without%20optimization%3F\"><h3>How can I compare a page with and without optimization?<\/h3><\/dt>\n<dd><p>Add <code>?spinix_io=off<\/code> to the end of any page address. That page is then shown without Spinix Image Optimization.<\/p><\/dd>\n<dt id=\"why%20are%20some%20images%20not%20served%20as%20webp%3F\"><h3>Why are some images not served as WebP?<\/h3><\/dt>\n<dd><p>Spinix serves a WebP version only when it is really smaller than the original. Most photos become 40-80% smaller, but a few images do not: very small icons, simple graphics with only a few colours, or JPEGs that were already compressed very hard. For these, the WebP would be the same size or even bigger, and simple graphics can lose sharpness. Spinix therefore keeps serving the original, which is already the smallest file, and shows \"Already optimal \u00b7 Original kept\".<\/p>\n\n<p>This does not cost you anything in PageSpeed Insights. Google only flags an image (\"Improve image delivery\" \/ \"Serve images in next-gen formats\") when converting it would save a meaningful number of bytes, so an image that WebP cannot make smaller is not flagged.<\/p><\/dd>\n<dt id=\"which%20images%20are%20optimized%3F\"><h3>Which images are optimized?<\/h3><\/dt>\n<dd><p>JPEG, PNG and WebP images in the Media Library, including all sizes WordPress creates. GIF files are left as they are so animations are kept, and SVG files are left untouched.<\/p><\/dd>\n<dt id=\"does%20spinix%20image%20optimization%20send%20my%20data%20anywhere%3F\"><h3>Does Spinix Image Optimization send my data anywhere?<\/h3><\/dt>\n<dd><p>No. All images are optimized on your own server. The plugin does not contact any external service, does not track you and collects no data. The \"Test on PageSpeed\" button only opens Google PageSpeed Insights in a new browser tab with your home page address when you click it.<\/p><\/dd>\n<dt id=\"are%20there%20hooks%20for%20developers%3F\"><h3>Are there hooks for developers?<\/h3><\/dt>\n<dd><ul>\n<li><code>spinix_io_webp_quality<\/code> (int 1-100) \u2013 WebP quality.<\/li>\n<li><code>spinix_io_target_bytes_per_pixel<\/code> (float, default 0.085) \u2013 target for PageSpeed-safe compression.<\/li>\n<li><code>spinix_io_mime_types<\/code> (array) \u2013 image types to optimize.<\/li>\n<li><code>spinix_io_exclude_image<\/code> (bool, string $tag) \u2013 leave an image untouched.<\/li>\n<li><code>spinix_io_process_page<\/code> (bool) \u2013 skip optimization on a page.<\/li>\n<li><code>spinix_io_optimize_inline<\/code> (bool) \u2013 return false to optimize uploads in the background instead of during the upload.<\/li>\n<li><code>spinix_io_fast_encoder<\/code> (bool) \u2013 return false to always use the WordPress image editor.<\/li>\n<li><code>spinix_io_cron_time_budget<\/code> (int seconds) \u2013 work per background run.<\/li>\n<li><code>spinix_io_write_htaccess<\/code> (bool) \u2013 return false to skip the .htaccess file with cache headers in the <code>spinix-webp<\/code> folder.<\/li>\n<li><code>spinix_io_lookup_unknown_images<\/code> (bool) \u2013 find images without a <code>wp-image-ID<\/code> class by their file name.<\/li>\n<li><code>spinix_io_hero<\/code> (array $choice, int $post_id) \u2013 change the hero choice of a page: <code>array( 'mode' =&gt; 'auto'|'image'|'off', 'id' =&gt; attachment ID )<\/code>.<\/li>\n<li><code>spinix_io_optimized<\/code> (action, int $id, array $data) \u2013 after an image was optimized.<\/li>\n<li><code>spinix_io_before_optimize<\/code> (action, int $id) \u2013 before an image is optimized.<\/li>\n<li><code>spinix_io_image_row<\/code> (array $row, int $id), <code>spinix_io_media_status_html<\/code> (string $html, int $id) \u2013 extend the Images list and the Media Library column.<\/li>\n<li><code>spinix_io_admin_settings<\/code> (array), <code>spinix_io_settings_saved<\/code> (action, array $input) \u2013 add settings to the Settings tab (saved with the same Save button).<\/li>\n<li><code>spinix_io_admin_tabs<\/code>, <code>spinix_io_admin_panels<\/code>, <code>spinix_io_admin_dashboard<\/code>, <code>spinix_io_admin_settings_sections<\/code>, <code>spinix_io_admin_tools<\/code>, <code>spinix_io_admin_checklist<\/code> (actions) \u2013 add parts to the screen. In JavaScript, <code>window.spinixIo<\/code> offers <code>addFilter( 'hero' | 'rowFormats' | 'rowActions', fn )<\/code> and <code>on( 'render' | 'rows' | 'row' | 'saved' | 'response', fn )<\/code>.<\/li>\n<\/ul><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: hooks for add-ons, so extensions (such as Spinix Image Optimization Pro) appear on the same screen, in the same tabs and with the same Save button.<\/li>\n<li>New: a \"Pro\" tab that explains what the optional Pro add-on adds. It disappears when Pro is installed. Nothing in the free plugin is locked or limited.<\/li>\n<li>New: a one-time, dismissible review request on the plugin's own screen after it has optimized your images for a week.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Compression and WebP conversion of every new upload and of the existing library, with originals kept untouched. A WebP is served only when it is smaller than the original.<\/li>\n<li>Fast direct encoder (GD or Imagick) with in-memory quality search, and parallel bulk optimization with a live speed timer.<\/li>\n<li>WebP delivery with <code>&lt;picture&gt;<\/code> tags or direct URL swap, including CSS background images and page builder CSS files.<\/li>\n<li>Hero image priority for a better LCP: automatic detection below the site header for normal images and background images (Elementor and other page builders), preloaded per device, plus a \"Spinix hero image\" box in the page editor to choose the hero image yourself or switch it off for a page.<\/li>\n<li>Smart lazy loading and missing width\/height for better Core Web Vitals.<\/li>\n<li>Detection of other image optimizers and of plugins that also lazy-load or prioritize images.<\/li>\n<li>Images list, Media Library column, exclusions, pause\/resume, WP-CLI commands.<\/li>\n<\/ul>","raw_excerpt":"Compress your images and serve them as WebP, with smart lazy loading and Core Web Vitals fixes. Fast, local, and your originals are never modified.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/396831","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=396831"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/muheyu"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=396831"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=396831"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=396831"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=396831"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=396831"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=396831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}