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.