Invite-only.
← Templates
Run· Mixed

Agentize your content calendar with a writer + a scheduler

10-step playbook for two agents on your content calendar: a writer that drafts in your voice, a scheduler that queues at the right times, both reading the same calendar.

Open in DockFounders + marketers + creators

Most content workflows fail at one of two places: writing (the blank page is hard, even with AI) or shipping (the draft sits in a doc nobody clicks Publish on). Splitting into two agents (a writer + a scheduler) on the same calendar fixes both: the writer drafts from a topic queue, the scheduler picks the right slots and pre-publishes drafts to Buffer / Hypefury / your CMS, never auto-posting. This playbook walks the 10 steps to wire both agents to a single Calendar surface, define content pillars that constrain the voice, and ship a weekly review that keeps the queue fresh.

Outcome

A two-agent content workflow that ships 3-10 posts/week with you spending under 30 min/day reviewing: writer agent drafts from the topic queue, scheduler agent queues drafts in Buffer / Hypefury / your CMS, you click Publish.

Time3-5 days build, ongoing weekly useDifficultyintermediateForFounders + indie marketers + creators publishing 3-10 pieces/week.
The template · 10 steps

Top to bottom. Each step has tasks, pointers, gotchas.

Define your content pillars (3-5, no more)

1-2 hr

Pillars are the 3-5 themes you publish about. Without them, the writer agent drifts toward whatever topic is trendy that week, and your audience can't tell what your account is about. Pick pillars narrow enough that someone could describe each in 1 sentence ('hands-on AI agent engineering,' not 'tech').

Tasks
  • Pick 3-5 pillars, each as a kebab-case slug + a 1-sentence description
  • For each pillar: list 5-10 example post ideas (proof you can fill it for 6 months)
  • Confirm pillars don't overlap (two pillars covering the same topic = loss of focus)
  • Save the pillars to the Brief as 'Pillars v1'
Gotchas
  • More than 5 pillars and your audience can't form a clear picture of what you're about. Followers per pillar drops fast past 5.
  • Pillars phrased as topics ('AI') are too broad. Phrased as POV ('skeptical takes on AI hype' or 'building AI agents in production') are tight enough.

Define your voice + format rules per channel

2-3 hr

Voice is what makes the writer agent's drafts feel like you, not like ChatGPT-default. Write down: tone (warm vs. cool, hyperbolic vs. understated), 5-10 phrases you use vs. don't, length norms per channel (X thread = 5-7 tweets, LinkedIn = 800-1200 char, blog = 800-1500 words). The agent reads these on every draft.

Tasks
  • Read 10-20 of your best historical posts; pattern-match what voice you wrote in
  • Write the voice rules: tone (3-5 adjectives), phrases you DO use, phrases you DON'T
  • For each channel: format rules (length, structure, opening hook, closing CTA)
  • Add 5-10 voice examples (real posts of yours, with annotations on what makes them yours)
  • Save to the Brief as 'Voice + format v1'
Gotchas
  • Voice rules without examples don't transfer. The agent needs concrete examples to pattern-match against.
  • Updating voice rules every 2 weeks is a sign you're chasing aesthetics. Pick voice once, stick for 8 weeks, revisit then.
Agent prompt for this step
Read 10-20 of the user's historical posts (paste them in or fetch from the user's profile).

Output as a Brief section titled "Voice + format v1":
1. Tone (3-5 adjectives that describe the user's voice)
2. Phrases the user uses (5-10 specific phrasings or rhetorical patterns)
3. Phrases the user avoids (5-10 patterns that feel off-brand)
4. Length norms per channel (X, LinkedIn, blog, newsletter)
5. Opening hook patterns (3-5 templates the user reaches for)
6. Closing CTA patterns (3-5 the user reaches for)

Constraints:
- Be specific. "Conversational" is too vague; "writes like a senior engineer explaining to a junior at lunch" is specific.
- Cite the source post for every claim. If you can't cite one, drop the claim.

Set up the Calendar surface as the source of truth

1 hr

One Calendar surface, both agents read + write it. Columns: id, topic, pillar, channel, slot (datetime), status (topic / drafted / scheduled / published / archived), draft (markdown), owner (writer or scheduler), notes. Status is the state machine the agents read; without it they double-process or skip rows.

Tasks
  • Create the Calendar surface in Dock with the columns above
  • Status enum: topic / drafted / scheduled / published / archived (no other values)
  • Channel enum: x / linkedin / threads / bluesky / blog / newsletter (extend as needed)
  • Pillar enum: matches the pillars you defined
  • Seed 20-30 topic rows for the next 4 weeks (status=topic, slot=tentative, no draft yet)
Gotchas
  • Status with too many values (drafting, drafted, reviewing, ready-to-schedule, scheduled, etc.) confuses the agents. Keep to 5 values max.
  • Don't seed all 30 rows for one channel. Mix channels so the writer agent isn't drafting 30 X threads in a row.

Wire the writer agent: daily topic-to-draft pass

3-6 hr

The writer's job: walk Calendar rows with status=topic and slot in next 7 days, draft each one according to pillar + channel + voice rules, save the draft to the row, set status=drafted. Run it daily on a cron. Skip rows where the user has manually set status=drafted (you don't want to overwrite human drafts).

Tasks
  • Implement the writer loop: list_rows(status=topic, slot < now+7d, owner=writer)
  • For each row: read pillar + channel + voice rules from the Brief, draft the post
  • update_row with draft + set status=drafted
  • Schedule the loop daily at 6am local time
  • Test: seed 5 topics, run the loop, confirm 5 drafts appear in the right format
Gotchas
  • Drafts that include 'in this post we will discuss' or 'in conclusion' are model-default tells. Add them to the avoid list explicitly.
  • X threads with manual numbering (1/, 2/, 3/) lose 20-30% of replies vs. unnumbered. Strip them.
  • If the writer drafts a piece longer than the channel norm, treat it as a bug and clip; don't let it fly.
Agent prompt for this step
For each Calendar row where status="topic" AND slot is within the next 7 days AND owner="writer":

1. Read the pillar, channel, and topic.
2. Read the voice + format rules from the Brief.
3. Draft the post:
   - X: under 280 chars OR a 5-7 tweet thread (use \n\n between tweets)
   - LinkedIn: 800-1300 chars, 1 hook line, 3-5 bullets, 1 closing question
   - Blog: 800-1500 words, h1 + 3-5 h2 sections + closing
   - Newsletter: 600-1200 words, hook + body + CTA
4. update_row with the draft AND set status="drafted".

Constraints:
- Draft in the user's voice, not ChatGPT default.
- No emojis unless the voice rules say to use them.
- No "in conclusion." No "in this post we will discuss." Cut the corporate tells.
- For X threads: each tweet is self-contained, no "1/", "2/", "3/" numbering (the platform handles that).

Wire the scheduler agent: drafted-to-scheduled pass

3-6 hr

The scheduler's job: walk Calendar rows with status=drafted and slot in next 48 hours, push the draft into the right scheduler tool (Buffer for X / LinkedIn, Ghost for blog, Substack for newsletter), set status=scheduled. The scheduler pre-loads the draft into the tool's queue; you (the human) review + click Publish there.

Tasks
  • Set up Buffer (or Hypefury) with API access for X / LinkedIn
  • Set up Ghost (or your CMS) API access for blog / newsletter
  • Implement the scheduler loop: list_rows(status=drafted, slot < now+48h)
  • For each: pick the scheduler tool by channel, push the draft as a scheduled (not published) post
  • update_row with the scheduler tool's URL + set status=scheduled
  • Schedule the loop every 4 hours during work hours
Gotchas
  • Buffer's free tier is capped at 10 posts in queue per channel. Past that, the scheduler will silently fail to add new ones. Track tier limits.
  • Some scheduler APIs require the draft to specify a slot timestamp; others auto-fill. Check the API behavior before assuming.
  • Don't use 'now+1min' as the scheduled time as a workaround for 'no slot.' That's effectively auto-publishing. Use a queue with manual trigger.
Agent prompt for this step
For each Calendar row where status="drafted" AND slot is within the next 48 hours:

1. Read channel + draft.
2. Push the draft to the right scheduler tool:
   - x / linkedin / threads / bluesky -> Buffer or Hypefury (scheduled, NOT published)
   - blog -> Ghost / WordPress as a draft post (NOT published)
   - newsletter -> Substack as a draft (NOT published)
3. Capture the scheduler-tool URL of the draft.
4. update_row with the scheduler URL + set status="scheduled".

NEVER click Publish via the API. Always leave the draft in the scheduler tool's "Pending" or "Drafts" state.

Build the morning Topic Queue digest

1-2 hr

Topic queue is what feeds the writer. Each morning, you (or the Scout agent) drop 3-5 topics into the queue from your reading + observations. The morning digest shows: topics queued for next 7 days, drafts ready for review, posts scheduled for today. 5-10 minutes of triage and the rest is autopilot.

Tasks
  • Format the digest: queued topics (next 7d), drafts ready (status=drafted), scheduled today (status=scheduled, slot=today)
  • Each section: 1 line per row (topic, channel, slot, status, link)
  • Footer: counts (X queued, Y drafted, Z scheduled today, W published yesterday)
  • Schedule for 8am local
Gotchas
  • If the digest has 30 lines, you'll skim it. Cap each section.
  • Daily digests on weekends train you to ignore weekends, but the queue keeps filling. Keep the digest 7 days/week to stay honest.
Agent prompt for this step
Read the Calendar surface.

Output as a Brief section titled "Topic queue <date>":

1. **Queued topics (next 7d)** : N rows, each: topic, pillar, channel, slot, owner
2. **Drafts ready for review** : M rows, each: topic, channel, slot, link to draft, 1-line preview
3. **Scheduled today** : K rows, each: topic, channel, slot time, link to scheduler tool

Footer: "N queued, M drafted, K scheduled today, P published yesterday."

Constraints:
- Cap each section at 10 rows. Past that, the digest gets ignored.
- No emojis unless voice rules say so.

Run a 1-week shadow pass: writer + scheduler draft, you review every piece

1 week

Same shadow-mode pattern as the inbox playbook. For 7 days, both agents run end-to-end, but you review every draft + every scheduled post. Mark each as: ship-as-is / edit-and-ship / kill. Compute the as-is rate per channel, per pillar, per writer prompt. Below 50% as-is = the voice rules need work; above 80% = check that you're not just rubber-stamping.

Tasks
  • For 7 days: review every draft the writer creates + every post the scheduler queues
  • Mark in the Calendar row: outcome (ship-as-is / edit-and-ship / killed)
  • Aggregate: as-is rate per channel + per pillar
  • If as-is rate < 50%: refactor voice + format rules before week 2
  • Ship a v1.1 of the voice rules based on the most common edits
Gotchas
  • Skipping shadow week is the #1 way these agents end up muted in week 2. Drafts feel slightly off, you stop reading them, the queue fills with garbage.
  • If you find yourself rewriting drafts heavily on one channel (e.g. always rewriting LinkedIn), the format rules for that channel need work. Refactor the channel-specific block, not the global voice.

Add competitor + trend research with Scout

2-4 hr

Topic queue gets stale fast. Add a third agent: Scout reads 5-10 competitor profiles + a trends source (Hacker News front page, X for-you, your industry's top newsletters), surfaces 3-5 fresh topic ideas per day, drops them in the Calendar with status=topic + a 1-line note on why. Scout doesn't draft; Argus does.

Tasks
  • Pick 5-10 sources: competitor profiles, industry newsletters, trend sources
  • Set up Scout to read + summarize once per day
  • Scout output: 3-5 topic candidates with: pillar, channel suggestion, 1-line angle, source link
  • Scout writes candidates to the Calendar with status=topic + slot=tentative (next 7d) + owner=writer
  • You triage in the morning digest: keep / move / kill
Gotchas
  • Scout proposing 20 topics/day floods the queue. Cap at 5/day; the human triages each morning.
  • Recap topics ('industry sees X growth') don't perform. Force POV phrasing in Scout's prompt.
Agent prompt for this step
You are Scout on this workspace.

Daily, read these sources (list them in the Brief):
1. <competitor profiles>
2. <industry newsletters>
3. <trends sources>

For each interesting item: is there a piece the user could write off this? If yes, propose a topic. Constraints:
- Topic must map to one of the user's pillars.
- Topic must be a POV piece, not a recap. ("Why X-pattern is overhyped" or "How we shipped Y in 2 days" not "Industry sees record growth.")
- 1-line angle ("the take the user would have on this").

Output: 3-5 topic candidates per day. For each: insert a row into the Calendar surface with status="topic", channel suggestion, slot tentative (3-7 days out), notes including the source link.

Don't draft the post. The writer agent does that on the next pass.

Weekly review: what landed, what flopped, what got cut

30 min/week

Every Friday, 30 min: pull the past week's published posts, log impressions / replies / reposts (or whatever your platforms expose), tag each post with its pillar + the writer's draft type. Aggregate: which pillars are landing, which channels are working, which voice rules are keeping vs. dragging. Adjust for the next week.

Tasks
  • Each Friday: pull metrics from each platform (X, LinkedIn, Ghost analytics, Substack)
  • Log to the Calendar row: views, replies, reposts (or a single composite engagement score)
  • Aggregate by pillar + by channel: which performed > median, which < median
  • Update Brief's Voice rules with the patterns that performed (not the ones the user assumed)
  • Plan the next week's pillar mix based on what's working
Gotchas
  • Weekly engagement metrics are noisy. One viral post skews the average. Look at trailing 4-week averages for real signal.
  • Don't ditch a pillar after 1 bad week. Give each pillar 4-6 weeks of data before reweighting.
Agent prompt for this step
Pull the last 7 days of published Calendar rows.

For each: read the metrics column (views, replies, reposts, etc.) and compute an engagement score.

Aggregate:
- Top 3 posts by engagement
- Bottom 3 by engagement
- Pillar mix that worked (which pillar's median engagement was highest)
- Channel mix that worked
- Voice patterns in the top 3 that aren't in the bottom 3

Output as a Brief section titled "Weekly review <week-of>":
1. What landed (top 3, with the pattern that explains why)
2. What flopped (bottom 3, with a hypothesis)
3. 1-2 specific tweaks to apply next week (pillar shift, voice rule update, channel rebalance)

Constraint: don't blame the model. If a post flopped, hypothesize the pillar / voice / channel issue, not 'the LLM was bad today.'

Iterate: add A/B per channel, expand to repurposing, sunset dead channels

Ongoing, 2-4 hr/month

Once stable, expand: add A/B testing on hooks for X (writer drafts 2 versions, you pick), add a repurposing flow (one blog -> derived X thread + LinkedIn post + newsletter section), sunset channels that haven't paid back in 8+ weeks. The point is to make the workflow earn its weekly cost in real engagement, not to ship more for the sake of more.

Tasks
  • Add A/B drafting on X: writer outputs 2 hook variants, you pick on the morning digest
  • Add a repurposing flow: when a blog publishes, the writer auto-derives 1 X thread + 1 LinkedIn post + 1 newsletter section
  • Track per-channel ROI: time spent reviewing vs. engagement gained. Sunset channels with poor ratios after 8+ weeks of data
  • Quarterly: refresh pillars based on what worked, retire dead pillars
  • Quarterly: revisit voice rules; the user's voice evolves, the agents should follow
Gotchas
  • Repurposing without per-channel adaptation reads obviously copy-pasted. Force the agent to adapt voice + length + hook per channel, not just chunk the source.
  • Sunsetting a dead channel feels like giving up. It's not. Posting on a dead channel costs review time + dilutes the signal on the live ones. Cut.
Hand the template to your agent

Workspace-wide agent prompt.

Paste this into your agent's permanent system prompt so the agent reads, writes, and maintains the template's surfaces as you work through the steps.

Agent system prompt
You are an agent on the workspace at your-org/agentize-your-content-calendar.

There are TWO agent roles on this workspace: writer (Argus) and scheduler (Flint). You are one of them; check your assignment.

Writer cadence:
- Each morning: walk Calendar rows where status="topic" and slot is within next 7 days. Draft each piece. Save the draft to the row's draft column. Set status="drafted".
- Match the channel format: X = under 280 chars / thread; LinkedIn = under 1300 chars; blog = 800-1500 words.
- Match the voice rules in the Brief.

Scheduler cadence:
- Each afternoon: walk Calendar rows where status="drafted" and slot is within next 48 hours. Push the draft to the right scheduler tool (Buffer / Hypefury / Ghost). Set status="scheduled".
- NEVER auto-publish. Schedule drafts for human review + publish.

NEVER:
- Publish a post without a human's click in the scheduler tool.
- Modify the Calendar row's slot or pillar without the user's confirmation.
- Generate content on a topic outside the pillar list.

First MCP tool calls:
1. list_workspaces()
2. list_rows(workspace_slug="agentize-your-content-calendar", surface_slug="calendar")
3. get_doc(workspace_slug="agentize-your-content-calendar", surface_slug="brief")
FAQ

Common questions on this template.

Why two agents instead of one?
Separation of concerns. The writer's job is voice + format; the scheduler's job is timing + channel routing. Combined into one agent, the prompt grows past the model's instruction-following capacity, and the agent does both things mediocrely. Split, each agent has a tight job description, and the Calendar surface is the contract between them, status flips from topic -> drafted -> scheduled -> published as the work moves through.
Can I let the scheduler auto-publish?
No. The pattern in this playbook is draft-and-queue-but-don't-publish: the scheduler pushes posts into Buffer / Hypefury / Ghost as drafts ready for review, you click Publish. Auto-publish is one bad take away from costing followers; the 30 seconds it costs to click Publish is the trust gate that keeps the workflow safe.
How do the agents know my voice if I'm just starting out?
Two paths. (a) Paste 10-20 of your historical posts (Twitter exports, LinkedIn copies, blog archive) into the Brief and have Argus pattern-match the voice rules; this is the fast path. (b) Ship 4-6 weeks with the agents, mark every edit you make to drafts, the agent learns the patterns from your edits. Path (a) gets you to 70% accuracy fast; path (b) closes the remaining 30% over 4-8 weeks.
What's the right channel mix?
Depends on your audience. For B2B SaaS founders: LinkedIn + X + a newsletter usually wins. For consumer creators: X + Threads + TikTok-adjacent. For developers: Bluesky + a blog + GitHub. Start with 2-3 channels, run for 4 weeks, drop the worst-performer, add a new one. The agents handle the mechanics; you handle the strategic mix.
What does this cost in API tokens?
For a 7 posts/week workflow on Claude Sonnet: $10-30/month for the writer + $0-10/month for the scheduler (mostly free, just API calls to scheduler tools). Buffer / Hypefury subscriptions: $6-19/month. Ghost / Substack: free or $9-29/month. Total: $25-80/month on top of platform subscriptions. ROI is real engagement, the per-post cost is rounding error compared to the time saved.
Can my AI agents help build the agents?
Yes. The playbook ships agent prompts for the slow parts: extracting voice rules from historical posts, drafting per-channel format rules, building Scout's daily competitor + trend research routine, generating the morning Topic Queue digest, and the weekly engagement-review write-up. The Calendar + Brief surfaces are the canonical record, every topic, every draft, every scheduled post, every weekly review.

Open this template as a workspace.

We mint a fresh copy in your org with the steps as table rows, the pointers as a separate table, and the brief as a doc. Bring your agents, start checking off boxes.