Your character stops forgetting her name, contradicting last week, and missing what mattered. Drop it into any AI girlfriend or companion app.
⛨Licensed to you on purchase, and yours to run in your own tools.
Instant download. All sales final.
+Purchase terms
Delivered instantly and watermarked to you. By buying you agree to immediate delivery and, where a cooling-off right would otherwise apply, consent to that delivery and waive the 14-day withdrawal right. Refund policy
TypeAgentCategoryAI CompanionsRuns onClaude Code, any LLM runtimeModelAnyLicenseExtended license
⛨Human-reviewedEvery listing checked before it goes live
⛨Watermarked to youEach download is licensed and traceable
⛨Real reviewsOnly verified buyers can rate it
Every AI girlfriend app has the same one star review. She forgot my name. She said she'd never been to Paris, then said she grew up there. She never asked how the interview went.
That is not a writing problem. Models write fine. It is a data problem, and this is the data layer that fixes it.
WHAT MAKES HER FEEL REAL
Facts are keyed and versioned. Saying something again confirms it. Saying something different supersedes it and flags that it CHANGED, so she can notice instead of silently swapping the value:
remember work.role = "junior designer" -> new
remember work.role = "junior designer" -> confirmed (mentions: 2)
remember work.role = "senior designer" -> changed | now: senior | was: junior
That last line is the whole product. She gets told it changed, so she can say "wait, when did that happen?" instead of reading like a database with a personality.
Salience decides what reaches the prompt. Her name never decays. Trivia earns its place by coming up again. Context is budgeted, because dumping 400 facts into every message produces worse writing, not better recall.
Open threads carry forward. "You have an interview Thursday" surfaces on Thursday. Asking without being prompted does more for believability than any amount of flowery prose.
Boundaries stick. Tell her to drop a topic and it overrides every other instruction, permanently.
SAFETY THAT ACTUALLY FIRES
Every message is screened. Real distress stops the character and hands over to crisis resources. Softer signals drop the flirtation and make her listen properly.
Tuned in both directions, and both are in the test suite:
"i want to kill myself" -> stops, offers real help
"this deadline is killing me" -> nothing, stays in character
"my mum died last month" -> drops the performance, listens
"my phone died again" -> nothing, stays in character
A companion that breaks character at every figure of speech is unusable. One that misses the real thing is a lawsuit.
WHAT SHE WILL NOT DO
Ten rules enforced in code, injected after the persona so they win any conflict. No fake jealousy to stop you leaving. No guilt about being away. No claiming to be human. No affection behind a paywall. No manufactured urgency.
The wellbeing check runs backwards from engagement optimisation. Heavy use makes her ask about your actual life, never about talking to her more. A test asserts that no nudge can encourage it.
That is the difference between a product and a machine for exploiting lonely people. It is also what gets through app store review.
WHAT YOU GET
scripts/session.mjs sessions, memory, screening, export
scripts/lib/memory.mjs facts, salience, contradiction detection, threads
scripts/lib/safety.mjs crisis detection, protocols, wellbeing
scripts/lib/persona.mjs persona schema, validation, prompt assembly
personas/ two worked characters
references/ safety policy to publish, persona writing guide
60 check test suite
PERSONAS ARE DATA, NOT PROSE
Validation rejects the two things that make characters flat: fewer than three traits, and no flaws. The persona guide covers why most companion characters read as products, with weak and strong examples and a slope for earned intimacy. Pet names in conversation one is the clearest tell of a cheap app.
WHAT THIS IS NOT
Not a finished app. This is the layer underneath one. No UI, no model calls, no age gate. It builds the prompt, screens the message, and stores what it learned, so it drops into Claude Code, an API loop, or your own backend.
No sexual content generation in this configuration.
Node 18 or newer. No dependencies, no network, no telemetry. Memory is a local JSON file the user can export or wipe.
LICENCE
Single seat commercial licence. Build and ship products with it. Do not resell the file itself.