An open-source, self-hosted autonomous SEO engineer. It crawls your site, connects to Search Console, finds what's broken across 425 checks — then writes the fix into WordPress, Shopify, your Git repo, or the edge. As a diff you can read and revert.
Runs once via npx — nothing installed. For a permanent sean command: npm i -g agentsean.
Reports are cheap. The gap in every SEO tool is that a human still has to go and do the work. Here is a real onboarding run — it types itself out.
$ npx agentsean ? What site should Sean work on? https://acme.example ? Where does it live? WordPress ? Connect Search Console? yes → 127.0.0.1:7777/connect Crawling acme.example ············· 80 pages · 6s Running 425 checks ············· 14 findings · score 62 critical RESP.4XX_INTERNAL 3 pages return 404 medium IMG.MISSING_ALT_ATTR 31 images without alt text medium LINK.BROKEN_INTERNAL 4 internal links return 404 …11 more ✓ Sean is watching. 7-day observe window, then it starts fixing. Dashboard http://127.0.0.1:7777 Survive reboot sean service install Stop everything sean freeze
sean freezeA finding, and the fix for it, side by side. Apply it and watch Sean snapshot, write, and verify against the live page. Then take it back — the snapshot is always there.
Title length 12/60 recommended. The highest-ROI autonomous action there is — controlled tests show ±8–16% swings from title rewrites alone.
Every change stores a before-snapshot. Revert is one command, forever.
Serving crawlers a JavaScript-proxied page also sits uncomfortably close to cloaking.
| Report-only tools | Proxy "auto-fix" tools | Agent Sean | |
|---|---|---|---|
| Finds issues | Yes | Yes | Yes |
| Writes the fix | No | At a JS proxy | Into your source of truth |
| Survives cancellation | — | No | Yes |
| Reviewable diff | — | No | Yes |
| One-click revert | — | — | With a stored snapshot |
| Self-hostable | Sometimes | No | Entirely |
| Your data leaves your machine | Yes | Yes | Never — local-first, BYOK |
A crawling agent reads pages authored by people with a financial interest in you ranking worse — and it holds keys to your website. Everything below follows from that.
Crawls and parses. Emits closed-schema structs with zero free-string fields.
Decides what to do. Emits typed actions. The LLM lives here and only here.
Applies validated actions. Snapshot, apply, re-fetch to verify, record.
No plane both reads attacker-controlled bytes and holds a credential. That separation is structural, not a policy.
No action may contain a URL or domain whose first sighting was inside third-party content. One deterministic rule that kills canonical injection, attacker redirects, hreflang poisoning and disavow attacks — without asking a model to be clever.
Binds 127.0.0.1:7777. Host-header allowlist, Origin and Sec-Fetch-Site checks, CSRF header, constant-time token compare, CORS stripped. Auth cannot be disabled; binding off-loopback without it throws before the socket opens.
Hidden text, Unicode tag blocks, bidi overrides, base64 and HTML-entity payloads, X-AI header injection, off-site canonicals, JSON-LD hijacks. Adding one that gets through is a build failure.
Every adapter implements the same six methods, and verify always re-fetches the live page. An API saying "ok" is not evidence.
| Surface | How Sean writes | Rollback |
|---|---|---|
| WordPress | Companion plugin + Application Passwords. Understands Yoast, Rank Math, AIOSEO, SEOPress. | Revision restore |
| Shopify | Admin GraphQL SEO fields and metafields. Theme writes refused. | Field restore |
| Next.js / any Git repo | A branch, a commit, and a pull request you read before merging. | git revert |
| Squarespace · Framer · Duda | Cloudflare Worker overlay. Never branches on user-agent. | Overlay removal |
| Webflow · Ghost · Wix · BigCommerce | Native SEO APIs | Field restore |
| Contentful · Sanity · Strapi · Payload | Generic headless adapter | Field restore |
Request an adapter → the interface is six methods
Every result Sean reports carries an evidence tier from A to E. The tier is assigned by a formula, not chosen — and the code will not attach a causal claim to anything below tier A.
A pre-registered split-cohort test with a matched control and enough traffic to reach significance. The only rung permitted to say a change caused a result.
A treated group measured against a comparable untreated one, where the effect clears the minimum detectable effect. Strong, but not a controlled experiment.
Before-and-after on the same pages, annotated against known Google updates so a ranking shift isn't quietly credited to Sean when the algorithm moved.
Movement in the right direction, but below the minimum detectable effect. Reported as a hint, never as proof.
The change is live and reverted-able, but this site's traffic is too low to measure an effect. Most small sites land here — and Sean says so plainly instead of inventing a number. This is the default.
Per-URL click attribution is refused outright — clicks are only ever attributed to a cohort, never a single page. A tool that promises more than the data supports is the one people stop trusting.
Not a crippled tier. Free forever. Cloud exists because not everyone wants to run a daemon.
The complete product, on your own machine.
One site, hosted. We run the daemon and handle Google OAuth.
Everything switched on, for everyone who touches the site.
For regulated estates and procurement.
Every plan is bring-your-own-LLM-key — you pay the model provider directly, at cost. That is what keeps the price honest.
Every change stores a before-snapshot, then re-fetches the live page to confirm the write landed — and rolls back automatically if it didn't. Dangerous categories (robots.txt, noindex, redirects, canonicals, page deletion) always require a human click and cannot be set to auto. New sites get a 7-day observe-only period where Sean watches and proposes but writes nothing. sean freeze halts everything, everywhere, and survives a restart.
The design constraints come from Google's own spam policies, not our caution. Content generation is capped at 2 new pages and 2 refreshes per day per site, because scaled content abuse is defined by scale. Link buying, PBNs, cloaking, hidden text and review gating are refused with no setting to enable them. The edge worker is asserted in CI to never branch on user-agent.
Narrow judgement calls only, on closed-schema structs — never raw page content, never a credential, and it never calls a write API. It emits typed actions that deterministic code validates against 15 checks before anything is applied. Prioritisation is a published formula, not a model output.
No. The free stack — Search Console, Analytics, PageSpeed, CrUX, Bing, and Sean's own crawler — covers roughly 90% of capability with zero paid keys. sean audit runs the full 425-check audit with no account and no credentials at all. You supply an LLM key for the writing features; paid data providers are optional and quote their cost before spending.
Sometimes, and it says so when it can't. Every claim carries an evidence tier from A to E, and only tier A — a pre-registered controlled experiment with a matched cohort — is allowed to claim causation. Small sites usually land at tier E, which reads "applied; not measurable at this traffic volume." Tools that promise more than that are the ones people stop trusting.
Because it's a real OSI-approved licence rather than a source-available substitute. You can self-host, modify and redistribute. The network-use clause is what prevents someone reselling it as a hosted service without contributing back. Commercial features live in a separately-licensed packages/ee/ so the AGPL claim over the core stays clean.
sean audit runs the full 425-check audit with no daemon, no
account, and no credentials. If it isn't useful, you've lost a minute and a half.
Cloud accounts are opening in batches — join the discussion for an invite, or talk to us about Enterprise.
OpenSEO proved an open-source SEO platform could work. Agent Sean is the execution layer that writes reversible diffs to your actual site — not a fork of OpenSEO, and not a report that stops at the finding. Selected modules are ported under MIT with attribution.
The 66,000-word engineering plan this was built from and the 3 MB of fact-checked research behind it are both published in the repository. The locked lists of actions Sean will never take are a commitment, not a default — see GOVERNANCE.md.