I Built a Content Pipeline Because I Was Tired of Copy-Pasting
I was burning an hour after every post on copy-paste hygiene. So I built the pipeline I wished I had. Directus, n8n, Claude Code, all local-first.
The problem
I write things. Blog posts. LinkedIn takes. X threads, Dev.to write-ups, Bluesky one-liners. Every publish was the same ritual. Write in one place, copy-paste to three others, fiddle the tone, lose track of what went where.
Not hard work. Death-by-a-thousand-cuts work. The kind that stays under the radar until you realize you've been spending an hour after every post on copy-paste hygiene.
So I built the pipeline I wished I had.
What I actually built
Local-first. Docker Compose. Directus as the headless CMS, Postgres underneath, n8n for workflow orchestration. Three containers, one docker-compose up.
The capture surface lives in Claude Code. A skill called capture-thought watches for moments mid-session (debugging, refactoring, whatever) when I drop a line like "save this as a writing idea, btw." The skill writes a raw markdown file to ~/Nextcloud/Sync/writing/raw/ and syncs it to Directus with status idea. The thought is preserved before it evaporates. Cost to me: half a sentence.
Then elaborate-post, a second skill that takes the raw idea and develops it into a draft. Tags. Excerpt. Cards. Body cleaned up.
The interesting part is what happens after. n8n watches for posts ready to syndicate and routes them to platforms based on tags. tech goes to the blog, Dev.to, and X. freelance hits LinkedIn. An LLM generates platform-specific variants, same core idea, different voice for each audience. It pushes to LinkedIn (3000 char), X (280), Dev.to, the blog, Malt (2000) and Bluesky (300).
The routing matrix is the design decision I'm proudest of. Tags route to platforms via a relevance score (high / medium / low / excluded). I don't pick platforms per-post. I tag, and the matrix decides. Per-post selection doesn't scale. Once you have 50 posts, every "where should this go?" decision becomes friction. Tag-based routing scales linearly with new platforms, not with new posts.
Why not Notion or Buffer
Because I wanted the content to live where I control it. Local Postgres, local files as backup, everything versioned. The whole stack portable via pg_dump and a Directus schema snapshot.
There's an old principle I keep coming back to:
Every post on someone else's platform is renting space. Every post on your own domain is equity.
Same logic for the pipeline that produces those posts. If Buffer changes their pricing, breaks their LinkedIn integration, or just disappears, my pipeline doesn't notice.
The constraint that drove this is 2AM. I get ideas while debugging production, and I need to grab them in three words before they evaporate. Buffer doesn't speak capture-thought.
The meta thing
I'm capturing this thought using the very pipeline I'm writing about, which is either poetic or deeply nerdy. Probably both.
That recursion isn't an accident. The pipeline is opinionated about one thing: capture must be cheap enough that thinking and writing happen in the same gesture. Once you've built that, every thought you have about the pipeline becomes pipeline content. The system feeds itself.
That's the part Buffer can't sell you. You have to build it.