{"id":356229,"date":"2026-10-19T20:04:51","date_gmt":"2026-10-19T20:04:51","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/geistm-ai-discovery\/"},"modified":"2026-10-19T20:04:15","modified_gmt":"2026-10-19T20:04:15","slug":"geistm-adnet","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/geistm-adnet\/","author":23552011,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.0","stable_tag":"1.5.0","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"GeistM Adnet","header_author":"GeistM","header_description":"Adnet by GeistM \u2014 contextual advertising powered by AI discovery. Serves a signed \/.well-known\/ai self-declaration and llms.txt so AI agents can discover and verify your site, and renders verified, context-matched Adnet ads.","assets_banners_color":"","last_updated":"2026-10-19 20:04:15","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/adnet.geistm.com\/wordpress","header_author_uri":"https:\/\/geistm.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":58,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.0":{"tag":"1.5.0","author":"geistm","date":"2026-10-19 20:04:15","revision":3755480}},"upgrade_notice":{"1.0.0":"<p>First release of the plugin. Upgrading from a 2.x\/3.x build is automatic: removed features are cleaned up and you will be asked to re-sign your manifest. If WordPress warns the uploaded version is older, choose &quot;Replace current with uploaded&quot;.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":{"geistm-adnet\/adnet-slot":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"geistm-adnet\/adnet-slot","version":"1.1.0","title":"Adnet Ad Slot","category":"widgets","icon":"megaphone","description":"Place a verified Adnet advertisement on this page. The Adnet client fills the slot with a live campaign; verified views and clicks add to your wallet's Credit.","keywords":["ad","adnet","advertising","geistm","verified"],"supports":{"html":false,"align":["wide","full"]},"attributes":{"format":{"type":"string","default":"banner","enum":["banner","square","card","qr"]},"placeholderText":{"type":"string","default":"Advertisement"}},"textdomain":"geistm-adnet","editorScript":"file:.\/edit.js","render":"file:.\/render.php"}},"tagged_versions":["1.5.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"What AI Sees \u2014 live preview of your ai.json manifest that AI agents read","2":"Identity \u2014 describe your organization (manually or AI-drafted) and optionally link an organization identity","3":"Content \u2014 llms.txt generation and SEO meta tag settings","4":"Policies \u2014 set content licensing, quoting permissions, and AI training controls","5":"Adnet \u2014 enable verified advertising, configure the host and automatic ad placement","6":"Account \u2014 your digital wallet (ID and Credit) and signing status"}},"plugin_section":[],"plugin_tags":[321,368,2353,377,4123],"plugin_category":[35],"plugin_contributors":[287585],"plugin_business_model":[],"class_list":["post-356229","plugin","type-plugin","status-publish","hentry","plugin_tags-ads","plugin_tags-advertising","plugin_tags-ai","plugin_tags-monetization","plugin_tags-publisher","plugin_category-advertising","plugin_contributors-geistm","plugin_committers-geistm"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/geistm-adnet.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>GeistM Adnet<\/strong> connects your WordPress site to Adnet, GeistM's contextual advertising network. Instead of tracking visitors, Adnet matches campaigns to what your site says about itself: you describe your content once, the plugin signs that description with a key only your site holds, and the network matches ads against it.<\/p>\n\n<p><strong>How it works<\/strong><\/p>\n\n<ol>\n<li><strong>Describe your site.<\/strong> Write a short summary of what you publish (or draft one with the GeistM AI service). The plugin publishes it \u2014 with your licensing and AI-use policies \u2014 as a machine-readable declaration at <code>\/.well-known\/ai<\/code>, following the open AI Discovery Standard.<\/li>\n<li><strong>Sign it.<\/strong> The plugin creates a site wallet (a secp256k1 keypair generated and encrypted on your own server) and signs the declaration. Nothing is published until an administrator approves it, and content changes require a re-sign.<\/li>\n<li><strong>Connect to Adnet.<\/strong> Enable Adnet and click Check &amp; Connect. The network verifies your signed declaration and matches campaigns to your site's topics and audience.<\/li>\n<li><strong>Place ads.<\/strong> Use the Adnet Ad Slot block (banner, square, card or QR), or turn on automatic placement after every Nth paragraph.<\/li>\n<li><strong>Get paid.<\/strong> Each campaign holds its own budget and rates. Verified views and clicks on your site are credited to your site's wallet, and payouts are made directly \u2014 no intermediary holds your earnings.<\/li>\n<\/ol>\n\n<p><strong>Also included<\/strong><\/p>\n\n<ul>\n<li>Signed <code>\/llms.txt<\/code> and optional <code>\/llms-full.txt<\/code> generated from your site structure, so the content AI agents read can be verified as yours<\/li>\n<li>Machine-readable policies at <code>\/.well-known\/ai\/policies<\/code> \u2014 content licensing, quoting permissions, AI training opt-in\/opt-out<\/li>\n<li>Per-page SHA-256 content hashes and a <code>&lt;link rel=\"ai-discovery\"&gt;<\/code> tag \/ HTTP Link header<\/li>\n<li>Wallet backup and restore<\/li>\n<\/ul>\n\n<p><strong>Contextual, not behavioural.<\/strong> Ads are chosen from your site's declared topics, not from a profile of the visitor. The Adnet client sets no cookies and shares nothing with other ad networks.<\/p>\n\n<p><strong>Open standard.<\/strong> The <code>\/.well-known\/ai<\/code> declaration implements the AI Discovery Standard, an open specification (CC-BY-4.0) created by Rootz \u2014 see <a href=\"https:\/\/rootz.global\/ai-discovery\">rootz.global\/ai-discovery<\/a>. This plugin is an independent implementation published by GeistM.<\/p>\n\n<h3>External services<\/h3>\n\n<p>The signed declaration, llms.txt and policies are generated locally from your WordPress content. The plugin contacts external services only for the features below, and none of them run until an administrator turns the feature on or clicks the button that uses it. All connections use HTTPS.<\/p>\n\n<p><strong>1. Adnet ad service (adnet.geistm.com) \u2014 only when Adnet is enabled<\/strong><\/p>\n\n<p>Adnet is disabled by default. When an administrator enables it on the Adnet tab, every front-end page loads the Adnet client script (<code>client\/client.js<\/code>) from the configured Adnet host \u2014 <code>adnet.geistm.com<\/code> by default, or a first-party CNAME on your own domain that points to it. The script fetches the ads shown in your ad slots and records ad views and clicks.<\/p>\n\n<ul>\n<li>Data sent: the page path, the requested ad format, and a random visitor identifier the script stores in the visitor's browser (localStorage key <code>adnet_vid<\/code>). As with any web request, the service also receives the visitor's IP address and browser user agent. No name, email address or account data is sent, and no cookies are set.<\/li>\n<li>When: on each front-end page view while Adnet is enabled.<\/li>\n<li>Provided by GeistM \u2014 <a href=\"https:\/\/adnet.geistm.com\/terms\">Terms of Service<\/a>, <a href=\"https:\/\/adnet.geistm.com\/privacy\">Privacy Policy<\/a>.<\/li>\n<\/ul>\n\n<p><strong>2. Adnet network registration (adnet.geistm.com and epistery.com) \u2014 admin-triggered<\/strong><\/p>\n\n<p>When an administrator enables Adnet or clicks \"Check &amp; Connect\" on the Adnet tab, the plugin submits the site to the Epistery discovery index (<code>epistery.com\/scan<\/code>), which reads and verifies the public <code>\/.well-known\/ai<\/code> declaration, and registers the site with the Adnet matcher on the configured Adnet host. If your server cannot reach the matcher, the Adnet tab retries that one request from the administrator's browser.<\/p>\n\n<ul>\n<li>Data sent: your site's domain name only.<\/li>\n<li>When: only when an administrator enables Adnet or clicks Check &amp; Connect. The resulting status is cached and nothing is re-checked on ordinary page loads.<\/li>\n<li>The Adnet matcher is provided by GeistM \u2014 <a href=\"https:\/\/adnet.geistm.com\/terms\">Terms of Service<\/a>, <a href=\"https:\/\/adnet.geistm.com\/privacy\">Privacy Policy<\/a>.<\/li>\n<li>The Epistery discovery index is provided by Epistery \u2014 <a href=\"https:\/\/epistery.com\/terms\">Terms of Service<\/a>, <a href=\"https:\/\/epistery.com\/privacy\">Privacy Policy<\/a>.<\/li>\n<\/ul>\n\n<p><strong>3. GeistM AI service (adnet.geistm.com) \u2014 admin-triggered<\/strong><\/p>\n\n<p>\"Summarize with AI\" drafts your site summary, core concepts and identity fields. The request is signed by your site wallet, so no AI provider API key is needed.<\/p>\n\n<ul>\n<li>Data sent: your site name and tagline, the plain text of your About and Contact pages, your published page titles, your domain, and your site wallet's public address.<\/li>\n<li>When: only when an administrator clicks \"Summarize with AI\" and a site wallet exists. Without a wallet, the plugin uses local extraction and makes no external call. A free monthly quota applies per site.<\/li>\n<li>Provided by GeistM \u2014 <a href=\"https:\/\/adnet.geistm.com\/terms\">Terms of Service<\/a>, <a href=\"https:\/\/adnet.geistm.com\/privacy\">Privacy Policy<\/a>. GeistM uses Anthropic's Claude to generate the draft; your site text is forwarded to Anthropic for that single request under Anthropic's <a href=\"https:\/\/www.anthropic.com\/legal\/commercial-terms\">Commercial Terms<\/a> and <a href=\"https:\/\/www.anthropic.com\/legal\/privacy\">Privacy Policy<\/a>.<\/li>\n<\/ul>\n\n<p>The Adnet tab also checks for an optional <code>_ai.&lt;your-domain&gt;<\/code> DNS TXT record using your server's own DNS resolver. No third-party service is involved.<\/p>\n\n<h3>Privacy<\/h3>\n\n<h4>Data Storage<\/h4>\n\n<p>All structured data (organization identity, policies, llms.txt) is generated from your existing WordPress content and stored in wp_options. No user data is collected, and the plugin keeps no analytics or visitor logs. The plugin wallet's private key is stored encrypted (AES-256-CBC, keyed from your wp-config.php salts).<\/p>\n\n<h4>External Services<\/h4>\n\n<p>The plugin connects to external services only when specific features are used. See \"External services\" above for what data is sent, when, and links to each service's terms and privacy policy.<\/p>\n\n<h4>Cookies<\/h4>\n\n<p>This plugin does not set any cookies.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>geistm-adnet<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the Plugins menu<\/li>\n<li>Go to Settings &gt; Adnet &amp; AI Discovery and follow the setup steps on the Overview tab: describe your site, create its wallet, sign, then enable Adnet<\/li>\n<li>Visit <code>yoursite.com\/.well-known\/ai<\/code> and <code>yoursite.com\/llms.txt<\/code> to verify<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20slow%20down%20my%20site%3F\"><h3>Does this slow down my site?<\/h3><\/dt>\n<dd><p>No. The plugin serves cached, signed JSON responses and adds a single <code>&lt;link&gt;<\/code> tag to your HTML head. The Adnet client script (if enabled) loads deferred from the Adnet host.<\/p><\/dd>\n<dt id=\"does%20it%20send%20data%20to%20external%20servers%3F\"><h3>Does it send data to external servers?<\/h3><\/dt>\n<dd><p>Not until you use a feature that needs one. The declaration, llms.txt and policies are generated locally. Adnet ads, network registration and AI-drafted summaries use the services listed under External services, each with what is sent and when.<\/p><\/dd>\n<dt id=\"does%20adnet%20track%20my%20visitors%3F\"><h3>Does Adnet track my visitors?<\/h3><\/dt>\n<dd><p>Adnet matches ads to your site's declared content, not to visitor profiles. The ad script keeps a random identifier in the visitor's browser so views and clicks can be verified and deduplicated; it is not linked to any name, email or account, sets no cookies, and is not shared with other ad networks. The plugin adds suggested text to Settings &gt; Privacy so you can disclose this in your privacy policy.<\/p><\/dd>\n<dt id=\"what%20is%20the%20ai%20discovery%20standard%3F\"><h3>What is the AI Discovery Standard?<\/h3><\/dt>\n<dd><p>An open specification (CC-BY-4.0) for how websites should present structured information to AI agents. Think of it as \"robots.txt for AI identity\" \u2014 instead of blocking, it enables proper interaction. See <a href=\"https:\/\/rootz.global\/ai-discovery\">rootz.global\/ai-discovery<\/a>.<\/p><\/dd>\n<dt id=\"what%20is%20the%20plugin%20wallet%3F\"><h3>What is the plugin wallet?<\/h3><\/dt>\n<dd><p>A secp256k1 keypair generated locally on your server (private key AES-256-CBC encrypted in your database). It signs every manifest and llms.txt so AI agents \u2014 and the Adnet network \u2014 can verify the data genuinely came from your site. It is also how Adnet identifies your site as a payee. Back it up from the Account tab \u2014 deleting the plugin deletes the wallet.<\/p><\/dd>\n<dt id=\"how%20does%20adnet%20pay%20publishers%3F\"><h3>How does Adnet pay publishers?<\/h3><\/dt>\n<dd><p>Each ad campaign is a smart contract that holds its own budget and rates. Verified views and clicks on your site accrue a balance on the campaign contract, credited to your site's address. You withdraw directly from the contract \u2014 payment is a transfer with an on-chain receipt, with no intermediary holding your money.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20flush%20permalinks%20after%20installation%3F\"><h3>Do I need to flush permalinks after installation?<\/h3><\/dt>\n<dd><p>The plugin does this automatically on activation and upgrade. If <code>\/.well-known\/ai<\/code> returns a 404, go to Settings &gt; Permalinks and click Save (this flushes rewrite rules).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Renamed to GeistM Adnet<\/li>\n<li>The wallet's Credit panel links to your campaigns and balances instead of looking up a balance from the plugin \u2014 the Overview and Account tabs make no external requests<\/li>\n<li>External services documented in full in the readme<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Simpler identity settings: removed the unfinished \"Authorizer Wallet\" card from the Account tab \u2014 it stored an address that was never published or verified<\/li>\n<li>The Identity tab's blockchain fields are now one optional \"Organization Verification\" fold in plain language: link your organization's ID and verification record so AI agents can confirm your site belongs to it; leave it closed and your site signs as itself, which is the normal setup<\/li>\n<li>One signing button at a time: the Manifest card on Overview no longer repeats the setup guide's sign action, and its status table is now a single line<\/li>\n<li>The Overview capabilities list only shows endpoints your site actually serves<\/li>\n<li>Tidier tabs: \"Summarize with AI\" now lives on the Identity tab next to the fields it fills, the SEO meta-tags toggle moved to the Content tab, and Account is purely your wallet and signature<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Creating your digital wallet is now a real onboarding step \u2014 nothing is minted silently at activation. You create it, you're told what its ID and Credit are for, and you're reminded to back it up.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Wallet backup: download an encrypted-at-rest wallet's key as a backup file from the Account tab, and restore it after a reinstall or site move \u2014 deleting the plugin deletes the wallet, so back it up first<\/li>\n<li>Restore option is also offered before creating a fresh wallet on a new install<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Guided setup on the Overview tab: describe your content (manually or AI-summarized), create your digital wallet, sign your content, turn on Adnet, and choose ad placement \u2014 each step one plain-language action<\/li>\n<li>Digital wallet framing: your site identity is now presented as a wallet with an ID (proves your content is yours) and Credit (receives your payouts for verified ad views and clicks, shown in USD), including a live balance on the Account tab<\/li>\n<li>Manual placement helper: pick an ad look (banner, square, card, or QR), copy the slot tag, and see exactly where to paste it<\/li>\n<li>New QR ad format available in the Adnet Ad Slot block and automatic placement<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release of Adnet by GeistM<\/li>\n<li>Signed AI Discovery identity: \/.well-known\/ai self-declaration and machine-readable policies, signed llms.txt and llms-full.txt, canonical content hashes, and an admin-approved signing flow backed by a locally generated site identity key<\/li>\n<li>Adnet verified advertising (disabled by default): Adnet Ad Slot block, automatic placement, factory-served ad client<\/li>\n<li>One-click network onboarding: Check &amp; Connect submits your site to the discovery index and registers it with the ad matcher, with a browser-assisted fallback for restricted hosts and a DNS domain-verification helper<\/li>\n<li>AI-assisted setup (Auto-Populate) included free \u2014 requests signed by your site identity and served by the GeistM AI service; no API key required<\/li>\n<li>Sites running a 2.x build of the former AI Discovery lineage are migrated automatically on upgrade<\/li>\n<\/ul>","raw_excerpt":"Publisher plugin for Adnet: contextual ads matched to your site's signed self-description, with payouts settled to your site's own wallet.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/356229","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=356229"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/geistm"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=356229"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=356229"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=356229"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=356229"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=356229"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=356229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}