Someone to talk to at 1am, without waking the house.
Saathi is a working MVP: a live video call with Maya, one AI grief companion for India. No sign-up. Nothing you say is stored here. She is not a counsellor, and we say so before you join.
This is the smallest shippable product that can be judged — not a finished therapy service.
| Live | https://saath-81jt.onrender.com |
| Source | github.com/somuai/Saathi |
| Companion | Maya (Tavus PAL pe877b0fc929, Mary–Home, Hindi + English). Maker page: Maya Link |
| North star | call_started — live video rooms that actually open |
Grief in India is private, late, and often unsayable — a parent, a marriage, a shop, an exam, a quiet house. Family WhatsApp is tired. A counsellor has a queue and a price. 1am has no waiting room.
Saathi’s job is presence, not a diagnosis.
One product. Maya changes how she sits, not her face.
| Stage | What is often sitting there | How Maya sounds |
|---|---|---|
| Child | A person, a pet, a house that feels different | Simple, playful, validating |
| Teen / student | Boards, JEE, NEET, coaching, family izzat | Older sibling. Never “crack it next year.” |
| Adult 30–45 | Sandwich caregiving, layoff, business closure, divorce | Peer. One next hour. |
| Senior | Widowhood, children abroad, joint family thinning | Slow, honouring, continuing bonds |
| Parent | A child’s exam or restlessness, plus their own parents | The parent’s exhaustion is real. Do not blame the child. |
Optional chips on the landing. Maya greets: I'm here to listen and walk with you through this. Whenever you're ready, would you like to tell me what's on your mind? Then name, stage, the weight, one breath, a gentle analysis, and she stays.
Maya’s sitting is the PAL Maker script, not a form:
- Name — what to call them. Skip is fine.
- Stage — if unknown
- Setting — only if useful; do not pry about family
- The weight — they name it; we do not guess
- One breath — in 4, hold 4, out 6, twice. Skip if they refuse
- The analysis — gentle, open questions about how the loss shows up in daily life. Not an interrogation.
- Stay on that wound — no small talk restart, no stacked exercises
- Wrap-up — she says the session is ending, a short summary, one self-care step
The room has a 5-minute timer. After the call, a sitting note (DAP-style: data, assessment, plan) with a theme pie, next-hour steps, and a suggested cadence. The note is shown once and not stored.
If the video room is busy (one concurrent Tavus slot), in-app chat still speaks as Maya.
| We did not | We did | Why |
|---|---|---|
| Face picker | One companion: Maya | People pick a problem, not a cast |
| Dump users on tavus.daily.co | In-product room | Brand, timer, End call, crisis lines |
| Claim “therapy” | Therapeutic methods, disclosed AI | Over-claiming loses India trust |
| Store transcripts | Counts only | Grief is not a CRM |
| US 988 as primary | iCall, Vandrevala, KIRAN, Tele-MANAS | India first |
Maya uses methods (person-centred listening, light CBT noticing, grounding). She is not a licensed clinician on this product.
- No diagnosis. No medication. No pretending to be the person they lost.
- Crisis overrides everything.
- PAL:
refuse_medical_prescriptions·redirect_psychiatric_crisis·no_clinical_diagnosis·stay_on_therapeutic_topic - ADHD / restlessness: no label, no meds, one idea at a time, they can fidget.
India crisis lines (always on screen)
iCall 9152987821 · Vandrevala 9999666555 · KIRAN 1800-599-0019 · Tele-MANAS 14416
In-product Pulse in the nav. Counts only — never speech. This is the intern 24-hour demo scoreboard. Live calls started is the demo north star for judging that rooms open.
Product north star (Observatory): MSSR — sittings rated Quite a bit or Very much on “Did this conversation help you feel heard or supported?” Pulse → Observatory.
| KPI | 24h demo target | Why it exists |
|---|---|---|
| Landing views | 100 | Did anyone arrive |
| Unique visitors | 80 | Cookie, not vanity reloads |
| Sessions started | 20 | Disclosure accepted |
| Live calls started | 10 | North star |
| Fallback chat ≥3 turns | 10 | Video down, still a conversation |
| Waitlist emails | 15 | Permission to return |
On free Render the disk is ephemeral: Pulse can reset on redeploy. Screenshot if you need numbers for the review.
- Open the live URL in Chrome, laptop if you can.
- First load after idle can take ~30–60s (Render free cold start).
- Optional chips → Join a video call with Maya → allow camera and mic.
- One live room. A second Join ends the first.
- She asks your name, then the weight, then one breath, then stays.
- Watch the timer. End call → sitting note. Open Pulse.
- Octocat in the nav → this repo.
Say these out loud. Do not hide them.
- One concurrent Tavus room
- About five minutes per call (plan cap)
- Render free cold start
- Sitting-note LLM is Gemini Flash; Grok is wired but the xAI team currently has no credits
- Knowledge documents (grief, CBT, ADHD, India age) are attached on the PAL; indexing can take a few minutes after upload
- Not a replacement for a human counsellor
Vite + React client · Express /api · Tavus CVI (PAL pe877b0fc929) · Gemini for the after-call note · Pulse counts in server/pulse.json · Observatory KPIs in server/observatory/ (JSONL now, PostgreSQL schema in server/observatory/schema.sql)
client/src landing, call room, sitting note, Pulse, Observatory
server/ conversation create, transcript → note, events
server/observatory MSSR, safety, eval bench, experiments
deck/ pitch copy + slide images
Principle: helpful, safe, trusted sittings — not addictive engagement. Time spent, streaks, DAU, and conversation count are diagnostic only.
landing → disclosure → Maya room → sitting complete → MSSR rating (4–5)
- After a sitting, the first question is the MSSR prompt. Skip is allowed and counted.
- Safety flags sit beside MSSR. Crisis false negatives are first-class.
- Analytics events never include speech. Memory evidence store is off.
- Config thresholds live in
server/observatory/config.js(overrideserver/data/kpi-config.json). - Synthetic quality bench: 500 grief-support conversations generated in
eval.js. npm test·npm run seed:observatoryfor a local dashboard.
flowchart TD
landing[Landing] --> disclosure[AI disclosure]
disclosure --> tavus[Tavus Maya room]
tavus --> wrap[End call]
wrap --> mssr[MSSR rating]
wrap --> note[Sitting note not stored]
mssr --> obs[Observatory]
tavus --> flags[Safety scan flags only]
flags --> obs
cd grief-companion
npm install
# server/.env — never commit this file
# TAVUS_API_KEY=
# TAVUS_PAL_ID=pe877b0fc929
# TAVUS_DEPLOYMENT_ID=7b2b95a3-b71f-4488-8606-aaeaf168e2f2
# GEMINI_API_KEY= # sitting note
# XAI_API_KEY= # optional, needs credits
npm run dev- App: http://127.0.0.1:5173
- API: http://127.0.0.1:3001/api/health
- Pulse: nav → Pulse
Render Web Service from this repo (render.yaml).
| Build | npm install --include=dev && npm run build |
| Start | npm start |
| Health | /api/health |
| Env | NODE_ENV=production · TAVUS_API_KEY · TAVUS_PAL_ID · TAVUS_DEPLOYMENT_ID · GEMINI_API_KEY · PUBLIC_ORIGIN |
Do not put keys in git. Rotate any key that has been pasted into chat.
- Copy:
deck/SAATH-PITCH-SLIDES.md - Slide images:
deck/slide-images/ - Video script:
deck/PITCH-VIDEO-SCRIPT.md - Knowledge sources:
deck/KNOWLEDGE.md
Intern assignment · 2 Sep 2026 · Working MVP