OperStack AI Visibility

Description

When somebody asks ChatGPT or Perplexity a question your business answers, the assistant fetches a handful of pages and quotes them. If it cannot reach your site, cannot tell what your business is, or finds nothing on the page worth quoting, it names somebody else.

Three things happen here that do not happen in a file generator.

1. It answers the question nobody can answer

How many people did ChatGPT actually send you last month? Almost no site owner knows. In Google Analytics those visits hide under “direct” or sit as a referral from chatgpt.com that nobody opens. This plugin counts them on your own site and shows one small table: ChatGPT 12, Perplexity 3, Claude 1, by day and over seven, thirty and ninety days.

It is counted in the visitor’s browser rather than while the page is built, and that is the whole point: half of WordPress sites sit behind a page cache or a CDN, where the HTML is served without PHP running at all. Anything counted during the render would miss most of the traffic and report a number far too low.

Nothing about the visitor is stored, only which assistant and how many. The address is hashed for an hour so one person is not counted twice, and is never written to a row. If the answer is zero, you get a zero, which is also an answer.

2. It checks the page while you write it

Open any post or page and the AI Visibility box shows a traffic light and the checks behind it, re-read as you type. These are the things that decide whether a page is the one quoted, and none of them are about files:

  • Does the first paragraph answer, or introduce? A page that opens with “In this article we will look at” is told so, and told what to put there instead.
  • Are the subheadings the questions people type? “How much does it cost” is matched to a question. “Pricing” is not.
  • Is there a list or a table? That is the shape an assistant reuses when it builds an answer.
  • Is there a figure, a price or a date? Most questions that reach an assistant are how much, how long and how many. A page with no numbers on it answers none of them.
  • Do the links say where they go? The words inside a link are read as a description of what is on the other end. “Read more” describes nothing.
  • Is the title shown whole, is there enough on the page, is there a summary of its own, is it recent, and can an assistant read it at all (a password-protected page never will).

It runs on the text in the editor, before you save, and it makes no outbound request of any kind: your text goes to your own site’s PHP and the verdicts come back.

3. It fixes what it can, and says what it will not

Every finding on the site screen that the plugin can repair itself carries the button that repairs it. One click allows the answer fetchers, publishes the map, publishes the agent card, puts your business details into the page code, or clears the “discourage search engines” box that was silently overriding everything else.

Where it cannot, it says so plainly instead of pretending. If a robots.txt file sits in your web root, WordPress cannot override it: the screen says blocked rather than allowed, prints the exact lines to paste, and leaves the file alone, because editing a file in your web root is not this plugin’s business.

What it publishes

  • robots.txt rules for OAI-SearchBot, ChatGPT-User, PerplexityBot, Perplexity-User, Claude-SearchBot, Claude-User, DuckAssistBot and Applebot. The training crawlers are left exactly as they are, because whether to feed them is your decision, not ours.
  • A map at /llms.txt, a plain list of your pages with one line each, written for assistants rather than for people, and rebuilt as you publish.
  • An agent card at /.well-known/agent.json, so an automated caller can find out what this site is and where its map lives.
  • Business schema with your real type: a dentist marked as a dentist, a roofer as a roofing contractor, with your phone, address and hours.
  • A meta description where your theme leaves one out, stepping aside quietly if Yoast, Rank Math, AIOSEO or SEOPress is already writing one.

Your assistant can do the setup

Everything the plugin knows is readable and writable over the WordPress REST API. Create an application password in your profile, give it to Claude or another assistant, and ask it to set the site up. It will read what is missing, ask you for the facts it cannot know (your phone, your address, your hours), write them in, and tell you what it could not do.

The plugin never invents a fact about your business. If it does not know your phone number, it says so instead of guessing.

What it does not do

It does not write your pages, promise rankings, or send anything anywhere. It has no account, no key and no telemetry, and it makes no request to any server but your own.

It also cannot tell you whether an assistant names you or a competitor when somebody asks, because answering that means asking them, and this plugin asks nobody anything. A free check that reads your site from the outside and answers that is at oper-stack.com/ai-visibility, and it needs no account either.

FAQ

Does the editor box send my draft anywhere?

No. It posts the text to your own site, over your own site’s REST API, and gets a list of verdicts back. Nothing is stored and no outside server is involved. The checks are plain PHP running on your own server.

Will this conflict with my SEO plugin?

No. It checks for Yoast, Rank Math, AIOSEO and SEOPress and does not write a second meta description over theirs. The page checks are about being quoted in an answer, which is a different question from the one those plugins score.

Does it block AI from training on my content?

No, and it does not unblock it either. Training crawlers keep whatever rules you already had. This plugin only opens the fetchers that quote you in an answer, which is a different set.

The traffic light says half done. Is that bad?

It is a checklist, not a grade. A short page that answers one question completely can be quoted while showing amber, and the notes say which lines to ignore when that is your case. Nothing here changes what visitors see.

I do not see /llms.txt

It should appear the moment the plugin is active, whatever your permalink settings are. If it does not, visit Settings, then Permalinks, and press Save: that rebuilds the address rules. If a file named llms.txt already sits in your site root, that file wins and WordPress cannot override it.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“OperStack AI Visibility” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

0.3.0

  • New: a traffic light in the post editor. Ten checks on the page in front of you, re-read as you type, covering whether the first paragraph answers or introduces, whether the subheadings are shaped like questions, whether there is a list, a figure or a date worth quoting, whether the links name where they go, and whether an assistant can read the page at all. It runs on your own server and makes no outbound request.
  • New: a dashboard widget with the site traffic light, the checks still outstanding, and the number of visits assistants sent in the last thirty days.
  • New: one-click fixes. Every finding the plugin can repair itself now carries the button that repairs it, including clearing the “discourage search engines” box that silently overrides every other setting. Where it cannot repair something, such as a robots.txt file in your web root, it says so and leaves the file alone.
  • New: the settings screen is now three tabs, and the visits tab shows totals over seven, thirty and ninety days as well as a day-by-day table, instead of one thirty-day figure.
  • New: a switch in the editor box to keep a page out of the map for assistants. The plugin already honoured that mark when an assistant set it over the REST API; now the author can set it themselves.
  • Changed: the date counting started is recorded when the plugin is activated, and on upgrade it is taken from the oldest day already counted rather than from today, so a zero is always shown next to the day it started being true.
  • Fixed: the site screen reported the business details as published whenever the fields were filled in, even with the switch that publishes them turned off, and counted that as a pass.
  • Fixed: the page checks called mbstring functions that WordPress does not shim, which would have been a fatal error on a host built without that extension.
  • Fixed: a page that had never been saved was marked as out of date, next to a note printing today as its last update.

0.2.3

  • Fixed: password-protected pages were listed in llms.txt together with the opening sentence of the text they exist to hide, and the same text was published as the page description. They are excluded now, everywhere.
  • Fixed: the site title, the tagline and every page title reached assistants HTML-escaped. WordPress stores them that way, so a site called Joe’s Diner was published to every assistant as Joe's Diner, in llms.txt, in the agent card and in the business markup. They are decoded now, the way core does it when it sends mail.
  • Hardened: the visit counter accepted an unlimited number of calls from one address, and it wrote to the database before checking whether the referrer was an assistant at all. An unknown referrer is now rejected before anything is stored, and one address counts at most thirty visits of the same assistant per hour. That ceiling is far above what a real page reaches and far below what it takes to move a daily total; it is a damper on casual abuse, not a claim that the number cannot be inflated by somebody determined.
  • Fixed: the link to /llms.txt was printed in the head of every page even when the file was switched off, pointing assistants at a 404.
  • Fixed: two PHP notices in the head of the front page on sites that show the blog there and have no tagline.
  • Fixed: the list of missing business details printed raw English keys on translated screens.
  • Escaping: slashes stay escaped in the JSON-LD block, and both file responses now send X-Content-Type-Options: nosniff.

0.2.2

  • Fixed: on a site using the default plain permalinks, /llms.txt and the agent card were not served at all. WordPress answered them with a redirect that led nowhere, so the two files this plugin exists to publish were missing on every site that had never changed its permalink settings. Both are now served from the address itself, with or without rewrite rules.
  • Tested on WordPress 7.1.

0.2.1

  • The visit counter no longer treats ordinary search as an AI assistant. Referrals from ya.ru and duckduckgo.com were being counted as Alice and DuckDuckGo AI, which inflated the number against what your analytics shows. Alice is alice.yandex.ru and the DuckDuckGo assistant is duck.ai; only those count now.
  • Added Google AI Studio, DeepSeek, Meta AI and Phind.

0.2.0

  • Counts visits from AI assistants on your own server, so the owner can finally see whether ChatGPT sends anyone.
  • Settings screen with a plain-words state of every signal.

0.1.0

  • First release.