all projects
AIVoiceOpenAI Realtime APIWebRTCAging & Familyin beta

WC Systems · Founder · Product & AI Engineering · 2026

Hani

A voice companion that turns a life into a story your family can keep

Every conversation is a story someone's family didn't know they were about to lose.

Hani

outcomes

  • Voice-to-voice on the OpenAI Realtime API over WebRTC, no STT to LLM to TTS hop, to keep turn latency conversational
  • Ephemeral client tokens only, the API key never reaches the browser
  • 7-skill conversational state machine, so the companion holds a conversation instead of running a script
  • A told story is turned into a structured timeline card by a separate extraction pass, unstructured speech to structured record
  • Session hangup and per-user rate limiting enforced server-side, the client-side pacing timer is only a courtesy
  • In active build, stealth

pm skills

conversational state machine designvoice-only UX constraintssafety-first guardrail designfamily-facing product surfacesession pacing and rate limitingstealth-mode scoping

Problem

Family history disappears in real time, not in an archive. The people who hold it are often the hardest to reach with a form, an app, or a request to "write it down." What's needed is something that just talks to them, the way anyone would, and remembers what it hears.

What I'm Building

A voice-first companion that keeps someone company and, in the course of a normal conversation, draws out the stories of their life. Every told story becomes a timeline card their family can see, without the person ever having to "use an app" to make that happen.

Approach

No avatar. No dashboard the user has to learn. One button, a voice, a conversation. The companion never quizzes and never corrects, if a detail comes out wrong, it goes with it, because the goal is the story, not the accuracy of a fact-check. Sessions are paced and capped server-side, not left to a client-side timer that's easy to bypass.

PM Skills Applied

Designed a 7-skill conversational state machine (comfort check, grounding, reminiscence, reflection, closure) so the companion can hold a real conversation instead of running a script. Wrote the guardrails as requirements before a line of prompt was written: no quizzing, no correcting, silence is allowed. Scoped the family-facing surface (dashboard, story timeline) as a second product, not an afterthought bolted onto the voice experience.

Architecture

spoken replyPersonone buttonWebRTCephemeral tokenRealtime APIvoice ↔ voiceSession capserver-enforcedStory passspeech → cardTimeline cardfamily sees
Voice-to-voice keeps latency conversational. A separate pass turns each told story into a timeline card.

Voice-to-voice, not a pipeline of parts. The companion runs on the OpenAI Realtime API over WebRTC, so speech goes in and speech comes out without a separate speech-to-text, then LLM, then text-to-speech chain. Each of those hops adds latency, and latency is what makes a voice feel like a machine. The tradeoff is less control over the intermediate text, which is acceptable here because the goal is a conversation, not a transcript.

Auth that never trusts the browser. The client gets ephemeral tokens only. The API key stays server-side. A companion running on someone's home device is not a place to be casual about credentials.

A state machine, not a system prompt. Seven skills, comfort check, grounding, reminiscence, reflection, closure among them, structured so the companion can move through a real conversation rather than answer each turn from scratch. The guardrails were written as requirements first: never quiz, never correct, silence is allowed. If a remembered detail comes out wrong, the companion goes with it, because a fact-check breaks the thing that makes someone keep talking.

Structured extraction from unstructured speech. A separate pass reads a told story and produces a timeline card: a structured record the family can see. The person never formats anything, never confirms anything. The conversation is the only interface.

The real ceiling is server-side. Session hangup and per-user rate limiting are enforced on the server. The client-side pacing timer is a courtesy, not a control, because a control that lives in the browser is not a control.


The Story

Started this because the people who hold a family's history are usually the last ones anyone thinks to build software for. Still early, still building in stealth, but the shape of it hasn't changed since the first prototype: one voice, one conversation, one story at a time.