Comment factory that doesn't sound like a robot

Comment factory that doesn't sound like a robot

The client's SEO team needed to build topical relevance across a network of web properties — dozens of brands, each with its own niche and voice. The standard approach was LSI-based commenting: find semantically related keywords for each brand, then seed relevant comments across target pages to reinforce topical signals. The problem was volume. Doing this manually meant a copywriter spending their entire day writing variations of the same three talking points, and the output still ended up sounding repetitive after the first fifty comments.

generation factory

brand management interface with LSI keyword lists

We built a generation factory inside their internal SEO platform. At its core is a brand management layer — each brand has its own LSI keyword lists, tone guidelines, and topic boundaries. An operator loads the keywords, sets the generation parameters, and the system takes over from there. On a cron schedule, Claude generates batches of comments per brand, pulling from the keyword pool and rotating through prompt variations to keep the output diverse. Every generation run gets logged: what was produced, when, for which brand, and how many passed validation.

naturalness filtering

The hardest part wasn't generating text — it was making the text not look generated. LLM output has tells: certain transition phrases it favors, a tendency toward balanced sentence length, a politeness that real comments rarely have. We built a post-generation filtering layer that scores each comment on naturalness metrics — sentence variety, keyword density, tone match — and rejects anything that reads too cleanly. Roughly 15-20% of generated comments get filtered out per batch, which sounds wasteful until you compare it to the alternative of a human reviewing every single one.

staggered scheduling

generation log dashboard with batch statistics

Scheduling across many brands introduced its own headaches. Each brand might need 50-200 comments per run, and running them all simultaneously would blow past API rate limits within minutes. We implemented staggered scheduling — brands are grouped into time slots, each group runs sequentially within its window, and the system tracks token consumption in real time. If a batch approaches the rate ceiling, it pauses and picks up in the next window. This turned out to be more reliable than aggressive retry logic, which tended to create thundering-herd patterns.

results

The result is a system that produces 1,000+ unique comments per day across all brands, with each comment tied to a specific LSI keyword and traceable back to its generation run. The copywriter who used to spend full days on this now spends about thirty minutes reviewing flagged outliers. The honest challenge that remains is drift — over months, even with prompt rotation, the LLM starts favoring certain phrasings. We added a monthly diversity audit that flags repetition patterns, but this is fundamentally an arms race between generation and detection that requires ongoing attention.

The takeaway: LLM-powered content generation at scale is less about the generation and more about the filtering. Anyone can get Claude to write a comment. The real engineering is in making sure the thousandth comment doesn't read like the first.

Stack

Frontend & API: Next.js 14 (Route Handlers), Prisma, PostgreSQL

AI: Anthropic Claude API, custom prompt rotation engine

Scheduling: node-cron with staggered brand groups, rate limit tracking

2026, «VOSGLOS». All rights reserved.