Title: Bender &#8211; Mosaic Image Protection
Author: OpenCluster
Published: <strong>July 27, 2026</strong>
Last modified: September 1, 2026

---

Search plugins

![](https://ps.w.org/bender-mosaic-image-protection/assets/banner-772x250.png?rev
=3624284)

![](https://ps.w.org/bender-mosaic-image-protection/assets/icon-256x256.png?rev=
3624274)

# Bender – Mosaic Image Protection

 By [OpenCluster](https://profiles.wordpress.org/opencluster/)

[Download](https://downloads.wordpress.org/plugin/bender-mosaic-image-protection.0.1.14.zip)

 * [Details](https://en-ca.wordpress.org/plugins/bender-mosaic-image-protection/#description)
 * [Reviews](https://en-ca.wordpress.org/plugins/bender-mosaic-image-protection/#reviews)
 *  [Installation](https://en-ca.wordpress.org/plugins/bender-mosaic-image-protection/#installation)
 * [Development](https://en-ca.wordpress.org/plugins/bender-mosaic-image-protection/#developers)

 [Support](https://wordpress.org/support/plugin/bender-mosaic-image-protection/)

## Description

Your WordPress images travel as a mosaic. Whoever steals them finds only shuffled
tiles.

Bender protects your site’s photos from scrapers, AI training bots, and outright
theft, without touching SEO, speed, or the experience of your human visitors.

#### How it works

On upload (or from the Media Library), Bender automatically generates two derivatives
for every image:

 1. **Mosaic atlas** – the image in full resolution, with an N×N grid permuted and 
    flipped via HMAC-SHA256  Fisher-Yates using a per-image secret key. A single CDN-
    cacheable file: downloaded as-is, it’s an unreadable puzzle.
 2. **Signed low-res** – a reduced version with a visible diagonal watermark and IPTC
    copyright metadata (read by Google Images), used as the `<img>` source: SEO, social
    previews, and the no-JavaScript fallback.

The original hi-res URL never appears in the page markup. In the browser, Bender
waits for the image to enter the viewport, downloads the atlas, requests the reconstruction
map from a REST endpoint protected by a time-limited HMAC token, and reassembles
the mosaic on a `<canvas>` with a blur-up cross-fade.

#### What it blocks (and what it honestly doesn’t)

 * HTML scrapers / mass bots — blocked: the HTML only contains the watermarked low-
   res
 * Right-click “Save image” — blocked: the canvas isn’t a file
 * Hi-res hotlinking — blocked: no plain hi-res URL exists
 * Downloading the atlas — useless: permuted, flipped tiles, no map
 * Map enumeration via REST — mitigated: time-limited HMAC token, per-IP rate limiting
 * Screenshots — not blockable, by any technology

That’s why Bender always signs, not just hides: visible watermarking and IPTC metadata
make authorship provable even when a copy slips through.

#### WooCommerce

Product images are protected like any other image, and the product gallery is handled
specifically: the zoom link and the gallery thumbnails serve the protected copy,
so the original file is not reachable from the product page. Variation images, schema.
org structured data and the Store API — the other places where WooCommerce prints
image URLs — are covered by Bender Pro.

#### What’s included

This plugin is fully functional as-is, with no locked or restricted features:

 * Automatic protection on upload, unlimited images
 * 6×6 mosaic grid
 * Visible “Bender™” watermark
 * Default IPTC copyright metadata
 * JPEG atlas format
 * Bulk protect/unprotect from the Media Library, with a protection status column
   and a protection filter in both list and grid mode
 * WooCommerce: the product gallery’s zoom link and thumbnails point at the protected
   copy, not at the original file

Denser grids, WebP/PNG atlas formats, fully customizable watermark and IPTC text,
invisible forensic (LSB) watermarking, configurable token validity, and wider WooCommerce
coverage (variation images, structured data, Store API) are available in **Bender
Pro**, a separate plugin distributed outside WordPress.org. Bender Pro also leaves
images unmarked: the “© protected” badge is off by default there, while here it 
is on by default (you can untick it in the settings).

## Screenshots

[⌊Settings page with protection stats.⌉⌊Settings page with protection stats.⌉[

Settings page with protection stats.

[⌊Media Library with the "Protection" column and bulk actions.⌉⌊Media Library with
the "Protection" column and bulk actions.⌉[

Media Library with the “Protection” column and bulk actions.

## Installation

 1. Upload the `bender-mosaic-image-protection` folder to `/wp-content/plugins/`, or
    install directly from the Plugins screen.
 2. Activate the plugin.
 3. Requires PHP 7.4+ with the GD extension (standard on virtually any WordPress hosting).
 4. Go to the **Bender** menu to adjust served resolution, quality, and watermark/IPTC
    toggles. New uploads are protected automatically by default.
 5. For existing images: Media Library  select images  **“Protect with Bender”** bulk
    action.

**Page caching**: align the token validity (24 hours by default) with your page 
cache duration, so tokens served from cache remain valid.

## FAQ

### What is Bender and what does it do?

Bender is a WordPress plugin that protects images from theft: it breaks them into
an unreadable mosaic for scrapers and bots, shows visitors a live canvas reconstruction,
and serves search engines a signed low-res version with a watermark and IPTC copyright
metadata.

### Does Bender really block downloads of the high-resolution images?

It blocks automated scrapers, hotlinking, and right-click “Save image”, because 
the HTML never contains a plain hi-res URL. It cannot prevent a screenshot, because
no web technology can — that’s why every image is still signed with a watermark 
and IPTC metadata.

### Does it work with WooCommerce?

Yes. Product images — featured image, gallery, images inside the description — are
protected like any other image on the site, and the product gallery gets specific
treatment: its zoom link and its thumbnails point at the protected copy instead 
of the original file. Two things stay outside the free plugin: the images of product
variations, which WooCommerce prints as a JSON block in the page, and the copies
of those URLs in the schema.org structured data and in the Store API used by block
themes. Bender Pro covers those as well.

### Does Bender slow down the site or hurt SEO?

No — SEO stays intact and actually improves. The low-res version is a real `<img
>` tag with `alt` text, indexable by Google Images, with IPTC metadata enabling 
the “Licensable” badge. CSS and JS together weigh about 4 KB with zero dependencies.

### What does a visitor without JavaScript see?

The sharp, watermarked low-res version. There’s never a broken image; canvas reconstruction
only happens if JavaScript is active.

### Does Bender work with page caching?

Yes: align the token validity (24 hours by default) with your page cache duration.

### Does Bender require special hosting?

No — only PHP 7.4+ with the GD extension, standard on virtually any WordPress hosting.

## Reviews

![](https://secure.gravatar.com/avatar/34bbc4ba066ba1192e84359f3e659bba3659d9114a3d21ec12e3b48219c4967b?
s=60&d=retro&r=g)

### 󠀁[A solid, efficient, and well-structured WordPress solution](https://wordpress.org/support/topic/a-solid-efficient-and-well-structured-wordpress-solution/)󠁿

 [studioellipse](https://profiles.wordpress.org/studioellipse/) September 3, 2026

An excellent, well-crafted plugin that does its job perfectly. It doesn't slow down
your site or performance, and it features a simple, no-frills interface. It works
seamlessly alongside other WordPress tools without any issues. Truly a great solution
for protecting your images from unwanted downloads.

 [ Read all 1 review ](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/)

## Contributors & Developers

“Bender – Mosaic Image Protection” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ OpenCluster ](https://profiles.wordpress.org/opencluster/)

[Translate “Bender – Mosaic Image Protection” into your language.](https://translate.wordpress.org/projects/wp-plugins/bender-mosaic-image-protection)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/bender-mosaic-image-protection/),
check out the [SVN repository](https://plugins.svn.wordpress.org/bender-mosaic-image-protection/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/bender-mosaic-image-protection/)
by [RSS](https://plugins.trac.wordpress.org/log/bender-mosaic-image-protection/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 0.1.14

 * Closed a hole on WooCommerce shops: the product gallery wraps every image in 
   a link to the full-size original (the zoom/lightbox) and keeps the same file 
   in its `data-thumb` attributes. Bender rewrites image tags, not those, so on 
   a shop the original was one click away from any protected product image. Both
   now point at the signed low-res.

#### 0.1.13

 * The Media Library in grid mode now has the same protection controls as the list
   mode: a “Filter by protection” dropdown next to the date filter, and a “Protect
   this image with Bender” checkbox in the attachment details panel, which protects(
   or unprotects) the image as soon as you tick it. Before, grid mode had neither—
   the filter and the row actions only exist in the list view.

#### 0.1.12

 * The “© protected” badge on images now follows the site language instead of always
   reading “© protetta” in Italian: it ships translated in the six bundled locales,
   and pages already sitting in a page cache keep showing the previous text until
   they are regenerated.
 * Fixed four settings-page strings that were left untranslated in every bundled
   language — the “Custom themes / page builders” row (label, checkbox and description)
   and the “what it stops” summary line — so a non-English dashboard no longer shows
   half the page in English.

#### 0.1.11

 * Added a “Protection” filter to the Media Library (list view), next to the date
   filter: show only protected or only unprotected images. Handy on large libraries
   to find what still needs protecting.
 * Fixed protected images shrinking when the theme’s `<img>` tag carries no `width`/`
   height` attributes. The tag’s only size reference then becomes the low-res file(
   480px wide) that replaces the original in `src`, so the image — and the frame
   around it — collapsed to that width. Bender now carries over the dimensions the
   tag had before protection, taken from the file it pointed to. The protected image
   also keeps a `max-width` of its own, for themes that size images with a child-
   combinator rule (`.slide > img`), which no longer matches once the image sits
   inside the frame.

#### 0.1.10

 * Fixed protected images changing the page layout. The frame that replaces the `
   <img>` was a block-level box with its own aspect ratio, so it — not the theme—
   decided the size: images sized by the theme through CSS rules on the `img` selector(
   logos capped to a fixed height, sliders with a minimum height) grew to their 
   full aspect ratio, containers that took their height from the image collapsed
   or stretched, and margins coming from copied utility classes were applied twice.
   The frame is now a plain inline-block wrapper with no aspect ratio of its own,
   and the image inside keeps the width, height and object-fit the theme gave it,
   so the layout is identical to the same page without the plugin.

#### 0.1.9

 * Fixed the protected frame collapsing to its own aspect ratio instead of the box
   the theme had set: when the original `<img>` (or its `<picture>` wrapper) carried
   layout classes or inline styles — the common `width:100%; height:100%; object-
   fit:cover` inside a fixed-height container used by carousels, cards and hero 
   sections — the frame that replaces it now inherits them, so the image keeps the
   width and height it had before.
 * Fixed lazy-loading themes and plugins undoing the protection on scroll: `data-
   src`/`data-srcset` (and the other usual lazy-load attributes) were left on the
   tag, so the lazy loader put the original image URL back into `src` as soon as
   the image entered the viewport.

#### 0.1.8

 * Fixed the “Custom themes / page builders” fallback (`universal_scan`) leaving`
   <picture>` elements (responsive images with multiple `<source>` breakpoints, 
   e.g. carousels/sliders) completely unprotected: the hi-res URLs in the `<source
   >` tags bypassed the mosaic entirely, and the generated canvas ignored the `width`/`
   height` intended for that layout. `<picture>`/`<source>` are now replaced by 
   the protected frame like a plain `<img>`, and the frame keeps the original `width`/`
   height` aspect ratio when set.

#### 0.1.7

 * Fixed the “Custom themes / page builders” fallback (`universal_scan`, added in
   0.1.6): when the only protected image on a page was reached exclusively through
   this fallback, the mosaic viewer script/style were enqueued too late to ever 
   be printed (the fallback rewrites the fully-buffered page, which closes after`
   wp_head`/`wp_footer` already ran), so visitors saw the static low-res `<img>`
   with no `<canvas>` upgrade — the image looked unprotected even though the server-
   side markup was correct. Assets are now enqueued as soon as the fallback decides
   to scan the page, before output buffering starts.

#### 0.1.6

 * Added a fallback for custom-coded themes and page builders that print `<img>`
   tags outside `the_content()`/`the_post_thumbnail()` (e.g. `wp_get_attachment_image()`
   called directly, or a raw `<img src="...">` in a hand-built gallery/slider): 
   those images were left completely unprotected before, even after marking the 
   attachment as protected. Bender now also scans the fully rendered page and swaps
   in the protected version for any image it recognizes. New “Custom themes / page
   builders” setting to disable this if not needed.

#### 0.1.5

 * Fixed 3 strings (the settings page intro and the “what it stops” note) that silently
   failed to load their bundled translation because the English source used a straight
   apostrophe (‘) while the .po files had a typographic one (’). All 6 bundled languages
   regenerated.

#### 0.1.4

 * Bundled ready-made translations (Italian, Spanish, French, German, Brazilian 
   Portuguese, Chinese Simplified) in `languages/`, loaded automatically via `load_plugin_textdomain()`—
   no need to wait for community translations on translate.wordpress.org.

#### 0.1.3

 * All admin-facing strings (settings page, Media Library column, row/bulk actions,
   admin notices, error messages) are now proper English source strings wrapped 
   for translation with the `bender-mosaic-image-protection` text domain, instead
   of hardcoded Italian. Translators can now localize the plugin via translate.wordpress.
   org.

#### 0.1.2

 * The fixed values of this edition (6×6 grid, watermark text/opacity, IPTC copyright/
   credit, 24h REST token TTL) are no longer implemented through generically-parameterized
   helper functions called with constant arguments. Each is now hardcoded directly
   inside the function that uses it (no unused `$n`/`$opacity`/`$ttl`-style parameters
   left over), so the free codebase itself contains no latent/dormant configurability
   for these values.

#### 0.1.1

 * All function, class, define, and option/transient names now use the `bendmoim`/`
   BENDMOIM` prefix (was `bender`/`Bender`, with one stray `pg_rl_` transient key).
 * Removed dormant Pro-only code paths from the free codebase (variable grid size,
   WebP/PNG atlas formats, customizable watermark/IPTC text, LSB steganographic 
   watermark, configurable token TTL) instead of merely locking them via options.
   This edition now hardcodes the free-tier values described in the plugin’s own
   settings screen.

#### 0.1.0

 * Initial release.

## Commercial plugin

This plugin is free but offers additional paid commercial upgrades or support. [View support](https://bender.opencluster.it/)

## Meta

 *  Version **0.1.14**
 *  Last updated: **2 months ago**
 *  Active installations: **Fewer than 10**
 *  WordPress Version: ** 6.0 or higher **
 *  Tested up to: **7.0.7**
 *  PHP Version: ** 7.4 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/bender-mosaic-image-protection/)
 * Tags:
 * [anti-scraping](https://en-ca.wordpress.org/plugins/tags/anti-scraping/)[copyright](https://en-ca.wordpress.org/plugins/tags/copyright/)
   [image protection](https://en-ca.wordpress.org/plugins/tags/image-protection/)
   [watermark](https://en-ca.wordpress.org/plugins/tags/watermark/)[woocommerce](https://en-ca.wordpress.org/plugins/tags/woocommerce/)
 *  [Advanced View](https://en-ca.wordpress.org/plugins/bender-mosaic-image-protection/advanced/)

## Ratings

 5 out of 5 stars.

 *  [  1 5-star review     ](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/?filter=5)
 *  [  0 4-star reviews     ](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/?filter=4)
 *  [  0 3-star reviews     ](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/?filter=3)
 *  [  0 2-star reviews     ](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/?filter=2)
 *  [  0 1-star reviews     ](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/?filter=1)

[Your review](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/bender-mosaic-image-protection/reviews/)

## Contributors

 *   [ OpenCluster ](https://profiles.wordpress.org/opencluster/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/bender-mosaic-image-protection/)