{"id":318770,"date":"2026-05-29T21:11:48","date_gmt":"2026-05-29T21:11:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/snopix\/"},"modified":"2026-05-29T22:05:40","modified_gmt":"2026-05-29T22:05:40","slug":"snopix","status":"publish","type":"plugin","link":"https:\/\/es-do.wordpress.org\/plugins\/snopix\/","author":20938031,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.1","stable_tag":"0.1.1","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Snopix","header_author":"SH4LIN","header_description":"Image similarity search for WordPress media library.","assets_banners_color":"f2f5f9","last_updated":"2026-05-29 22:05:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/SH4LIN\/snopix","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":43,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"sh4lin","date":"2026-05-29 21:11:37"},"0.1.1":{"tag":"0.1.1","author":"sh4lin","date":"2026-05-29 22:05:40"}},"upgrade_notice":{"0.1.1":"<p>Stability and compatibility fixes. Removes the non-working uninstall-confirmation prompt; your keep \/ drop-on-uninstall setting is unaffected.<\/p>","0.1.0":"<p>First public preview. Expect breaking changes between 0.x releases as\nthresholds and the index schema are still being tuned.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3554194,"resolution":"128x128","location":"assets","locale":"","width":384,"height":384},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3554194,"resolution":"256x256","location":"assets","locale":"","width":768,"height":768}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3554220,"resolution":"1544x500","location":"assets","locale":"","width":4632,"height":1500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3554220,"resolution":"772x250","location":"assets","locale":"","width":2316,"height":750}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0","0.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Dashboard with stat counters, indexed-image table, and the reverse-image\nsearch dropzone.","2":"Duplicate groups with per-group keep selection and bulk delete.","3":"Tools panel for reindexing, clearing the index, deleting orphan rows, and\nflushing caches."}},"plugin_section":[],"plugin_tags":[29823,31038,233,265013,265014],"plugin_category":[50],"plugin_contributors":[222528,223420,127129],"plugin_business_model":[],"class_list":["post-318770","plugin","type-plugin","status-publish","hentry","plugin_tags-duplicates","plugin_tags-image-search","plugin_tags-media-library","plugin_tags-reverse-image-search","plugin_tags-similarity-search","plugin_category-media","plugin_contributors-akrocks","plugin_contributors-sh4lin","plugin_contributors-vishalkakadiya","plugin_committers-sh4lin"],"banners":{"banner":"https:\/\/ps.w.org\/snopix\/assets\/banner-772x250.png?rev=3554220","banner_2x":"https:\/\/ps.w.org\/snopix\/assets\/banner-1544x500.png?rev=3554220","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/snopix\/assets\/icon-128x128.png?rev=3554194","icon_2x":"https:\/\/ps.w.org\/snopix\/assets\/icon-256x256.png?rev=3554194","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Snopix adds reverse-image search to the WordPress media library. Upload\nan image (or drop one onto the dashboard widget) and the plugin returns the\nvisually most similar attachments you already have indexed, ranked by a\ncomposite score over three fingerprints:<\/p>\n\n<ul>\n<li>A 64-bit perceptual hash (pHash) over a DCT of the greyscale thumbnail<\/li>\n<li>A 48-element RGB colour histogram<\/li>\n<li>A 32-element Sobel edge-orientation histogram<\/li>\n<\/ul>\n\n<p>The same fingerprints power the <strong>Duplicates<\/strong> tab, which clusters\nnear-identical attachments so you can keep one and bulk-delete the rest.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Reverse-image search via the admin dashboard or a <code>[snopix_search]<\/code> shortcode for\nthe front end.<\/li>\n<li>Block-editor panel on the core Shortcode block for inserting and editing the\n  [snopix_search] widget (variant, title, result cap).<\/li>\n<li>Duplicate detection with per-group \"keep\" selection and bulk delete.<\/li>\n<li>Background bulk indexing via WP-Cron \u2014 no PHP timeouts on large libraries.<\/li>\n<li>REST API at <code>\/wp-json\/snopix\/v1\/<\/code> with rate limiting on the public search\nendpoint.<\/li>\n<li>Settings panel: search visibility, rate limit, match and duplicate\nthresholds, indexer batch size, and probe downscale ceiling.<\/li>\n<li>Setting to keep or drop the index when the plugin is uninstalled.<\/li>\n<li>Tools panel: reindex everything, clear the index, delete orphan rows,\nflush caches.<\/li>\n<li>Pre-downscale of large probe images before fingerprinting to keep search\nlatency bounded.<\/li>\n<\/ul>\n\n<h4>Supported MIME types<\/h4>\n\n<pre><code>image\/jpeg, `image\/png`, `image\/gif`, `image\/webp`, `image\/bmp`.\n<\/code><\/pre>\n\n<h4>Where data lives<\/h4>\n\n<p>Snopix creates a single custom table, <code>{prefix}snopix_index<\/code>, that stores one\nrow per indexed attachment with its three fingerprints. Uninstalling the\nplugin drops the table unless you disable <strong>Drop data on uninstall<\/strong> in\nsettings.<\/p>\n\n<h3>Accuracy notice<\/h3>\n\n<p>Snopix is functional, but search ranking, duplicate detection and the\nthreshold tuning may be less accurate than expected - you may see occasional\nfalse positives or miss visually-similar images depending on your media\nlibrary. Please report anything that looks off.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>snopix<\/code> folder to <code>\/wp-content\/plugins\/<\/code> (or install the\nzip via <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>).<\/li>\n<li>Activate the plugin in <strong>Plugins<\/strong>.<\/li>\n<li>Go to <strong>Media \u2192 Snopix<\/strong> and click <strong>Index Remaining<\/strong> to fingerprint\nany attachments already in your library. This runs in the background via\nWP-Cron.<\/li>\n<li>Once at least a handful of images are indexed, drop an image onto the\n<strong>Search by Image<\/strong> panel to test reverse-image search.<\/li>\n<\/ol>\n\n<h4>Front-end shortcode<\/h4>\n\n<p>Add the search widget to any post or page with:<\/p>\n\n<pre><code>[snopix_search]\n<\/code><\/pre>\n\n<p>Optional attributes: <code>variant<\/code> (<code>card<\/code>, <code>inline<\/code>, or <code>narrow<\/code>; default\n    card), <code>title<\/code> (header label; default \"Search by image\"), and <code>max_results<\/code>\n(1-48; default 12). For example:<\/p>\n\n<pre><code>[snopix_search variant=\"inline\" max_results=\"24\"]\n<\/code><\/pre>\n\n<p>The block editor also exposes these options via a <strong>Snopix Search<\/strong> panel on\nthe core <strong>Shortcode<\/strong> block.<\/p>\n\n<p>By default the endpoint is open to anyone. Restrict it to logged-in users\nfrom the <strong>Settings<\/strong> tab in <strong>Media \u2192 Snopix<\/strong>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20image%20formats%20are%20supported%3F\"><h3>What image formats are supported?<\/h3><\/dt>\n<dd><p>JPEG, PNG, GIF, WebP, and BMP. Other types (SVG, HEIC, AVIF) are rejected at\nupload time by the indexer and again at the search endpoint.<\/p><\/dd>\n<dt id=\"how%20big%20can%20my%20media%20library%20be%3F\"><h3>How big can my media library be?<\/h3><\/dt>\n<dd><p>The fingerprint table stores one compact row per attachment, so the storage\ncost is small. Indexing scales linearly with the number of attachments. The\nbulk indexer runs in chained WP-Cron batches so it does not time out, but\nindexing a very large library (10k+) will take many minutes.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20images%20stored%20on%20s3%20%2F%20a%20cdn%3F\"><h3>Does it work with images stored on S3 \/ a CDN?<\/h3><\/dt>\n<dd><p>The indexer needs to read raw bytes via PHP-GD. If your offload plugin keeps\na local copy until indexing is complete, you are fine. If files are removed\nfrom the local filesystem before the indexer runs, those attachments will be\nskipped.<\/p><\/dd>\n<dt id=\"how%20accurate%20is%20the%20search%3F\"><h3>How accurate is the search?<\/h3><\/dt>\n<dd><p>The composite score combines pHash + colour + edge histograms with weights\n0.40 \/ 0.35 \/ 0.25. In our internal test matrix, format conversions,\nresizing, and JPEG re-compression are recovered with &gt; 0.95 similarity.\nHeavy Gaussian blur, extreme downscale (sub-128 px), and noise-corrupted\nimages sit closer to the 0.85 threshold and may not always rank first.\nTuning is ongoing.<\/p><\/dd>\n<dt id=\"how%20is%20duplicate%20detection%20different%20from%20search%3F\"><h3>How is duplicate detection different from search?<\/h3><\/dt>\n<dd><p>Both rely on the same fingerprints. Search returns ranked matches for an\narbitrary probe image; duplicate detection clusters indexed images among\nthemselves and surfaces every group with two or more visually-identical\nmembers.<\/p><\/dd>\n<dt id=\"how%20do%20i%20uninstall%20cleanly%3F\"><h3>How do I uninstall cleanly?<\/h3><\/dt>\n<dd><p>Deactivate, then delete the plugin from the <strong>Plugins<\/strong> screen. When the\n<strong>Drop data on uninstall<\/strong> setting is enabled (the default), the uninstall\nhook drops <code>{prefix}snopix_index<\/code> and removes all plugin options and\ntransients; disable it first if you want the index to survive a reinstall.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fixed: certain extreme aspect-ratio images could trigger a fatal error during indexing; working dimensions are now clamped.<\/li>\n<li>Changed: index vector columns now use LONGTEXT instead of JSON for compatibility with older MySQL \/ MariaDB.<\/li>\n<li>Fixed: capitalised indexed-image status labels and corrected spacing on the duplicate \"Keep\" badge.<\/li>\n<li>Removed: the non-functional Plugins-screen delete-confirmation modal and its \"require confirmation\" setting. The keep \/ drop-on-uninstall setting is unchanged.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Perceptual hash + colour histogram + edge histogram fingerprinting.<\/li>\n<li>Reverse-image search via admin dropzone and <code>[snopix_search]<\/code> shortcode.<\/li>\n<li>Block-editor panel for inserting and configuring the search shortcode.<\/li>\n<li>Duplicate detection with per-group keep selection.<\/li>\n<li>WP-Cron bulk indexing, rate-limited public search endpoint.<\/li>\n<li>Configurable thresholds, rate limit, and batch size, plus a keep or\ndrop-on-uninstall choice.<\/li>\n<li>WordPress.org compatibility: JPEG, PNG, GIF, WebP, BMP.<\/li>\n<\/ul>","raw_excerpt":"Reverse image search and duplicate detection for the WordPress media library, powered by perceptual hashing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/318770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=318770"}],"author":[{"embeddable":true,"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sh4lin"}],"wp:attachment":[{"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=318770"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=318770"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=318770"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=318770"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=318770"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-do.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=318770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}