Google Search Console — required
The queries your pages draw impressions and clicks on, their positions, and how Google says it has indexed them. Up to 16 months of it on the first import, then nightly.
This is the whole measurement substrate. Without it there are no findings, no rankings and no verdicts, because there is nothing to measure against. The grant is read-only and per-site, and revoking it in your Google account stops collection immediately — the engine notices and tells you rather than rendering the last numbers it saw.
Bing Webmaster Tools — optional
An API key you paste, which you can rotate whenever you like. It adds crawl outcomes and keyword volume, and — more usefully — a second opinion: when Google and Bing disagree about a page, the disagreement is itself evidence about which of the two result pages is the problem.
Without it, findings still work. You lose corroboration, not capability.
Analytics — optional
A PostHog project, connected read-only. It exists to answer the one question search data cannot: which pages are worth anything. A post drawing forty thousand impressions and a pricing page drawing four hundred are not the same page, and only your own outcome data knows that.
Without it, rankings weigh search demand alone, and the correction is to declare page value yourself — see below.
Where the engine can write — optional, and pick one
Three kinds, and a site has one. A repository is the fullest of the three and most sites do not have one; a Webflow or a WordPress site connects with a credential you issue and revoke yourself, and needs nothing installed here.
They are alternatives, not additions. Your pages come from one place — one build, one render, one publish — so connecting a second is refused rather than accepted and then quietly ignored. To move from one to another, disconnect the first. Nothing already applied to your site is undone by that and the record of what shipped is kept; anything the engine had proposed and you had not yet approved is dropped, because it was written against a place it can no longer reach.
Everything before this section reads. These write, and none of them writes anything you have not switched on.
Webflow or WordPress
For Webflow, a Site API token generated in that site’s own settings and scoped by Webflow to that one site. For WordPress, an application password issued from your own profile, which cannot sign in to wp-admin and is only ever sent over HTTPS. Either lets the engine change a page’s SEO title and meta description, and — where you turn on writing new pages — write a whole post into the collection your own pages of that kind already live in. What it cannot do is rewrite prose on a page you already have or move a link: those need a checkout for a coding agent to read, and there is none here.
A CMS has no branch to hold an edit in, so the review happens before the write: the engine works out the exact new value, shows it beside the current one on your site page, and writes when you approve it. Then it reads the live page back, and reports the change as not applied if the page does not show it. There is no setting that skips that step, because there is nothing for one to skip to — neither CMS can hold a pending edit that a stray publish will not take live.
A new page works the other way round, because both can hold one of those: it is written into your CMS as an unpublished draft — WordPress calls it a draft, Webflow calls it one too — which nothing renders and no other publish takes live with it. So what you read is the real page, laid out the way every other page on your site is, rather than a description of one. Publishing it is the approval. Declining deletes the draft, which is a cleaner undo than a repository can offer. And if you have turned on publishing without asking, a page goes live in the same run — that setting means the same thing here as it does on a repository.
Undoing one is exact rather than reconstructed: each change keeps the value the field held before it. It refuses to undo a field somebody has edited since, because at that point the old value is not yours to restore.
What each can reach is discovered rather than assumed, and it varies. On WordPress it depends on which SEO plugin is installed and — measured, not guessed — on the kind of page: the same plugin on the same site can offer a blog post’s title to the API and not a page’s. On Webflow, a collection template is refused outright, because its SEO settings are the default for every item in that collection rather than the value of one page. Anything that cannot be reached is reported as advice with the reason, never skipped quietly.
A repository
A GitHub App installation on the repository your site is built from. It lets the engine locate the file behind a page, so a suggestion can name the line to change rather than the URL to go and look at. With writing switched on it also opens pull requests for a person to merge — one until the first is decided, then at the pace set for the site. A second switch, off unless you turn it on separately, lets them merge on your own checks instead: nothing here builds your site, so a repository that reports no passing check merges nothing at all. The first change of every kind still meets a person, and so does a sample of the rest at whatever share you set.
There is one switch, and it covers both halves of how a change gets made. Where the engine has a function for the change it uses it, because a substitution decided in advance is checkable and a model reading a repository is not. Five kinds of edit work that way:
- Metadata — a title or description, rewritten within the length Google actually displays.
- Internal links — adding or rebalancing links between pages you already have.
- Link targets — an existing link repointed at the page it already redirects to. Nothing is added and nothing is written: the old URL and the new one are both literals, and the new one came from your own server’s redirect. A link that resolves to an error is not included, because where it should point instead is not something the engine can know.
- One sentence of prose — inserted into a section the suggestion already named, carrying terms the page is missing. Never a rewrite, never a new section: the change is bounded, has to be built from material the page already carries, and is checked for inserted facts before it is opened.
The last is the one to know about before switching writing on, because it is the only one of the five that writes words a reader will see. It is also the one whose worth no check can establish — whether a sentence is worth reading is the reviewer’s judgement and nothing else’s.
Writing is not all-or-nothing. Each site carries a confidence bar, and the engine writes only what clears it — everything else stays advice for your agent, and says so on the row rather than sitting there looking capable. A suggestion whose evidence is speculative is refused at any bar, including one set to zero: where nobody has established the effect exists at all, the confidence beside it is the engine’s own estimate, and clearing a threshold with it would be the engine marking its own work.
The half a function cannot express
The five edits above are substitutions settled before anything is cloned: a proven span, a matched phrase, a URL your own server supplied. They cover about a third of what the engine finds. The rest — a page missing a subject its competitors cover, two pages competing for one query, markup with a gap — end in a judgement no substitution expresses.
Those go to a coding agent working inside a checkout of your repository. This used to be a second setting you could decline, and that was a worse design than it sounded: declining it did not make the same work more careful, it removed two thirds of the work while reading like the cautious option. So it is one switch, and this is the part of it worth reading before you turn it on. What the agent may do:
- Read and edit files that already exist. No shell, no network access, and no ability to create files — a new file is a new page, which is your decision rather than a consequence of a ranking finding.
- Nothing outside page content. Build configuration, deploy workflows, dependency manifests and environment files are rejected and reverted before anything is pushed, as are deletions and renames.
- A bounded diff. Five files and 120 changed lines. A run over either is discarded whole rather than trimmed, because half of a coordinated set of edits is a worse state than either end of it.
- No invented facts. It may not state a price, a date, a statistic or a capability that is not already in your repository. Ratings and review counts are refused outright at any confidence: writing one fabricates what real people said.
A run that finds it needs a fact your repository does not hold stops and says which fact. That is the intended outcome in that case, not a failure — and it is the reason the mode is worth having even where it changes nothing.
No token is stored — an installation id, the repository name and its default branch. Access tokens are minted per operation and held in memory only.
What you tell it directly
Some of what the engine needs is a judgement rather than a measurement, and no connection supplies it:
- What this business sells, and to whom. It is why a pricing page can outrank a free tool that draws ten times the traffic.
- What a page is worth, where analytics cannot say. Declared values beat inferred ones and are recorded as yours, so a later measurement never quietly overwrites your judgement.
- Who you consider a competitor. The engine discovers a set from the queries you both rank on; it does not know which of them you actually lose deals to.
- What is changing. “We are launching X next month” and “we have deprioritised the free tools” change what the same numbers mean.
All four can be set from the app or by your agent with set_context. Everything declared this way carries its source, so a guess never reads later as a fact.
Instant submission
Turning on IndexNow generates a key for your site and, once it is live, every change you report also tells Bing, Yandex, Seznam and Naver that the page moved. Google does not participate. It costs nothing to run and shortens the gap between shipping and being re-crawled — which is the gap a verdict is waiting on.