Inspiration

Family stories are often lost because recording them feels like an interview, while automated calls can quietly blur contact permission, consent to continue, correction, and publication. One More Story makes those decisions visible and separate.

What it does

A loved one approves one meaningful question. CALL-E identifies itself as AI, asks permission to continue, listens to the answer, reads it back, accepts a correction, and asks for final confirmation. Until the storyteller confirms the corrected read-back, the product creates no story. A deletion request prevents confirmation, and sharing remains a separate choice.

How we built it

The browser experience is a polished no-call fixture built with React, TypeScript, and Vite. It lets judges inspect the full state sequence without a phone number or paid call. The server adapter uses the official CALL-E SDK behind explicit contact permission, approved AI disclosure, E.164 validation, one approved question, a fresh per-call intent flag, a complete idempotency boundary, and a separate live-call environment switch.

Untrusted JSON crosses an explicit runtime schema boundary before it can reach CALL-E. Unknown keys and mistyped values are rejected, and contact permission, AI-disclosure approval, and fresh call intent must each be the exact boolean true again at dispatch. Every approved request field and the complete normalized CALL-E payload contribute to the idempotency key, so a retry cannot silently change the call or ring twice.

Live command output is deliberately minimal: call ID, status, and whether a result arrived. Recipient data, transcripts, and story content are not written to stdout. Upstream maintainer review found three live-path defects across retry identity, output privacy, and JSON truthiness; all three are fixed and protected by seven adversarial regression tests.

What we learned

Consent is not one checkbox. Contact permission, permission to continue, repair, final confirmation, deletion, and sharing are different interaction intents. A fluent continuation is not acceptance. TypeScript types also stop at the JSON boundary; safety claims have to survive the runtime values an attacker can actually send.

What's next

Complete one explicitly authorized proof call, preserve the structured evidence boundary, record a concise public walkthrough, and test the workflow with families who already want to preserve one story.

Built With

Share this project:

Updates