Most repurposing tools summarize. The useful ones extract, and that difference is the whole build.
Here is the real deal. A content repurposing agent is not a machine that rewrites your blog post eight ways. It is a machine that reads one piece of source material, pulls out the handful of things in it that are actually true and specific, and then writes eight short artifacts that each do a different job with those things. The rewriting is the easy part and it is not where the value is. The extraction is where the value is, because that is the step that stops all eight outputs from independently inventing the same plausible nonsense.
The usual take on this is wrong in a specific way. Every "turn one post into 20 assets" workflow I have tried, including the first two I built myself, treats the blog post as the input to each channel. So the agent summarizes the post for LinkedIn, summarizes it again for the newsletter, summarizes it again for a video script. Eight summaries of the same thing read like eight summaries of the same thing. Worse, each pass is a fresh chance to drift: by output six the agent has rounded "I ran this for a few weeks" into "after a month of testing," and nobody caught it because nobody reads output six carefully. The fix is an intermediate artifact. The agent builds a claim ledger from the source first, then every channel writes from the ledger, never from the post. One extraction, eight renderings.
| Summarizer repurposing | Extraction repurposing | |
|---|---|---|
| Input to each channel | The full post | A fixed claim ledger |
| Drift | Compounds per output | Caught once, at the ledger |
| Voice | Flattens toward generic | Inherits from your voice file, applied once per render |
| Review cost | Read eight outputs closely | Read one ledger closely, skim eight |
| Failure mode | Confident invented detail | Visible [MISSING: REAL NUMBER] holes |
| Reuse across runs | None, each run starts cold | Ledgers accumulate, dedupe becomes possible |
The last row is the sleeper. Once ledgers are files on disk, you can ask the agent "have I used this hook before," which is the thing that keeps a scheduled content agent from posting the same insight every Tuesday forever.
This is the whole project. No database, no tool, just files the agent can read and write.
repurpose/
├── CLAUDE.md # how the agent behaves, read every run
├── voice.md # 15 lines max. rules, not vibes.
├── never.md # claims/topics/phrasings that are off-limits
├── history.md # append-only log: date, source, hooks used
├── channels/
│ ├── linkedin.md # one brief per channel: job, length, shape, bad example
│ ├── forum.md
│ ├── newsletter.md
│ ├── video-spine.md
│ ├── carousel.md
│ ├── email-ps.md
│ ├── faq-snippet.md
│ └── replies.md
├── source/
│ ├── _done/ # processed, agent ignores
│ └── 2026-10-09-agent-post.md
└── out/
└── 2026-10-09-agent-post/
├── _ledger.md # built first, reviewed first
├── _review.md # flags, holes, what the agent refused to write
└── linkedin.md ... replies.md
The channel briefs are the part people skip and they are the part that matters. A brief that says "write a LinkedIn post, professional tone, 1300 characters" produces LinkedIn slop. A brief that says what the post is for, plus one example of the failure you keep seeing, produces something usable. Mine look like this:
# channels/forum.md
JOB: answer a question someone actually asked, in a thread, as a peer.
Not promotion. If it reads like promotion it gets removed and I deserve it.
SHAPE
- Open with the specific situation, not a thesis.
- One concrete thing I did, with the detail that makes it checkable.
- One thing that did not work.
- Link only if the link is the answer. Otherwise no link.
LENGTH: 120-200 words.
BAD (do not produce this):
"Great question! I've found that repurposing agents can be a game-changer
for content teams. Here are 5 tips..."
GOOD SIGNAL: a reader could disagree with a specific sentence.
Run this first, every time, before any channel output exists. Paste it into CLAUDE.md or keep it as its own step.
Read the single newest file in source/ that is not in source/_done/.
Build out/<slug>/_ledger.md. Do not write any channel output yet.
Extract ONLY what is in the source. For each item give:
ID c1, c2, c3...
TYPE claim | number | story | definition | opinion | artifact
TEXT the claim in one sentence, in plain language
QUOTE the exact sentence(s) from the source it came from
STATUS supported | thin | unsupported
Rules, in priority order:
1. If a number appears in the source, copy it exactly. Never round,
never convert "a few weeks" into a figure.
2. If a channel brief will obviously want a number the source does not
have, add an item with TEXT describing the gap and STATUS unsupported,
written as [MISSING: REAL NUMBER - <what is needed>].
3. If something is my opinion, TYPE it opinion. Do not promote an opinion
to a claim by adding hedging words.
4. Mark STATUS thin for anything I asserted once with no example. Thin
items may be used in at most one channel output.
5. Check never.md. Anything it forbids gets listed in a REFUSED section
with the reason, not silently dropped.
Then list: the 3 strongest hooks in this source, and for each, whether a
similar hook appears in history.md (quote the matching line if so).
Stop. Wait for me to approve or edit the ledger.
The stop is not politeness. The ledger is the only thing in this build I read word by word, and reviewing it takes about two minutes. If the agent barrels past into eight outputs, I am back to reviewing eight outputs, which is the problem I built this to avoid.
Once the ledger is approved:
Using ONLY out/<slug>/_ledger.md, voice.md, never.md and each file in
channels/, write one output per channel into out/<slug>/<channel>.md.
Hard constraints:
- Every factual sentence traces to a ledger ID. Append <!-- c3 --> at the
end of any sentence carrying a claim, number or story.
- Do not open the source file again. If you need something not in the
ledger, write [NOT IN LEDGER: <what you wanted>] and continue.
- Items with STATUS thin: usable in one output total, your choice which.
- Items with STATUS unsupported: pass the [MISSING: ...] marker through
verbatim. Never fill it with an estimate, a range, or "significant".
- No em dashes. No "unlock", "supercharge", "game-changer", "in today's".
Then write out/<slug>/_review.md:
- every [MISSING] and [NOT IN LEDGER] marker, with the file it is in
- which outputs you would not publish, and why
- which ledger items you did not use, and why
- one line to append to history.md (date, source slug, hooks used)
The comments look fussy. They are the cheapest fact-check I have found: I skim an output, hit a sentence that feels too good, click the comment, and I am looking at the exact source quote in half a second.
Be honest about this with yourself before you build it, because the fantasy version of this agent gives you eight publishable assets and the real one does not.
| Output | Job | Survives review |
|---|---|---|
| LinkedIn narrative | one idea, one example, no listicle | usually |
| Forum / community answer | peer answering a real question | usually, with edits |
| Newsletter section | the update log entry, no re-pitch | usually |
| Reply-ready comments (3) | useful on threads about this topic | often, pick one of three |
| Email P.S. | one line into an existing send | often |
| FAQ / sales snippet | the honest answer to the objection | sometimes |
| Carousel / slide outline | structure only, never finished slides | sometimes |
| Video / audio spine | beats and the opening 15 seconds | rarely, and that is fine |
The agent's job is not to make eight good things, it is to make eight cheap things so that throwing away four costs you nothing. Before this build, writing a LinkedIn version of a post I had already written felt like a chore I would skip. Now the version exists, badly, in a file, and editing something bad into something fine takes a fraction of the will that starting from nothing takes. That is the actual win and it is a psychological one, not a throughput one.
Here is the rule that makes a scheduled agent survivable: the agent runs on a schedule, it does not produce on a schedule. If there is no unprocessed file in source/, it writes nothing, logs nothing, and tells me nothing. Agents that must emit output every run will emit filler every run, and the filler is indistinguishable from the real thing at a glance, which is how a content library rots.
The scheduling itself is boring and should stay boring:
# CLAUDE.md, schedule section
TRIGGER: weekdays, 07:00 local.
1. Look in source/ for files not in source/_done/.
2. If none: exit silently. Write nothing. Do not "check in".
3. If one or more: take the oldest, build the ledger, then STOP and
notify me with the ledger path and the 3 hooks.
4. Only render channels after I approve. Approval is me editing the
ledger or replying "render".
5. After render: move the source into source/_done/ and append the
history.md line from _review.md.
6. Never process two sources in one run.
Point six matters more than it looks. The first scheduled version I wrote would find three backlogged posts and chew through all of them, and I would open my laptop to 24 files and review precisely none of them. One source per run, always.
Voice files get too long and stop working. My first voice.md was two pages of nuance. Outputs got blander, not sharper, because the model was averaging over a long list instead of obeying a short one. Fifteen lines of actual rules ("no em dashes", "name the flaw in anything I recommend", "never open with a question") beat two pages of description. If you cannot defend a line as a rule something could violate, delete it.
The dedupe problem is real and history.md only half solves it. Across runs, the agent gravitates to the same hook shape, because the same hook shape is genuinely the strongest one in my material. Logging used hooks helps the agent notice, but it will still cheerfully write a near-duplicate and label it fresh. I check the last five history.md lines myself. That is a manual step I have not managed to automate honestly.
Carousels and video spines tempt the agent into inventing structure. Short-format briefs have the least room for evidence, so that is exactly where unsupported claims sneak in. Both of those briefs now carry an explicit line: a slide or a beat with no ledger ID is a slide or a beat you delete.
Channel briefs rot silently. A brief written for how LinkedIn felt six months ago keeps producing confidently wrong-shaped posts. When an output stops landing, suspect the brief before the model.
If you want to try the extraction-then-render pattern before you build anything scheduled, the content Skill in the four free Claude Skills is the right starting point, and the free content prompt at /free/ pairs with it: run the content prompt on one existing post, then hand its output to the Skill as the ledger. No email gate on either, nothing to sign up for. You get maybe 70 percent of what I described above, by hand, in one sitting, which is plenty to find out whether this fits how you work.
The honest version: everything structural in this post is here, in full, for free. The ledger prompt, the render prompt, the folder layout, the scheduling rules. You can build this today without paying me anything, and if you do, I would rather you did that than bought something you did not need.
What the paid library adds is the boring volume. The agent pack at $99 is five agent blueprints with the channel briefs already written and pressure-tested, including the ones I did not reproduce here, plus the never-lists and the voice-file formats that took me several bad versions to get short enough to work. It is a time trade, not a capability trade. The $349/yr Full Suite folds that into the whole prompt library if you are running a team and need everyone working off the same briefs instead of eight people's private prompt graveyards.
If the free Skills and prompts cover what you are doing, use the free material. That is not false modesty, it is the deal: four genuinely useful Skills and four genuinely useful prompts, no email required, and you only pay when you want the depth.
Voice Extractor, Competitive Teardown, SERP-Informed Brief, Performance Readout. Installable Skills, ready to drag into Claude Desktop or Claude Code. No email gate.
Open the Skills page