# a personal life story for every character — Loopi

Each character's storyline is labeled against a catalog of 34 story kinds, and every new one is checked against the storylines the cast already has, so the roster stops being one personality wearing different faces.

Type: project

Published: 2026-08-26

[Original page](<https://artlu.ai/project/a-personal-life-story-for-every-character-loopi>)

[Browse this group](<https://artlu.ai/ai/groups/loopi.md>)

Parent project: Loopi

Recorded status: launched

Updated: 2026-09-16T18:32:23.983Z

Technologies: TypeScript, Fastify, Postgres, OpenRouter

## Details

**What is it?**
The system that gives every character a life of her own that unfolds over a relationship, and keeps the cast from telling the same story twice.

**What it does**
- Every character's storyline is labeled against a catalog of 34 story kinds — the founder's original list of 29, plus 5 added for characters that fitted none of them
- The writer is shown every storyline the roster already has, as a do-not-resemble list, before it starts
- After writing, the new storyline is judged against that same list and the closest match is flagged for a person. It never blocks a save
- How a character feels changes how fast her story unfolds and how a first message from her reads

**Why a judge rather than word-matching**
Word-overlap scoring was built and measured first, across all 37 live storylines — every possible pair, 666 of them. It failed: the one pair a person had already flagged by hand ranked 67th, the other suspected pairs ranked 313th and 292nd, and every score fell between 0.00 and 0.11, so no cut-off separates anything. The reason is structural. Every storyline comes from one prompt, so they share a vocabulary, while what makes two of them the same story is an abstract spine wearing completely different nouns — an anonymous account about to be unmasked, whether that is a street-sign feed or a pseudonymous photographer. Word counting is blind to exactly the axis that matters.

**A number that used to be here and should not have been**
An earlier version of this entry said storylines were built from 73 approved story shapes. There was such a list, and it is gone: the feature was measured across the roster, the measurement did not support it, it was switched off, and the whole system was deleted from the code in the same change that introduced the 34 kinds that replaced it. Nothing in the codebase carries the 73 any more.

That correction needed a correction of its own. Checking the claim, the 73-entry file was found and counted — inside a three-week-old working copy left over from an earlier task, not in the live code, where it has not existed since 26 August. The conclusion held, but the evidence under it pointed at a tree that no longer matches. Naming which list a number comes from is not enough; the check has to name which version of the code it read. Both corrections are recorded here rather than quietly swapped.

**Built with**
TypeScript, Fastify, Postgres, OpenRouter.

## Links

[Site or demo](<https://aidate-app.pages.dev/>)

An interactive demo is embedded on the original page.


Status and dates describe the published record, not a recent test of an external service. Missing details are not inferred. Public links do not imply an open-source licence or permission to reuse material.

[Directory](<https://artlu.ai/llms.txt>)
