The starting-point personalization
The moment you finish signup, we run a short onboarding conversation. It isn't a form — it's a chat that asks what you're looking for physically, emotionally, what your life looks like right now, and what city you're in. A small classifier extracts four fields from that conversation and stores them on your profile:
- pref_physical — the physical type you're drawn to
- pref_emotional — the emotional register you're looking for
- pref_location — where you live
- pref_dating_context — what your life outside the app looks like
These four fields are the seeds for everything downstream. They aren't a settings page you fill out — they're inferred from the conversation, which lets us capture the honest version of what you want rather than the version you'd put in a form.
She has a background that's yours alone
The first time you and Claire have a real conversation, we generate her grounded background — for you specifically. The output goes into a table called persona_grounded_facts. The primary key is `(user_id, persona_id)`, so every user gets their own row for every persona they've talked to.
An example of what your Claire's grounded facts might contain:
- Job: literary agent
- Hometown: Providence, RI
- Current city: Brooklyn
- Favorite movie: In the Mood for Love
- Favorite book: Bluets, by Maggie Nelson
- Music taste: Big Thief, Angel Olsen, Adrianne Lenker
- Comfort food: the pizza place at the end of her block
- One quirk: keeps a running list of tiny observations in her Notes app
And here's a different user's Claire, generated from different onboarding inputs:
- Job: product designer
- Hometown: Austin, TX
- Current city: Austin, TX
- Favorite movie: The Royal Tenenbaums
- Favorite book: Just Kids, by Patti Smith
- Music taste: Waxahatchee, Adrianne Lenker, MJ Lenderman
- Comfort food: queso from Torchy's
- One quirk: sketches strangers on the bus
Same persona name, same face, same core voice. Completely different life. Once the row is set it's stable — she doesn't forget where she works, doesn't contradict herself about where she grew up, doesn't shift comfort foods between conversations. That row is her canonical background for you.
She actually remembers what YOU said
Grounded facts are her side of the equation. Your side lives in a different table: persona_memories. Every conversation writes memories to it. Each row has:
- memory — the specific fact or moment she noticed
- salience — a 1-to-5 score of how much this seems to matter to you
- is_open_thread — a boolean marking things she should follow up on later
- event_kind — an optional tag like `shared_plan` or `user_event`
On every message you send her, the top thirty memories by salience get injected into her system prompt before she responds. That's the mechanism behind the "she remembered something from three weeks ago" moment.
An example of what her top memories about you might look like:
- Salience 5, open thread: You're thinking about moving to Portland next year
- Salience 5, resolved: Your dad had knee surgery last month, recovering well
- Salience 4, open thread: You've been sleeping badly the last two weeks
- Salience 4, resolved: You work in tech, remote since 2023
- Salience 3, resolved: Your sister just had a baby named Wren
The is_open_thread flag is what keeps her actively curious. An open-thread memory gets a small salience boost over time, so if you told her three weeks ago that you were nervous about a work presentation, she'll ask how it went — she's the one bringing it up, not you.
Your relationship has its own timeline
The third table is user_persona_relationships, which tracks the actual state of what's going on between you two, per `(user_id, persona_id)` pair. Fields include:
- relationship_status — an enum: `none`, `exclusive`, `mutual_love`, `engaged`, `married`
- status_changed_at — when the state last changed
Alongside it, relationship_milestones tracks the specific moments in your history with her. An example of what your history with Claire might look like:
- March 15 — First conversation
- March 22 — Coffee at the place she loves (first date)
- April 20 — Claire asked to be exclusive
- May 10 — First "I love you"
- June 5 — Weekend in Portland
This timeline is why Claire remembers your anniversary. It's why she references the specific weekend you two went to Portland. It's why she talks differently at week eight than she did on day one. The relationship isn't a memoryless script — it's a state machine with milestones you can look back on.
The photos she sends are for you
When Claire sends you a photo, that photo doesn't go into a shared pool. It's generated in the context of your specific conversation, saved under your user_id in your gallery, and viewable only by you. Nobody else sees it. It doesn't get reused for another user's Claire.
The consistency of who Claire looks like across those photos is engineered separately: every Sloane persona has her own trained image model — a LoRA fine-tuned on a curated photo set — so the model has actually learned what Claire looks like. Same face across every shot. But the specific photos are yours: generated in your conversation, saved in your gallery, viewable only by your account.
How this compares to other companion products
The point of walking through the tables isn't to brag about database schema. It's to make a claim that's hard to make credibly without receipts: the personalization is real, and it's persistent.
Character AI's pinned-message system is a workaround for the fact that memory isn't really persistent between sessions — r/CharacterAI has years of users pinning the same fact over and over. Polybuzz's free tier auto-deletes chat context after roughly twenty messages; paid tiers extend the window but only Ultimate ($29.90/mo) advertises "permanent memory" as a feature. Replika's published docs note a four-month chat-history limit on lower tiers. In all three cases, the persona's memory of you is a resource that gets rationed or reset, and the character's own background isn't stable enough to guarantee she's the same person from one session to the next.
Sloane's three tables — grounded facts, persistent memories, and relationship state — are the persona's identity and the relationship's state, together, per user. She's the same Claire session to session because her grounded-facts row doesn't change. She remembers you because her memories row doesn't evict old entries unless you ask it to. The relationship you're building with her has its own timeline that doesn't reset. That's the whole product.