The architecture of the Editor's Stack, agent by agent.
Five agents. One shared file system. A site, a publication and a distribution pipeline that ship the same way every day. Same architecture, different voice. It flexes from a SaaS product to a personal brand. This page is the full document. Enough detail for a determined marketer to attempt it themselves.
MissingLinkz
Campaign-link infrastructure. Uncontested high-intent SEO, daily Writer Agent posting, X / LinkedIn / Reddit distribution.
GoodVibeMarketer
Voice-driven thought leadership. Slower cadence on the website, sharper edge in the voice, weekly Newsletter Agent on Beehiiv.
Infrastructure you own. Taste as the gate.
Most marketing infrastructure is rented. You publish to platforms you don't control, in templates someone else designed, against algorithms that change without warning. The Editor's Stack is the opposite.
The website is your code. The agents are your prompts. The newsletter list is owned, not borrowed. Distribution is drafted by agents but posted by humans on accounts you log into.
The mental model is small and stubborn:
Clarity over cleverness.
Every agent reads two documents before it does anything: a voice guide and an identity brief. If those two files are vague, every output is too.
Files over APIs, where possible.
Agents hand work to each other by writing to a shared folder of plain markdown. No queue server. No glue code. The file system is the message bus.
Drafts go to humans. Schedules go to machines.
Cron jobs run the agents. A pull request is the editorial gate. Nothing ships to the public without a person clicking merge.
Taste is the moat.
The agents are commodity. The voice and judgement are not.
The throughline. The MissingLinkz stack and the GoodVibeMarketer stack are the same architecture. Different voice, different cadence, different channels. Once you understand the shape, you can tune it for either a product company or a personal brand without re-inventing the pipes.
Five agents and one shared file system.
Each agent owns one job. They communicate by reading and writing files in a single directory. That directory lives in git, which means every state change is reviewable, revertible and auditable.
The shared file system
The integration layer is a folder called content-plan/ at the repo root. It contains the documents every agent depends on plus the queues that pass work between them.
| File | Owned by | Purpose |
|---|---|---|
VOICE.md | Human | Tone, rhythm, banned phrases. Read by every agent before it writes anything. |
IDENTITY.md | Human | Positioning, audience, the things you must never sound like. |
SEO_AUDIT.md | SEO Agent | Rolling 30-day audit schedule and findings log. |
KEYWORD_TARGETS.md | SEO Agent | Master list of bottom-of-funnel keyword opportunities. |
COMPETITORS.md | Human + SEO Agent | Who matters, what they're shipping. |
AEO_PROMPTS.md + AEO_MONITOR.md | Human + SEO Agent | Prompts the SEO agent runs weekly against Perplexity; snapshot table of whether you're cited. |
SEO_QUEUE.md | SEO → Writer | Article briefs handed from SEO to Writer. |
PUBLISHED.md | Writer Agent | Single source of truth for what's live. Read by Social and Newsletter. |
SOCIAL_DRAFTS/ | Social Agent | One markdown file per article. All four platforms inside. |
SOCIAL_POSTED.md | Human | Live URLs after you post. Closes the loop. |
The directory sits at content-plan/ at the repo root.
One job each. Strict input. Predictable output.
Every agent is configured the same way: a prompt file describes the job, a workflow file schedules it, the runtime is claude -p in headless mode. Cost caps are hard-coded. Nothing surprises you.
| Agent | Job | Input | Output | Human step |
|---|---|---|---|---|
| Website | Build pages, posts, components | A brief, in conversation | Pull request | Review + merge |
| SEO | Audit, research, brief | Live site + competitor list | Fixes, keywords, briefs | Approve the draft PR |
| Writer | Draft blog posts | SEO_QUEUE.md briefs | MDX posts in src/content/blog/ | Optional pre-publish edit |
| Social | Draft platform posts | Last 7 days of published posts | One file per article in SOCIAL_DRAFTS/ | Review, post on three platforms |
| Newsletter | Weekly issue | Week's posts + research | Draft in Beehiiv | Approve before send |
Website
Build pages, posts, components
The Website Agent is the dialogue you have with Claude Code at your terminal. It is the agent that built this very page. There is no cron job. The trigger is you, asking for a thing.
The reason this counts as an "agent" rather than "just using Claude" is that the rules are written down and the path to production is the same as any other change. The agent reads VOICE.md and the existing site to match conventions. It edits files. It runs the build. It commits and opens a pull request. A human merges. Cloudflare deploys. The website updates. Same path as a blog post or a workflow change.
Used heavily during launch to ship the marketing site, pricing page, signup flow and post-signup education. Then it goes quiet between launches.
Used continuously. New pages, copy revisions, component tweaks, the diagrams on this very page. The voice has to be sharper, so iteration is higher.
SEO
Audit, research, brief
Runs weekly on Sunday at 06:00 UTC via GitHub Actions. Four phases, committing after each so partial progress survives a crash.
- Audit. Up to five pages on a 30-day rolling schedule. Reads the source
.astroor.mdand the rendered HTML from production. Auto-fixes the safe stuff (meta description, alt text, OG / Twitter / JSON-LD). Flags the judgement calls. - Research. Up to fifteen WebSearch calls and ten WebFetch calls. New finds land in
KEYWORD_TARGETS.mdandCOMPETITORS.md. - AEO monitoring. Every prompt in
AEO_PROMPTS.mdgoes to Perplexity. Ifgoodvibemarketer.comappears in the citations, that's a row inAEO_MONITOR.md. If not, we log who was cited instead. - Brief. Up to five researched keywords become article briefs in
SEO_QUEUE.mdfor the Writer Agent.
Workflow at .github/workflows/seo-agent.yml. Prompt instructions at content-plan/SEO_AGENT.md.
Cost caps are not advisory. They're in the prompt and the agent stops when it hits them. Target spend is under one dollar per run.
Cost caps: 1. Audit no more than 5 pages per run. 2. Cap WebSearch calls at 15 per run. 3. Cap WebFetch calls at 10 per run. 4. If you hit the caps, stop research and move to briefs. Branching: Never push commits directly to main. The workflow opens a draft pull request on a dated branch for review.
Keyword targets are uncontested, high-intent product queries. Audits prioritise pricing, comparison and integration pages.
Keyword targets favour bottom-of-funnel topical authority ("brief writing for AI", "AI workflow for marketers"). AEO monitoring matters more because the audience is asking questions to LLMs.
Writer
Draft blog posts
Daily at 06:00 UTC. Reads the next unpublished brief in SEO_QUEUE.md (or core content from a content plan). Writes the post into src/content/blog/[slug].md. Updates PUBLISHED.md. Commits, opens a pull request.
Three rules sit above everything else in the Writer's prompt:
- Read
VOICE.mdfirst, every run. Not the cached version. The current one. If the voice has drifted, the next post must reflect it. - Trojan Horse hook. Directly answer the reader's question in the first two hundred words. Then pivot to why the manual approach is incomplete and why the leverage view changes the answer.
- Bottom-of-funnel intent only. No "what is" articles. No generic guides. Comparison, transactional or technical how-to.
Workflow pattern: .github/workflows/daily-content-agent.yml. Instructions: CLAUDE.md.
Higher volume: up to four posts per day during the launch fortnight, then two per day. Every post points at a product feature documented in PRODUCT_REFERENCE.md.
Lower volume, sharper voice. One or two posts a week, drafted by the agent then heavily edited by hand. Volume isn't the moat. Voice is.
Social
Draft platform posts
Daily at 10:00 UTC, four hours after the Writer. Looks at posts published in the last seven days that don't yet have a draft. Up to three posts per run. For each one, writes a single markdown file at content-plan/SOCIAL_DRAFTS/YYYY-MM-DD-[slug].md containing four sections: LinkedIn, X, Reddit, Hacker News.
The agent drafts to files for every platform. A human posts LinkedIn, Reddit and Hacker News. X is the single exception, where a tighter auto-publish loop is allowed, and only with guardrails.
| Platform | Format | Default behaviour |
|---|---|---|
| X / Twitter | Thread (5 to 10 tweets) or single | Auto-publish allowed in tighter loops |
| 1000 to 1500 character post, hook in first two lines | Human review before posting | |
| Title + 400 to 800 word body, product mentioned once at the end | Human review before posting | |
| Hacker News | Default off | Only for launches or novel technical drops |
Workflow pattern: .github/workflows/social-agent.yml. Instructions: SOCIAL_AGENT.md.
Reddit matters more. Every article maps to one or two product-relevant subreddits. The agent flags promotional tone for review.
LinkedIn matters more. Hooks are sharper. The X thread is the secondary surface, not the primary one.
Newsletter
Weekly issue
Weekly. A small pipeline of four sub-agents that run in sequence and hand off through files.
- Research. Surveys the week's news in the niche, the week's posts in
PUBLISHED.md, and any flagged threads in the audit log. - Writer. Drafts the issue against the voice guide. Opinionated take, three sections, one practical action.
- Illustrator. Generates the hero image and any inline diagrams (the diagrams on this page are written by the Website Agent in the same way).
- Publisher. Pushes the draft to Beehiiv via API. Tags the audience. Stops before send.
The human approves the Beehiiv draft and clicks send. The agent never schedules a send unattended.
Two newsletters: a customer onboarding sequence (transactional, product-led) and a sales-and-marketing digest (top of funnel, weekly).
One weekly issue. The voice is the product. It carries everything else.
The file system is the message bus.
No queue server, no webhook glue. A keyword identified by the SEO Agent becomes a row in SEO_QUEUE.md. The Writer reads that file the next morning, drafts the post, marks the row done.
The Social Agent reads PUBLISHED.md four hours later and drafts the platform posts. The Newsletter Agent reads the same file at the end of the week.
Three properties fall out of this design that you don't get if you use a managed orchestrator:
- Every handoff is reviewable. A pull request shows the diff of
SEO_QUEUE.mdbefore the Writer ever sees it. - Every handoff is revertible.
git reverton a bad brief un-makes it. - You can run the same agent against the same input five times until you're happy. The files don't move while you iterate.
Six services, one repo.
GitHub as source of truth. Claude Code as the agent runtime, scheduled by GitHub Actions. Cloudflare Pages deploys on push to main and provides per-branch previews.
Each service does one thing. GitHub holds the source of truth — code, prompts, workflow files and secrets. Everything else hangs off it. The full setup notes are below.
| Service | Role | Setup notes |
|---|---|---|
| GitHub | Source of truth. Source code, agent prompts, workflow files, secrets. | Private repo. Protect main. Required reviews for the SEO / Writer / Social branches if you can. |
| Claude Code | Agent runtime. Both interactive (Website Agent) and headless (SEO, Writer, Social, Newsletter). | Set ANTHROPIC_API_KEY as a repo secret. Workflows call claude -p with explicit --allowedTools and --max-turns caps. |
| GitHub Actions | Scheduler. | Cron schedules in .github/workflows/. Each agent has its own workflow file. workflow_dispatch for manual triggers. |
| Cloudflare Pages | Hosting + deploy. | Connect the repo. Auto-deploy on main. Branch previews on every PR. Wrangler bindings for SEND_EMAIL. |
| Beehiiv | Newsletter list + delivery. | Set BEEHIIV_API_KEY and BEEHIIV_PUBLICATION_ID as secrets. Use tags as routing (a different tag per signup form). |
| Stripe | Payments for paid tiers. | Hosted checkout. A webhook updates entitlements. Keys live in secrets, never in the repo. |
| Cloudflare Email Routing | Transactional email from forms. | Sender address verified. The Astro endpoint sends through the SEND_EMAIL Worker binding. No SMTP secrets needed. |
| Perplexity (optional) | AEO monitoring source. | Set PERPLEXITY_API_KEY. If missing, the SEO Agent skips Phase 3 instead of failing. |
All credentials live in GitHub Actions secrets or Cloudflare environment variables. Nothing API-key-shaped goes in the repo.
Tone is in the prompt. Approval is in the PR.
The voice rules are not a vibe. They're a file. Every agent reads it before it writes. The same goes for what you are not. Both files are human-owned and never touched by agents.
The two source files
VOICE.md: how it sounds. Sentence rhythm, paragraph length, banned phrases (game-changing, revolutionary, unlock, supercharge, leverage-as-verb, dive into, level up, synergy, paradigm shift), UK spelling rules, the contrarian edge.IDENTITY.md: who you are. Positioning, audience, what you are not (no motivational coaching, no academic detachment, no tech-bro evangelism, no transformation-consultant filler). Personal boundaries defined explicitly so the agent knows what's off-limits.
Who reviews what before it ships
| Output | Goes to review | Auto-publishes |
|---|---|---|
| Website Agent: page or post edit | Pull request, human merge | No |
| SEO Agent: audit fixes and briefs | Draft pull request, human merge | No |
| Writer Agent: blog post | Pull request, human merge | No |
| Social Agent: X / Twitter | Tight review for in-house posting | Yes, with guardrails |
| Social Agent: LinkedIn | Always human-reviewed | No |
| Social Agent: Reddit | Always human-reviewed | No |
| Newsletter: Beehiiv draft | Beehiiv draft, approved before send | No |
The rule is small. Anything that touches the audience directly goes to a human first. X is the only place a tighter loop is acceptable, and only because the cost of a single bad tweet is low and the cost of being slow is high. Everything else waits for taste.
One path for every change.
A blog post, a prompt edit, a new page, a workflow change. All of them ship through the same five steps. There is no special path for content.
Commit, open a pull request, get a Cloudflare branch preview, review and merge, the change goes live. The same path applies whether the change is content, code or an agent prompt.
The weekly cadence
SEO Agent on Sunday at 06:00 UTC. Writer Agent daily at 06:00 UTC. Social Agent daily at 10:00 UTC, four hours after the Writer. Newsletter Agent on Thursday at 07:00 UTC. Human review windows on Sunday afternoon for the SEO PR and Thursday morning for the newsletter approval.
The weekly human touchpoints
If the system is running properly, the marketer's job each week is small, specific and visible.
| When | What | Roughly |
|---|---|---|
| Sunday afternoon | Review the SEO Agent's draft pull request. Approve fixes, triage flagged judgement calls, merge. | 20 minutes |
| Each weekday morning | Review the Writer's draft pull request. Edit if it needs sharpening. Merge. | 15 minutes per post |
| Each weekday late morning | Open the day's SOCIAL_DRAFTS/ file. Post LinkedIn and (optionally) Reddit. Update SOCIAL_POSTED.md. | 15 minutes |
| Thursday morning | Open the Newsletter draft in Beehiiv. Read it cold. Edit. Send. | 30 minutes |
That is the weekly job. Everything else has been written down and given to a machine.
Same architecture. Different voice.
Both reference implementations run identical wiring. The difference is in the configuration files.
| Dimension | SaaS · MissingLinkz | Personal brand · GoodVibeMarketer |
|---|---|---|
| Voice | Product-specific, useful, slightly understated | Strategic, slightly contrarian, opinion-led |
| Posting cadence | Up to four posts a day at launch, two daily after | One or two posts a week, edited heavily |
| SEO posture | Uncontested high-intent product queries | Topical authority and AEO citations |
| Channel mix | X · LinkedIn · Reddit (primary) | LinkedIn · Newsletter (primary), X secondary |
| Newsletter shape | Onboarding sequence + weekly digest | Single weekly issue, the voice is the product |
| What carries growth | SEO + Reddit + product-led signups | Newsletter + LinkedIn + paid Done-For-You |
| What's the same | All five agents. Git as source of truth. The file system handoffs. Cloudflare Pages + GitHub Actions. The review path. Cost caps. The discipline of VOICE.md and IDENTITY.md. | |
A realistic checklist.
If you are a determined marketer with no engineering background but comfort using Claude Code, this is the path. Plan a week of evenings.
- Get the accounts. Anthropic (for an API key), GitHub, Cloudflare (Pages + Email Routing), a domain, Beehiiv, Perplexity (optional). Stripe only if you're charging.
- Write your voice. Spend two hours on
VOICE.md. Tone, rhythm, fifteen banned phrases. Be brutal. - Write your identity. Spend one hour on
IDENTITY.md. Positioning in two sentences. Audience. Six things you are not. - Stand up the site. Astro starter, deploy to Cloudflare Pages, get one page live before you write a line of agent code.
- Wire the SEO Agent first. It's the lowest risk because it can't ship anything to the public without your approval. Set the schedule to Sunday and a manual trigger.
- Run it once. Watch the PR. Read every line of its first draft pull request before you merge anything.
- Add the Writer Agent. Daily schedule. Read three of its first PRs cold before you stop reviewing them line-by-line.
- Add the Social Agent. Four hours after the Writer. Don't connect any platform API yet. Just write drafts and post by hand.
- Add the Newsletter Agent. The sub-pipeline (Research → Writer → Illustrator → Publisher). Keep the human approval before send.
- Tune for a quarter. Update
VOICE.mdwhen an agent drifts. Add toCOMPETITORS.mdas you learn. Move the schedule around the rhythm of your week.
If you reach step four and want a working template rather than starting from scratch, the Course (a structured walkthrough) and the Done-For-You build are below.
Most of what stops marketers shipping this isn't the code. It's writing down what they actually believe clearly enough that an agent can act on it. The architecture is the easy half. The brief is the work.
Stop feeling AI FOMO.
Book a free 30-minute discovery call. We work out where you're stuck and whether this is a fit. No pitch.
Book a discovery call