The workflow breaks down fast: you write a Bluesky post (300 chars), realize the Dev.to version needs 150+ words and a code block, forget you used the "onboarding" angle last Tuesday, and skip it because you have actual work to do. Two months later your tool has 3 stars and you've posted about it twice.
I built marketing-pipeline to handle the mechanical parts. The part I want to describe specifically: angle tracking and per-channel formatting.
Every project in projects.yml carries a list of angles — different framings of the same tool. The daily cron at 14:00 UTC picks the least-recently-used angle for each project × channel combination and generates a post shaped to that channel's constraints. Bluesky gets ≤300 chars, X gets ≤280, Dev.to and Hashnode get 150–400 words. You don't track any of that. The pipeline does.
Before anything posts, it runs through pipeline/antislop.py — a hard-reject gate that kills drafts containing excited, game-changer, unlock, empower, AI-powered, emoji, hashtags, exclamation points, or rhetorical questions. Not a style suggestion. A gate. Posts that fail it don't go out.
Onboarding a new project:
marketing onboard --name my-tool --repo owner/repo --kind mcp-server
That command fetches the README, extracts the problem, facts, and angles, and writes them to projects.yml. From there the cron handles rotation. The kind field routes to type-specific directories — mcp-server hits MCP Registry, Smithery, Glama, and PulseMCP; claude-skill targets awesome-claude-code (generates the payload, but their rules require a human to submit via GitHub issue form).
Requires an Anthropic API key plus credentials for Bluesky, Dev.to, and Hashnode at minimum. Mastodon is optional.
Top comments (0)