The pattern is consistent: ship something, post to Hacker News or a subreddit, get a small spike, then nothing. Not because the tool isn't useful — because staying visible requires showing up every few days across Bluesky, Mastodon, Dev.to, Hashnode, and a half-dozen directories. That's repetitive work that doesn't compound the way code does, and I kept skipping it.
So I built marketing-pipeline: a daily cron that rotates content across four social platforms and submits to type-specific directories, configured once per project.
Onboarding a new project is one command:
marketing onboard --name my-tool --repo owner/repo --kind mcp-server
That fetches the README, sends it to Claude, and writes the project's problem statement, facts, and rotation angles to projects.yml
. From that point the daily GitHub Actions job at 14:00 UTC picks up the project, selects the least-recently-used angle, generates platform-appropriate copy, and posts it — Bluesky at 300 chars, X at 280, Mastodon and Dev.to/Hashnode at their respective limits.
The part I spent the most time on was an anti-slop gate in pipeline/antislop.py
that hard-rejects specific tokens before anything goes out: excited
, game-changer
, unlock
, empower
, AI-powered
, emoji, hashtags, and exclamation points. The generated posts read like a practitioner wrote them or they don't go out.
Directory routing is based on the kind
field. An mcp-server
gets submitted to the MCP Registry, Smithery, Glama, and PulseMCP. A claude-skill
hits awesome-claude-code (payload generated, but their rules require a human to submit via their GitHub issue form — that one can't be automated). A browser-extension
goes to Chrome Web Store, Firefox AMO, and Edge Add-ons.
What this doesn't solve: cold starts. If nobody knows your project exists, the pipeline just keeps posting into the void at a consistent cadence. It's distribution maintenance, not distribution creation. But for tools that got one spike and then faded, consistent presence compounds over weeks in ways a single post never does.
Requires an Anthropic API key and credentials for at least Bluesky, Dev.to, and Hashnode.