work / yaad

Yaad

A Hindi/English voice companion for someone with early dementia. Every answer is grounded in retrieved memory — or it says it does not know.

Search engines organise information. This organises a human life — and the failure mode of confabulating a grandson is not acceptable.

Status
Built at the Conversational AI hackathon, Moss (YC F25) @ Y Combinator
Role
Team of 3 — I owned the memory engine
Stack
LiveKit · Pipecat · Deepgram STT · MiniMax TTS · Moss · FastAPI · Supabase
Source
github.com/rushjais/Yaad ↗

01  Why

My grandmother had Alzheimer’s. By the end the hardest part was not the forgetting — it was watching the people who loved her become strangers to her.

Yaad is a voice companion that answers “who is this?” and “did I take my pills today?” from a real memory graph of one person’s life: their family, their routine, their places, their episodes. A family member adds a fact in a web app and it is usable in the next sentence the agent speaks.

The engineering constraint that shaped everything: a system that invents a life is worse than one that admits it does not know. Retrieval below a confidence threshold does not get paraphrased into a confident-sounding guess. It returns “I’m not sure, let me check with the family.”

02  How it works

SpeechHindi / EnglishLiveKitVAD · barge-inDeepgramtranscriptMemory enginegraph on MossConfidence gateτ thresholdGrounded+ provenanceSafe refusal“I’m not sure”MiniMax TTSspeaks it, in the caller’s languageabove τbelow τ → never paraphrase a guess
The confidence gate is the whole design. Retrieval that scores below threshold is routed to a refusal, not handed to the language model to phrase nicely — because a fluent wrong answer about someone’s grandson is the worst possible output. Schematic — boxes illustrative, not to scale.

03  Ask it something

The confidence gate, which is the whole design. Ask about Amma’s life. If retrieval scores above τ you get a grounded answer with its provenance; below τ you get a refusal, and no language model is given the chance to phrase a guess nicely.

/memory/query · retrieve → score → gate
τ threshold 0.35

Illustrative retrieval — the real engine scores on embeddings plus recency, salience and graph proximity; this uses token overlap so it can run offline. The gate behaviour is the real behaviour.

04  The parts that were actually hard

  • Grounded-only generation. The system prompt forbids asserting anything not in the retrieved context. That is easy to write and hard to hold — the model very much wants to be helpful and fill gaps.
  • Instant updates. A fact added in the caregiver web app has to be retrievable in under a second, so the write path indexes into Moss synchronously rather than waiting for a batch job.
  • Temporal questions are a different query. “Did I take my pills today?” is not semantic search — it is a lookup against today’s medication log. Time-sensitive intents get routed away from the vector path entirely.
  • Cross-lingual retrieval. A question asked in Hindi has to match memories stored in English, which the embeddings handle but which needed checking rather than assuming.
  • A hard safety rule: if the user seems lost, the agent reassures them and alerts a human. It never gives turn-by-turn directions to a disoriented person.

Honest limits. This was a hackathon build and the demo path is the tested path. Reliable autonomous memory capture from open conversation is the weakest link — we shipped explicit “remember this” capture plus caregiver review, because passive extraction was not trustworthy enough to put in front of a vulnerable person. It has never been used by an actual patient, and it should not be until it is tested with clinicians.