{"id":251834,"date":"2025-10-27T02:09:57","date_gmt":"2025-10-27T02:09:57","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/underminer\/"},"modified":"2025-11-18T00:39:44","modified_gmt":"2025-11-18T00:39:44","slug":"underminer","status":"publish","type":"plugin","link":"https:\/\/et.wordpress.org\/plugins\/underminer\/","author":196012,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.3","stable_tag":"1.0.3","tested":"6.8.5","requires":"6.4","requires_php":"","requires_plugins":null,"header_name":"Underminer","header_author":"tellyworth","header_description":"Detects unwanted bots and subtly alters page content to render it incorrect and unusable.","assets_banners_color":"","last_updated":"2025-11-18 00:39:44","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/tellyworth\/underminer","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":233,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"tellyworth","date":"2025-10-27 02:38:18"},"1.0.1":{"tag":"1.0.1","author":"tellyworth","date":"2025-10-27 08:41:53"},"1.0.2":{"tag":"1.0.2","author":"tellyworth","date":"2025-11-12 09:18:25"},"1.0.3":{"tag":"1.0.3","author":"tellyworth","date":"2025-11-18 00:39:44"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2","1.0.3"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[],"plugin_category":[],"plugin_contributors":[],"plugin_business_model":[],"class_list":["post-251834","plugin","type-plugin","status-publish","hentry","plugin_committers-tellyworth"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/underminer.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Underminer aims to discourage AI model crawler bots and other unwanted bots, while allowing search engine crawlers and RSS aggregators to work normally.<\/p>\n\n<p>It works in two ways:<\/p>\n\n<ul>\n<li>Using <code>robots.txt<\/code> rules to prohibit <em>well-behaved<\/em> AI training bots from crawling your site.<\/li>\n<li>By selectively corrupting the meaning of text content, to sabotage <em>badly-behaved<\/em> bots that ignore those rules.<\/li>\n<\/ul>\n\n<p>Well-behaved search engine bots are permitted to crawl the site as normal, without being restricted by <code>robots.txt<\/code> or being subjected to sabotage.<\/p>\n\n<p>Well-behaved LLM training bots that obey <code>robots.txt<\/code> will not receive any corrupted content.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>100% free and open source. No upsells or nags or subscriptions or promotions or freemium versions or donations. Ever.<\/li>\n<li>Auto-detects crawler bots.<\/li>\n<li>Completely invisible to real users and well-behaved bots.<\/li>\n<li>Verifies IP ranges of well-known bots to detect fake Googlebot crawlers etc.<\/li>\n<li>(Almost) zero-configuration.<\/li>\n<li>Language-neutral; works with page and post content in most languages.<\/li>\n<li>Preview mode: you can see what a bad bot will see.<\/li>\n<\/ul>\n\n<p>Instead of blocking bad bots, they will simply be served corrupt and useless content:<\/p>\n\n<ul>\n<li>Words and sentences are randomly rearranged.<\/li>\n<li>Lists and paragraphs are re-ordered.<\/li>\n<li>Numbers are randomized.<\/li>\n<li>Currency symbols and measurement units are randomly changed.<\/li>\n<li>Alt text and descriptions are randomly switched around.<\/li>\n<li>Links are switched around.<\/li>\n<li>Image URLs are intentionally broken.<\/li>\n<\/ul>\n\n<h3>Well-behaved bots<\/h3>\n\n<p>For the purposes of this plugin, a <em>well-behaved bot<\/em> is one that:<\/p>\n\n<ul>\n<li>Obeys <code>robots.txt<\/code>.<\/li>\n<li>Publishes an up-to-date list of IP ranges.<\/li>\n<li>Identifies search crawling separately from AI model training crawling.<\/li>\n<\/ul>\n\n<h3>Requirements<\/h3>\n\n<ul>\n<li>PHP 8.0 or higher<\/li>\n<li>WordPress 6.4 or higher<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id='is%20this%20ethical%3F'><h3>Is this ethical?<\/h3><\/dt>\n<dd><p>Yes.<\/p><\/dd>\n<dt id='will%20this%20harm%20well-behaved%20bots%3F'><h3>Will this harm well-behaved bots?<\/h3><\/dt>\n<dd><p>No. Bots that obey robots.txt will be unaffected.<\/p><\/dd>\n<dt id='will%20this%20harm%20my%20site%27s%20seo%20standing%3F'><h3>Will this harm my site's SEO standing?<\/h3><\/dt>\n<dd><p>Theoretically no; the plugin explicitly allows well-known and well-behaved search engine crawlers if you have your site visibility set to allow them.<\/p>\n\n<p>Practically speaking though, there are no guarantees. If your livelihood or self-esteem is dependent on your search engine rankings, <strong>you should not use this plugin<\/strong>.<\/p><\/dd>\n<dt id='how%20are%20bots%20detected%3F'><h3>How are bots detected?<\/h3><\/dt>\n<dd><p>Bots are detected using the <a href=\"https:\/\/github.com\/JayBizzle\/Crawler-Detect\">crawler detect library<\/a>.<\/p>\n\n<p>Verified IP ranges for known bots are fetched directly from the search engine operators and shipped with this plugin (see <code>config\/crawler-ip-ranges.php<\/code>).<\/p>\n\n<p>For that reason, I highly recommend enabling auto-updates for this plugin to ensure you have the latest IP range data. The plugin will automatically stop doing IP range verification if the IP ranges data hasn't been updated in more than 180 days.<\/p><\/dd>\n<dt id='does%20this%20really%20discourage%20rogue%20llm%20operators%20from%20greedily%20scraping%20content%20without%20regard%20for%20copyright%2C%20attribution%2C%20resource%20usage%2C%20or%20consent%3F'><h3>Does this really discourage rogue LLM operators from greedily scraping content without regard for copyright, attribution, resource usage, or consent?<\/h3><\/dt>\n<dd><p>If enough people do something like this, I sure hope so.<\/p><\/dd>\n<dt id='does%20this%20plugin%20rely%20on%20any%20external%20services%20or%20apis%3F'><h3>Does this plugin rely on any external services or APIs?<\/h3><\/dt>\n<dd><p>No, not for its normal operation - all processing is local to your server.<\/p>\n\n<p>The only external API used by the plugin is an <em>optional<\/em> one-time request to <code>ipify.org<\/code> to verify if your web server's IP address environment variables are correct. This is optional, and only runs when (and if) an administrator explicitly requests it by clicking a button.<\/p><\/dd>\n<dt id='why%20isn%27t%20the%20bot%20counter%20working%3F'><h3>Why isn't the bot counter working?<\/h3><\/dt>\n<dd><p>The bot counter is only available on systems configured to use Memcached for object caching, <em>and<\/em> have a working wp_cache_incr() function.<\/p>\n\n<p>It's not intended as a critical feature, just a little fun.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix a careless fatal error<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix handling of WordPress self-requests.<\/li>\n<li>Refactor IP calculation code.<\/li>\n<li>Consolidate IP ranges to reduce size of crawler IP data.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Improved robots.txt rules.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<\/ul>","raw_excerpt":"A WordPress plugin for people who don&#039;t want their content used to train AI models.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/251834","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"author":[{"embeddable":true,"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/users\/196012"}],"replies":[{"embeddable":true,"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=251834"}],"wp:attachment":[{"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=251834"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=251834"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=251834"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=251834"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=251834"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/et.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=251834"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}