You @mention the bot. The bot replies. You approve. The post ships. That’s the surface. Here’s the substrate.
The actors
Six agents run on Cloudflare Durable Objects, each scoped to a single job:
- Supervisor. Sees every chat message, classifies intent, routes to workers, composes the reply.
- Analyst. Reads Google Search Console, GA4, and your indexed site. Returns topic ideas, page audits, and content briefs grounded in data.
- Writer. Drafts Hugo markdown in your brand voice. Uses the Analyst’s brief plus your tuned voice doc and few-shot examples.
- Publisher. Opens GitHub PRs, retrieves Cloudflare Pages preview URLs, merges approved PRs. Deterministic plumbing.
- Approver. Parses
approve/revise: .../rejectfrom chat. Validates the chat user is on the approver list before doing anything. - AEO Workers. Ephemeral and parallel. Each one samples a single AI assistant for a single prompt and extracts entities.
The Supervisor is the only one you talk to. The rest run behind the scenes.
The full walkthrough
1. Topic ideation
@ContentAgent what should we write about?
The Supervisor classifies this as topic_ideation and delegates to the Analyst. The Analyst makes up to eight tool calls: GSC queries for top queries by impressions / position / CTR, GA4 queries for traffic-to-conversion mapping, semantic search over your indexed corpus to find gaps, and competitor SERP checks for queries where you’re close to ranking.
Within about 20 seconds, the Supervisor replies in chat with three to five ranked topics, each backed by specific numbers. Example:
1. DMARC for B2B SaaS. 4,210 impressions/month, position 14. CTR is 0.4%. If you can move to position 6 with a stronger post, projected click increase is around 280/month based on your category’s CTR curve.
2. Zero-trust onboarding playbook. Competitor Hooli ranks #3 with a 2,400-word post (8 months old). Your closest post is a tangential “why zero trust” piece from 2024. Direct comparison gap.
3. Email auth and AI phishing. Rising query, +180% impressions QoQ. You don’t have anything on this yet. Competitor coverage is thin (top result is an MIT Technology Review article from last week, not vendor content).
2. Drafting
@ContentAgent draft a post on DMARC for B2B SaaS
The Supervisor runs the Analyst again (this time for a tighter content brief: key facts, internal links to reference, length target), then hands the brief to the Writer.
The Writer loads your brand voice doc and example posts from your repo, then drafts a complete Hugo markdown file with frontmatter, body, internal links, and a CTA matching your voice doc’s CTA pattern. It validates the frontmatter against your configured schema (standard or strict) before producing the final output.
The Publisher then opens a GitHub PR. The branch name is content/<request-id>, the file path is content/blog/YYYY-MM-DD-<slug>.md, and the PR body says exactly what to reply for approve/revise/reject. Cloudflare Pages picks up the branch and deploys a preview within 1-2 minutes.
You get a reply in chat:
Draft ready. PR #142.
Preview: https://content-142.example.pages.dev
Reply with approve to merge or revise:
to iterate.
Total elapsed time from your draft command to draft-ready: around 30 minutes for a typical 1,200-word post.
3. Approval or revision
You read the preview. If it’s good:
approve
The Approver agent parses the command, validates your chat user ID is on the tenant’s approver list, and writes an approval record to the Supervisor’s storage. The Supervisor then asks the Publisher to merge PR #142. The Publisher’s merge_pr tool calls back to the Supervisor to verify the approval exists before merging. Single source of truth, gated by design.
If the draft needs work:
revise: tighten the intro and add a specific CTR stat
The Approver records this as a revision command, the Supervisor passes the feedback and previous draft to the Writer, and the Writer pushes a new commit to the same branch. A few minutes later you get a “revision pushed” reply with the updated preview URL. Repeat until you say approve.
If someone who’s NOT on the approver list tries to approve, the Approver checks the user_id against the configured list and returns “approver not authorized”. Refused before any LLM call runs.
4. AEO baseline
@ContentAgent AEO baseline
The Supervisor fans out 20-30 AEO worker DOs in parallel, chunked into batches of 10 to stay within Cloudflare Worker subrequest limits. Each worker samples one assistant for one prompt. Perplexity or Claude-with-search at v1, with ChatGPT and Gemini coverage in active development. Each worker then makes one short Haiku call to extract structured entities from the response: was your tenant mentioned, which competitors were mentioned, which sources were cited.
Results are aggregated and snapshotted to your R2 bucket. If you’ve run a baseline before, the new one is diffed against the previous and the trend is reported back in chat:
AEO baseline complete. 30 samples across 2 assistants, cost about $1.40.
Tenant mention rate: 47%
vs previous baseline: mention rate ↑ +12.0 pts
Snapshot stored at
aeo/baselines/2026-05-24.json.
Total wall-clock time: 60 seconds or less for the full baseline.
The non-obvious bits
Conversation history is persisted per channel. If someone in your team asks “draft another like the DMARC post”, the Supervisor knows what that refers to. The history lives in the Supervisor’s per-tenant Durable Object SQLite. No external database, no cross-tenant leakage.
Budgets are enforced per request and per UTC day. Every LLM call is metered against caps in your tenant config. A runaway draft loop can’t bankrupt you. The per-request cap kicks in first.
Site corpus is reindexed nightly. A scheduled handler reads your Hugo content directory via the GitHub API, chunks any changed posts, embeds them via Cloudflare Workers AI, and upserts to Vectorize. This is what powers the Analyst’s “find me internal links to reference” tool.
Every operation produces a Langfuse trace. Tenant ID, request ID, agent name, prompt version, model. All tagged. If something goes wrong, the trace is the diagnostic path. You can request access to your own traces.
What I’m responsible for
In the founding cohort:
- Setup (week 1). Cloudflare deployment, secrets, GSC + GA4 service accounts, chat bot wiring, GitHub webhooks. About 6-10 hours of my time spread across one week.
- Brand voice tuning (weeks 2-4). Working with you on the voice doc, iterating against real drafts the agent produces, and getting to “sounds like your team” before we declare the implementation done.
- Ongoing (weeks 5+). Quarterly strategy reviews. Prompt tuning when the eval set shows drift. Bug fixes. New features as they ship.
You’re responsible for:
- Replying to drafts (approve / revise / reject).
- Setting publication strategy (what topics to pursue, what to skip).
- Letting me know when the bot is producing weak drafts so we can tune.
See for yourself
The fastest way to evaluate fit is a 25-minute discovery call. I’ll run Content Loop Studio against your real Search Console data (read-only, on a temporary scope) during the call so you can see the output quality on your actual domain before deciding.