// OPEN CORE

The engine is open.

Citeworthy runs on seo-agent — our own MIT-licensed Cloudflare Worker. Not a demo, not a stripped "community edition": the same crawl, the same rules, the same proposal pipeline, the same edge injector. Clone it and run it today.

The engine is open source. Running it is the product. That sentence used to be a button to a signup. It is now an architecture: you point one DNS record at us and we serve your site from a proxy we operate — no Cloudflare account of your own, no plugin, no code change.

github.com/awizemann/seo-agent or let us run it for you
MIT licensed · Cloudflare Workers · no vendor lock beyond Cloudflare itself.
// WHAT THE LIBRARY ACTUALLY DOES

The whole pipeline, in the open.

Every line below is a feature of the public repo at v1.21.0 — read the source if you'd rather not take our word for it.

Crawls your sitemap, snapshots what crawlers actually get

Daily, from a Cloudflare Worker — the pages, the headers, and the difference between what a browser sees and what a bot sees.

Turns that into findings with deterministic rules

Titles, descriptions, canonicals, sitemap hygiene, structured data — plus the AEO posture: robots.txt AI-crawler policy, llms.txt health, and whether a page serves any content without JavaScript.

Drafts constrained meta proposals with Workers AI

Nothing is written until a proposal is approved. Every applied change is journaled and reversible.

Applies approved changes at the edge, with no CMS deploy

The companion injector Worker merges KV overrides — title, description and Article JSON-LD — over your computed <head>, as middleware if your site is a Worker, or as a proxy Worker on a route for any other origin behind Cloudflare.

Serves llms.txt, robots.txt policy and markdown twins

Including "Markdown for agents": a .md twin per page, served on an Accept: text/markdown negotiation, on any Cloudflare plan.

Reads Google Search Console through your own service account

Read-only. Impressions, queries, positions — the fuel for CTR work and for measuring whether a change did anything.

Scores impact at 14 and 28 days

Before/after on the pages you changed, so a change gets a verdict instead of a vibe.

Exposes the whole thing over MCP

A stateless Streamable-HTTP MCP server at /mcp on your own Worker — connect Claude Code to your own instance with one command.

// SELF-HOST OR HOSTED

Two honest options.

Self-hosting is a real answer, and for a technical team with one site it may be the right one. This is what each side costs and gives — facts, not a scare column.

// WHAT SELF-HOSTING REQUIRES
Your own Cloudflare account

Workers, D1, KV, Queues and Workers AI, created and wired up by you.

wrangler deploy, per site

The agent Worker plus the injector Worker on the zone in front of the site.

One instance per site

The library is a single-site Worker, and the injector goes on the zone in front of the site. Ten sites is ten deployments and ten databases.

Your own GSC service account

A Google Cloud project, the Search Console API enabled, a JSON key, and the service account granted access in Search Console.

Raw knobs, scripted or hand-written

Facts, markdown twins, vocabulary and autoApplyFields are configuration. Powerful, unopinionated, and yours to get right.

No support

It is MIT code. Issues are welcome; an SLA is not on offer.

You keep everything, forever, under MIT. If you outgrow it, your data is yours and the path into the hosted product exists.

// WHAT CITEWORTHY ADDS
The managed edge, on any host

One DNS record. We hold the custom hostname and the certificate on our zone and proxy to your real origin, so there is no Cloudflare account of your own, no API token, no plugin and no code change. WordPress, Shopify, Squarespace, a Vercel app or a VPS — from where we stand they are all just an origin.

Edge analytics, per engine

Four kinds of hit kept as detailed rows — AI crawler, assistant referral, markdown-lane agent, and search arrival counted separately because it is a human. 21 AI crawler tokens, 14 assistants, 15 named search engines — counted off the classifier, not typed. Underneath them, every request your site serves through us is counted across 9 categories, catch-alls included. Only the referrer's hostname is ever stored, and a counted request stores nothing at all.

Search Console by OAuth, not a key file

One click and a read-only scope instead of a Google Cloud project and a JSON key — plus the low-CTR fix loop the service-account path never had.

An operational posture

Fail-open serving, a customer-operated kill switch, a public status page and synthetic probes. The MIT repo ships none of that, because it is not a service.

Multi-site dashboard

Every site you own in one place, with one switcher — no per-site deploy.

Google sign-in, one-click Search Console

OAuth instead of a service-account key file. Read-only scope, and disconnecting deletes the data.

A claim guard on every draft

Drafts are checked against the facts you confirmed, so generated copy cannot invent a price, a number or a guarantee.

Edit the draft before you approve it

A title or a description is yours to rewrite in place, and the edit re-runs the same validator and the same claim guard. A structured-data document or a whole resource file is offered as-is instead — those you accept or reject, because half-editing a canonical document is how you ship a broken one.

Drafting happens in the background

You click, it queues, and it turns up on your proposals page. Nothing to sit and watch, and a second click on the same page will not start a second draft.

Profile, facts and vocabulary extraction — with a human confirm

We read the site and propose them; nothing counts as true until you say so.

Value-weighted prioritization

Severity times what this page is actually worth on this site — not a fixed severity order.

Earned autopilot

A fix type only goes automatic after real, settled, non-negative d28 verdicts on that type, on that site. One negative verdict takes it back.

Weekly digests and alerts

The email that tells you a metric moved, so you are not required to remember to look.

One-click edge fixes — and one-click revert

Approve from the dashboard, live at the edge; undo the same way.

A human at hello@citeworthy.io

Which is the honest whole of it: a person answers.

The judgment layer — guards, priorities, earned autonomy and someone to email. How that compares to other tools →

// THE SHORT VERSION
The engine is open. The judgment is the product.

Capability is open source. What stays ours is the part that decides which change is worth making, checks a draft against what is true about you, and refuses to hand a fix type the keys until it has measured that fix type helping. That is a product, and we charge for it.

// WHERE THE LINE IS

Pipeline capability is open. Judgment is not.

The reader's real question about any open-core product is "where's the line, and will you move it?" We wrote our answer down before it was convenient, and this is it.

Open, and staying open

Crawl, the rule set, proposal drafting, the edge injector, llms.txt, markdown twins, impact scoring at 14 and 28 days, and the MCP server. All MIT, all in the public repo, all the same code we run.

Ours, and staying ours

The claim guard that refuses a draft, the prioritizer that decides which fix is worth making, and the ladder that won't hand a fix type the keys until it has measured that fix type helping.

// THE PART THAT COST US SOMETHING
The engine is open source. Running it is the product.

The open package keeps autoApplyFields as a raw knob you can point at your own foot — we did not take it away to sell it back. What we did instead is pin the hosted pipeline to an empty autoApplyFields, permanently, with a test that fails if anyone changes it: the hosted product can never auto-apply through the library at all. Every automatic action we ever take is a control-plane approver walking the exact same guard stack your click walks. Self-hosting gives you more raw power here, not less, and that is the honest shape of the trade.

One more good-faith proof, since this page is about checkability: our edge traffic classifier is a copy of the open injector's, and a test drives the real OSS Worker and our proxy over the same matrix of requests, failing if they disagree on a single hit. The copy is not trusted, it is checked. What it classifies →

// WHAT IS NOT READY YET

The unflattering half.

A page about honesty that only lists wins isn't one.

// COMING SOON
MCP in the hosted app

The open-source Worker serves an MCP endpoint of its own — connect Claude Code to your own instance today. Per-site MCP endpoints inside Citeworthy are coming soon: there is nothing to connect yet, and we won't print a URL that 404s.

// COMING SOON
Paid plans

Pro launches soon. There is no checkout today, so there is nothing to buy — the free tier is real and works now, and we'll email you the day paid plans open.

// OFF BY DEFAULT
Headless-browser twins

For markdown twins we read your HTML, then JSON-LD, then a content API. Rendering a page in a headless browser is the last resort and is off unless browser rendering is available on your account — it costs money, so it is never switched on quietly.

// EITHER DOOR
Run it yourself

Clone, deploy, own it. Issues and pull requests welcome.

read the source
Let us run it

Free tier, one site, no card. Sign in with Google and point us at a domain.

start free