- Runtime
- Cloudflare Workers in TypeScript, no framework. D1 with 36 migrations, KV for pages and the raw archive, Cron every 5 min with a scheduler lock and a heartbeat ping to an external monitor.
- Pipeline
scan → fetch → parse → rework → verify → publish → digest. The parser fails loudly: if the source markup changes, the source is flagged and an alert goes out. Nothing is guessed. - Models
- Claude Sonnet rewrites; Claude Haiku writes meta descriptions and runs structural QA. JSON-LD is assembled in code, never by a model.
- Approvals
- Approval links are random, single-use, bound to one article, stored only as a hash, and expire after 72 h. Client preview links are revocable.
- Edge overlay
- The Worker is bound to one path route, so it cannot touch any other URL. If it throws, the request passes through to WordPress. The Edge Hub borrows the live header, footer and cookie banner and caches that shell for 1 h.
- Link validation
- Every AI-suggested link must use an anchor that exists word for word in the article and point to a page that exists. 72 failed: 36 invented anchors, 36 non-existent pages. A relevance pass then rejected 179 more, leaving an average of 3.97 links per article.
- AI crawlers
- Explicit allowlist, llms.txt, sitemaps, IndexNow, and per-bot hit counts for 16 named AI crawlers.
- Attribution
- The article a visitor read travels in the URL to the contact form. No cookies, no storage.
- Tests
- 649 tests in 42 files, runnable offline in mock mode against real captured pages.
- Handover
- Zero-downtime move into the firm’s own Cloudflare account in Sept 2026, CI deploys on push, rollback Worker kept in place.