[{"data":1,"prerenderedAt":141},["ShallowReactive",2],{"post:building-my-own-content-pipeline":3},{"id":4,"title":5,"body":6,"category_label":126,"category_slug":127,"date_created":128,"dek":129,"description":119,"directus_id":130,"extension":131,"is_promoted":132,"meta":133,"navigation":134,"path":135,"published_at":128,"seo":136,"slug":137,"status":138,"stem":139,"__hash__":140},"posts\u002Fposts\u002Fbuilding-my-own-content-pipeline.md","I Built a Content Pipeline Because I Was Tired of Copy-Pasting",{"type":7,"value":8,"toc":118},"minimark",[9,14,18,21,24,28,36,51,58,69,72,76,83,86,92,95,100,104,112,115],[10,11,13],"h2",{"id":12},"the-problem","The problem",[15,16,17],"p",{},"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.",[15,19,20],{},"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.",[15,22,23],{},"So I built the pipeline I wished I had.",[10,25,27],{"id":26},"what-i-actually-built","What I actually built",[15,29,30,31,35],{},"Local-first. Docker Compose. Directus as the headless CMS, Postgres underneath, n8n for workflow orchestration. Three containers, one ",[32,33,34],"code",{},"docker-compose up",".",[15,37,38,39,42,43,46,47,50],{},"The capture surface lives in Claude Code. A skill called ",[32,40,41],{},"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 ",[32,44,45],{},"~\u002FNextcloud\u002FSync\u002Fwriting\u002Fraw\u002F"," and syncs it to Directus with status ",[32,48,49],{},"idea",". The thought is preserved before it evaporates. Cost to me: half a sentence.",[15,52,53,54,57],{},"Then ",[32,55,56],{},"elaborate-post",", a second skill that takes the raw idea and develops it into a draft. Tags. Excerpt. Cards. Body cleaned up.",[15,59,60,61,64,65,68],{},"The interesting part is what happens after. n8n watches for posts ready to syndicate and routes them to platforms based on tags. ",[32,62,63],{},"tech"," goes to the blog, Dev.to, and X. ",[32,66,67],{},"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).",[15,70,71],{},"The routing matrix is the design decision I'm proudest of. Tags route to platforms via a relevance score (high \u002F medium \u002F low \u002F 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.",[10,73,75],{"id":74},"why-not-notion-or-buffer","Why not Notion or Buffer",[15,77,78,79,82],{},"Because I wanted the content to live where I control it. Local Postgres, local files as backup, everything versioned. The whole stack portable via ",[32,80,81],{},"pg_dump"," and a Directus schema snapshot.",[15,84,85],{},"There's an old principle I keep coming back to:",[87,88,89],"blockquote",{},[15,90,91],{},"Every post on someone else's platform is renting space. Every post on your own domain is equity.",[15,93,94],{},"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.",[15,96,97,98,35],{},"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 ",[32,99,41],{},[10,101,103],{"id":102},"the-meta-thing","The meta thing",[15,105,106,107,111],{},"I'm capturing this thought ",[108,109,110],"em",{},"using the very pipeline I'm writing about",", which is either poetic or deeply nerdy. Probably both.",[15,113,114],{},"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.",[15,116,117],{},"That's the part Buffer can't sell you. You have to build it.",{"title":119,"searchDepth":120,"depth":120,"links":121},"",2,[122,123,124,125],{"id":12,"depth":120,"text":13},{"id":26,"depth":120,"text":27},{"id":74,"depth":120,"text":75},{"id":102,"depth":120,"text":103},"Build Log","build-log","2026-03-02T16:05:05.672Z","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.","04649e21-8317-4159-9c8d-b612bcd018fb","md",false,{},true,"\u002Fposts\u002Fbuilding-my-own-content-pipeline",{"title":5,"description":119},"building-my-own-content-pipeline","published","posts\u002Fbuilding-my-own-content-pipeline","GOZxOoo8pBaQskpKcryttGyGwVnm5KEbPMVD8lA8kpw",1786607568637]