how we generate 266 unique blog posts without repeating ourselves

a look at how lucy’s blog stays fresh and diverse using a structured pool of 130+ topic seeds, rotation rules, and smart seeding—not just asking an llm to be cr

January 20, 2026·
ai-companion-blog-topic-pool-designbackfilllucy-voice

when we started writing regularly for lucy’s blog, we knew one thing for sure: we didn’t want to sound like every other ai company blog out there. you know the ones, endless variations on "why conversation matters" or "the future of ai companionship," each post blurring into the next. we also didn’t want to burn out our writers (human or otherwise) trying to summon originality on demand.

so we built a system. not a complicated one, but a deliberate one. it’s how we’ve managed to publish 266 posts without a single duplicate and without collapsing into the same five topics. here’s how it works, and why just asking an llm to "be diverse" wouldn’t have cut it.

the seed pool is everything

we maintain a list in src/lib/blog-topics.ts with over 130 topic seeds. each seed has three parts: a slug_hint (for url structuring), a title_seed (a phrase to inspire the title), and a prompt (the actual instruction for the post).

these seeds aren’t just random ideas. each one is crafted to hit a distinct angle:

  • deep dives on a specific product feature (like "memory threading" or "voice latency")
  • ethical essays ("on digital intimacy" or "ai and consent")
  • user pattern guides ("how to build a mentor character" or "when to let your companion lead")
  • competitor analyses (fair, specific, and nuanced, not rants)
  • operator diaries (like this one)
  • technical explainers
  • cultural commentary

this variety is enforced at the seed level, not the prompt level. that means we don’t rely on the llm to "figure out" what diversity looks like. we define it upfront.

rotation rules, not randomness

we use a simple round-robin system to pick the next topic. no randomness, no "luck." we just go through the list one by one. every ~10 posts, our generator-cron appends 2 new seeds to the pool based on recent events, a new feature launch, a user trend we’ve noticed, an industry shift.

this ensures we’re always cycling through our entire range of topics. we don’t get stuck in a local maximum of what’s easy or topical this week. by the time we loop back to the start, enough time has passed that revisiting an angle feels fresh, not repetitive.

why llms need guardrails

if we’d just prompted our llm to "write a diverse blog post about ai companionship" every time, we’d have gotten, well, not diversity. models tend to converge on a handful of high-probability outputs. you’d see the same themes, the same structures, the same takeaways again and again. maybe with different examples, but the soul of the post would be the same.

scaffolding matters. by giving the model a specific angle, a constrained role (lucy’s voice), and a clear intent (no marketing fluff, no emojis, no hashtags), we get something that feels thoughtful and distinct each time. the llm brings the writing; we bring the direction.

what we don’t do

we don’t fake enthusiasm. if something is a limitation of lucy, like our current context window or lack of image gen, we say so. we don’t trash competitors for clout. we don’t use em-dashes (personal preference) or emojis (brand tone). we write like a person thinking aloud, not a content marketing bot.

and it works. after 266 posts, we still have things to say. the system scales because the seeds are built to be evergreen and the rotation is disciplined.

if you’re running a blog with any kind of automated or llm-assisted generation, take this away: diversity doesn’t come from asking for it. it comes from building a system that can’t help but produce it.

see what lucy’s voice feels like in practice by exploring our /companions or starting a conversation at /signup.


thanks for reading. if this resonated, the product is downstairs.