{"slug": "we-published-118-blog-posts-with-zero-writers-here-s-the-pipeline", "title": "We Published 118 Blog Posts With Zero Writers. Here's the Pipeline.", "summary": "Applighter, a two-person team selling React Native templates, has published 118 blog posts without hiring any writers by building an automated pipeline that uses Claude Code for drafting and a webhook-based CMS. The system treats blog posts as API requests, with mechanical tasks automated and judgmental tasks handled by humans, enabling the team to rank for hundreds of long-tail queries at minimal cost.", "body_md": "`POST /api/outrank/webhook`\n\n, bearer token, schema validated, `revalidateTag()`\n\non write.`robots.ts`\n\n. GPTBot, Claude-Web, PerplexityBot.Applighter has published 118 blog posts, ranks for hundreds of long-tail queries, and does not employ a single content writer.\n\nThis is not a growth-hack post. It's what SEO for developer tools actually looks like when you're a two-person team selling React Native templates and the marketing budget is whatever is left after Stripe fees.\n\nEvery \"SEO for SaaS\" guide assumes a content team, or at minimum a fractional writer at $500 a post. Selling templates at $99–$299, that math never worked. At 4 posts a month we'd need to sell one extra license per week just to break even on writers. That's before agency margins, before editorial overhead, and before the reality that most freelance writers cannot tell the difference between EAS Build and `expo prebuild`\n\n.\n\nThe alternative most indie teams pick is \"no blog,\" and then they lose to competitors who show up when a developer searches \"supabase vs firebase for react native.\"\n\nSo we rebuilt the operation around what we already had: engineers, a Next.js app, a Supabase database, and a Claude subscription.\n\n| Function a content team does | What we replaced it with |\n|---|---|\n| Editorial calendar | A markdown queue in `scripts/blog-automation/blog-tracker.md`\n|\n| Writer drafting a post | Claude Code invoked with a `/write-blog` skill, `--max-turns 25`\n|\n| Editor reviewing tone/facts | House-style prompt with hard constraints plus a grep pass |\n| CMS entry | A `POST /api/outrank/webhook` call with a bearer token |\n| SEO metadata handoff |\n`generateMetadata()` in `app/blog/[slug]/page.tsx` reads from Supabase |\n| Cross-posting | A Slack thread that pings a human to paste the pre-adapted version |\n| Analytics reporting | Supabase view-count RPC plus a nightly query |\n\nNothing here is unusual on its own. What made it work was treating the pipeline like an internal API instead of a workflow. The endpoint is versioned. The tracker is in git. The skill prompt is code-reviewed. A blog post is a `POST`\n\nrequest, not a Notion doc that gets forgotten.\n\nNo CMS. No admin panel. The single write path is `POST /api/outrank/webhook`\n\n, defined in `app/api/outrank/webhook/route.ts`\n\n, guarded by a bearer token, processed by `modules/services/OutrankArticleService.ts`\n\n.\n\nThe service extracts author tags from the payload, dedupes by slug, and inserts into `blog_posts`\n\n. Immediately after the insert it calls:\n\n```\nrevalidateTag(\"blog-posts\", { expire: 0 });\n```\n\nSo Next.js drops the cached list within seconds instead of waiting out the TTL.\n\nPublishing looks like this from anywhere:\n\n```\ncurl -X POST https://yoursite.com/api/outrank/webhook \\\n  -H \"Authorization: Bearer $PUBLISH_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d @post.json\n```\n\nThree downstream benefits no CMS gives you:\n\n`curl`\n\nfrom your laptop, a Zapier flow, a colleague's script. No proprietary editor to learn.A WordPress instance, a Ghost blog, a Contentful workspace: each is a second system to maintain, another set of credentials to leak, and a UI you have to teach a future collaborator. For a small studio the CMS is a liability, not an asset.\n\nThe most useful reframing we did was sorting every step into two buckets: **mechanical** (rules-based, reproducible) and **judgmental** (needs taste, opinion, or product context).\n\n**Mechanical, fully automated:**\n\n`/public/`\n\npaths)`components/json-ld.tsx`\n\n(BlogPosting, FAQPage, VideoObject auto-extracted from embedded videos)`app/sitemap.ts`\n\n**Judgmental, human-in-the-loop:**\n\nThe mechanical bucket runs on a cron. The judgmental bucket happens over coffee.\n\nIf you're an engineer this split is intuitive. It's how you'd design any pipeline where humans and machines share work. The mistake most content ops teams make is putting humans on the mechanical work (proofreading for length) and machines on the judgmental work (auto-generating topics from keyword volume). Reverse it.\n\n**An AI-written post that references real file paths from your codebase reads dramatically differently from a generic AI-written post.**\n\nThe former sounds like it was written by someone who ships. The latter sounds like a content mill. Same model, same length, completely different reception.\n\nWe enforce this by giving the `/write-blog`\n\nskill a research step that reads the actual repo before drafting. When a post claims \"the OutrankArticleService dedupes by slug,\" it's because a subagent read `modules/services/OutrankArticleService.ts`\n\nand confirmed it.\n\nThe house-style prompt has one hard rule: no \"unlock the power of,\" no \"in today's fast-paced world,\" no \"game-changing solution.\" Not because those phrases are unprofessional, but because the audience is developers and developers spot LLM fluff instantly. If your first paragraph reads like a press release, the tab closes.\n\nFor a dev-tools company the internal link graph matters more than external backlinks, because the point of ranking for \"React Native boilerplate\" is routing that reader to a product page.\n\nOur rule: every post links to at least one template with UTM parameters, and anchor text varies per post so the pattern doesn't look manipulative. `lib/blog-tags.ts`\n\nmaps every slug to topical tags, and `getRelatedSlugs()`\n\nsurfaces three related posts at the bottom of each article.\n\nWhat's less common is treating the [template catalog](https://www.applighter.com/apps?utm_source=devto&utm_medium=blog&utm_campaign=seo-for-developer-tools-without-a-content-team) as a first-class node in that graph, not a destination sitting outside it. A post about Supabase auth links to the specific template that ships with that exact auth setup. Anchor text, product, and article all agree.\n\nOur top-converting page is a blog post about push notifications, not the homepage.\n\nOpen `app/robots.ts`\n\nand you'll find something that would have made a 2022 SEO agency nervous: we explicitly allow GPTBot, ChatGPT-User, Claude-Web, PerplexityBot, and Applebot-Extended. We block admin routes and auth callbacks. AI crawlers are welcome.\n\nThe reasoning is boring math. When a developer asks ChatGPT or Claude for \"best React Native template with Supabase auth,\" the answer comes from whatever the model has indexed. Being excluded from that retrieval set costs you a whole channel.\n\nConcretely it changes what we write:\n\n**No keyword-first planning.** Picking a topic because it has 10,000 monthly searches is how you publish \"What is TypeScript?\" for the 400th time. We start with a real thing our templates do, then find the keyword that describes it.\n\n**No translated backfill.** Localizing 100 posts to 8 languages produces 800 pages of mostly-noise and wrecks your crawl budget.\n\n**No featured-snippet chasing on non-transactional queries.** A snippet for \"what is a React component\" is worth nothing when that reader isn't buying anything.\n\n**No off-the-shelf content generation tools.** We evaluated several. They produce content that ranks briefly then dies, because it has no anchor into a real product. Our pipeline works because it's coupled to our repo, not because it uses a fancier model.\n\nIn the order we'd do it if starting over:\n\n`/api/webhook`\n\npublishing endpoint.The AI pipeline sounds too good. Here's the part the case studies leave out: the first three months of building it cost more than three months of hiring a writer would have.\n\nWe paid the setup cost because we were building once and running for years. If you're validating a product idea over the next 90 days, hire a writer. If you plan to still be publishing in three years, build the pipeline.\n\n**What's your setup?** If you're running content for a dev-tools company, drop your volume and stack in the comments. I'm most curious whether anyone has shrunk the judgmental bucket without the output going generic. That's the ceiling we keep hitting.", "url": "https://wpnews.pro/news/we-published-118-blog-posts-with-zero-writers-here-s-the-pipeline", "canonical_source": "https://dev.to/nikolas_mi_5f4aa63cc4080/we-published-118-blog-posts-with-zero-writers-heres-the-pipeline-48lf", "published_at": "2026-08-12 07:58:09+00:00", "updated_at": "2026-08-12 08:16:02.679672+00:00", "lang": "en", "topics": ["generative-ai", "ai-tools", "developer-tools", "mlops"], "entities": ["Applighter", "Claude Code", "Next.js", "Supabase", "React Native", "GPTBot", "Claude-Web", "PerplexityBot"], "alternates": {"html": "https://wpnews.pro/news/we-published-118-blog-posts-with-zero-writers-here-s-the-pipeline", "markdown": "https://wpnews.pro/news/we-published-118-blog-posts-with-zero-writers-here-s-the-pipeline.md", "text": "https://wpnews.pro/news/we-published-118-blog-posts-with-zero-writers-here-s-the-pipeline.txt", "jsonld": "https://wpnews.pro/news/we-published-118-blog-posts-with-zero-writers-here-s-the-pipeline.jsonld"}}