Skip to case study
yap on a phone, tucked in a pocketyap on two phones

Voice-first PWA · 0→1 · 2026

yap is an AI-powered group chat that organizes long voice memos into topics friends can listen and reply to individually. Designed, built, and launched solo in six weeks.

yap: less texting, more yapping
Role
Product designer
Engineer
Timeline
6 weeks, May 2026
Graduate capstone
Platform
Progressive web app
Launched May 2026
SMS now paused
Scope
Product design
Systems design
AI architecture
Development

Problem

Friends want to catch up the way they actually talk: long, rambly, and in their own voice. But the tools we use today make us all compromise someway or another.

Calling

Natural conversation, but everyone needs to be available.

Texting

Convenient, but longer thoughts get condensed.

Voice memos

Personal and asynchronous, but topics and replies get buried.

Opportunity

How might we make catching up asynchronously feel as natural and easy to follow as talking in person?

Solution

Long voice chats, organized by topic instead of time

yap uses AI to identify topic changes in long voice memos, turning each thought into a thread friends can listen and reply to separately, without losing the spontaneity of the original recording.

Recording one long memo in yap
yap shows three topics it found in the memo, each with its own clip length
An open topic with two voice replies threaded under it

Talk naturally

Record one uninterrupted memo, moving between thoughts freely.

yap organizes the conversation

AI identifies topic changes and labels each segment without rewriting the original audio.

Reply by topic

Each topic becomes a thread where friends can listen and respond.

Core features

From long voice memos to ongoing conversations

CATCH UP

Listen by topic or all at once.

Each memo arrives as labeled topic cards in the group chat. Tap a topic to hear just that part, or tap play next to the mic to open Now Playing and hear everything new, topic by topic.

RESPOND

Talk freely. AI organizes the replies.

Record one rambly, uninterrupted memo. AI threads responses under existing topics and creates new ones when the conversation shifts.

STAY ORGANIZED

Pick up every conversation where you left off.

Replies stay grouped by topic, with playback starting from the first unheard response.

Join

Invite friends by text. No download required.

Sign up with your phone number, create a group, and invite friends through an SMS link that opens in their browser.

Demo

Don’t take my word for it. Let's yap!

Try the working product with live AI topic segmentation. Friends' phone numbers are disconnected for this demo, so no notifications will be sent.

The yap demo, ready to open

Iterations

Three directions, tested with 30 people

I prototyped three directions in Figma Make and tested them with 30 people, which informed how the final product organizes conversations, supports playback, and keeps the experience voice-first.

Direction 1: Threaded replies, in purple: replies nested under the memo they answer, and a new memo being analyzed into three segments

What I prompted

AI organizes replies under related messages.

What resonated

Topic-based conversation threads.

What didn’t

Transcripts beneath every message distracted from listening.

Direction 2: Light voice rooms: chat cards with “Asked you” and “Mentioned you” tags, the person talking in the middle, and a recording state

What I prompted

Voice-led chat cards with contextual reply prompts.

What resonated

Distinct recording and listening states, plus visible playback progress.

Didn’t make the final build

“Mentions you.” Tested well but didn’t fit the timeline.

Direction 3: Dark voice rooms: members floating around whoever is talking, with glowing rings and stacked avatars

What I prompted

A live-feeling space built around speakers and motion.

What resonated

Floating participant avatars in Now Playing.

Didn’t make the final build

Live presence indicators.

Shipped: replies threaded under the topic they answer
01
FROM DIRECTION 1
Shipped: Now Playing, where listeners skip between topics
02
FROM DIRECTION 3
Shipped: each topic shows how much has played and what’s left
03
FROM DIRECTION 2
Shipped: All Chats shows the people in each chat, not message text
04
FROM DIRECTION 2

01 · Organize by topic

Thread replies by conversation rather than just chronological order and sender.

02 · Give listeners control over playback

Play topics individually or continuously, with skipping.

03 · Show listening progress

Make played and remaining audio visible.

04 · Prioritize voice over text

Use faces and audio clips instead of persistent transcripts.

Build

From Figma prototype to working product in six weeks

I designed, developed, and launched yap independently using Claude Code, Cursor, and Codex. I owned the product decisions, implementation, testing, and deployment, using AI coding agents to accelerate development without compromising the intended experience.

Stack

Built for frictionless access, without an app download

I chose a progressive web app (PWA) to let friends join through SMS. Browser recording captures memos, serverless AI organizes topics, Supabase syncs conversations, and Twilio handles invitations and notifications.

AI

AI identifies topic changes. Code makes the precise cuts.

Rather than relying on imprecise AI-generated timestamps, yap matches each topic's opening words to word-level transcript timestamps to locate accurate audio boundaries.

Precise boundaries

Match AI-identified opening words to transcript timestamps.

Context-aware threading

Distinguish replies to existing topics from new conversations.

Fallbacks

Retry segmentation or preserve the original memo if processing fails.

Sync

Keeping conversations in sync across devices

Behind every yap is a system that keeps recordings, topics, replies, and listening progress synchronized across friends. Supabase manages this shared conversation state in real time, while Twilio sends SMS notifications so friends know when there's something new to hear.

What one memo becomes in Supabase

Design

Translating Figma designs into production with AI agents

I built a reusable component library in Figma and prototyped the complete user experience before development. Using Figma MCP, I gave coding agents direct access to my designs, then reviewed and iterated on their implementations to ensure the final product stayed consistent with the original design system.

Created a reusable component library

yap’s component library in Figma: glass navigation, playback, and record buttons, name tags, chat cards for one to six people, topic cards, reply rows, status pills, the chat header and footer, and color

Assembled screens with established components

A text invite to join “Besties” on yap
01GET A TEXT
Splash: Less texting. More yapping.
02SPLASH
Welcome: Made for friends who yap all day
03WELCOME
Sign in with your phone number
04YOUR NUMBER
Enter the verification code
05THE CODE
Set up your profile with a name and photo
06YOUR PROFILE
All chats, empty, with a prompt to start one
01EMPTY ALL CHATS
New chat: pick friends on yap
02NEW CHAT
An empty group chat with the record button
03EMPTY CHAT
Recording a voice message
04RECORDING
Organizing: finding the topics in your yap
05ORGANIZING
Topics ready: three topics detected
06TOPICS READY
The group chat, threaded by topic
07GROUP CHAT
A topic open with its replies
08TOPIC OPEN
Now playing: Weekend plans
09NOW PLAYING
Group info: members and settings
10GROUP INFO
All chats, filled with groups and friends
11ALL CHATS

Prototyped user flows

The yap screens in Figma wired into a clickable prototype: onboarding flows into the main app, and every core screen links to the next

Handed design over to the agents through the Figma MCP

Figma Dev Mode with the invite-text frame selected and the MCP panel open: Implement this design from Figma, followed by the frame link

Define

Defining requirements and guardrails for AI development

I documented product requirements, design standards, and agent instructions, requiring functional interactions and reliable messaging even when AI processing fails.

The spec the agents built from

Testing & debugging

Real conversations exposed what early prototypes couldn't.

Remote and in-person testing revealed three critical issues in AI segmentation, playback, and message delivery.

In-person testing

In-person testing

Virtual testing with Mel: the coding agent on the left, yap running on localhost with Mel’s topics, and Mel’s phone mirrored on top

Virtual testing

Bug 01 · AI Segmentation

The AI struggled to accurately separate topics in longer voice memos.

The AI sometimes merged unrelated topics or misidentified their boundaries, preventing accurate playback of individual clips.

I updated the model to return each topic’s exact opening words, which the code matches to word-level transcript timestamps to determine precise audio boundaries. Sentence-based splitting serves as a fallback when segmentation fails.

claude · yap

>Segmentation breaks on long memos in api/process-audio.js. segmentTranscript() returns one segment for a clear 3-topic memo, and when it does split, the model paraphrases, so rebuildSegmentTranscripts() can’t match segments back to the transcript.

1. Update the JSON schema: each segment returns label, excerpt, and start_anchor, the first 3–10 words copied verbatim. Max 6 segments; prefer fewer when a boundary is ambiguous.

2. Resolve boundaries in code: match each start_anchor against the transcribeWordTimestamps() output and cut there. Ignore the model’s start_ms/end_ms.

3. If a long memo still comes back as one segment, fall back to heuristicSplitMemo() at sentence breaks.

Pipeline only, no UI changes. Run the 3-topic memo in demo/data.json and paste each segment with its ms range.

>

Bug 02 · Audio Playback

Playing any topic restarted the entire voice memo.

Although topics appeared as separate cards, tapping any of them played the original recording from the beginning instead of the selected topic's start and end points.

I fixed the playback logic to use each topic's transcript-aligned timestamps, starting audio at the correct offset and stopping at the segment's endpoint without splitting the original recording into separate files.

claude · yap

>Tapping a topic card plays the whole memo. Every topic in a memo shares one audio_url, but its topic_segments rows have start_ms/end_ms missing or set to the full duration, so PlaybackController starts at 0:00 and never stops.

1. In js/core/data.js, add repairVoiceMemoSegmentPlayWindows(): when sibling segments have missing or full-length windows, redistribute them by transcript length.

2. In PlaybackController (js/features/chat.js), seek to activeMeta.startAt before play() and pause on timeupdate at endAt. Never fall back to the full file.

Playback and data only. Repro with a 3-topic memo and log each segment’s startAt/endAt.

>

Bug 03 · Sync & Notifications

A successful recording didn’t always mean a delivered message.

During cross-device testing, memos sometimes appeared on the sender’s phone but failed to reach other group members or trigger SMS notifications.

I traced the delivery pipeline across Supabase and Twilio, corrected the synchronization and notification issues, and retested the full flow across devices to verify that recordings and alerts reached their intended recipients.

claude · yap

>Memos show up on the sender’s phone but not for the rest of the group, and SMS alerts often never go out. ensureRealtimeSyncChannel() drops the Supabase channel on CHANNEL_ERROR and never resubscribes, and sendMessageNotifications() sends one request from the sender’s browser with no retry.

1. Realtime: resubscribe when the channel drops, check its state every 30 seconds, and skip the cache on new voice_messages so the memo renders.

2. Alerts: queue one notification_jobs row per recipient, including pending invitees, and have /api/process-notification-jobs send them through Twilio and retry failures.

Sync and delivery only. Send a memo from one phone, confirm it appears on the other two and each gets a text.

>

Bug 03, in black and white: Melody’s phone shows her new memo as sent, while the same chat on Lucy’s phone has an empty slot where it never arrived

Launch

I launched yap live at MPS Communication Design Demo Day 2026.

Visitors could sign up at joinyap.chat ↗ and exchange real voice memos from their own phones. I also created a dedicated station with promotional materials and a feedback notebook to introduce the product and collect firsthand reactions.

Demo Day at Index Space: people trying yap at the tables
The yap station: yap running on a laptop, stickers, cards, the poster, and a feedback notebook

Feedback

yap made an impression beyond the demo.

Following Demo Day, an attendee included yap in his tweet of standout projects, describing it as a “voice inbox for extreme yappers.”

Reflection

Building yap taught me that designing with AI means designing for its limitations, too.

Taking yap from prototype to a working product meant thinking beyond the interface. AI coding agents accelerated development, but making the experience reliable required defining technical constraints, testing real conversations, and resolving failures that only surfaced when people used the product on their own devices.

yap at Demo DayThe Analyzing screen, Breaking your memo into topics, projected at Demo Day

Takeaway 01 · User behavior

Voice-first design means preserving the spontaneity of speaking while giving listeners more control over how they catch up.

Takeaway 02 · Designing with AI

The quality of an AI-powered experience depends as much on the constraints, fallbacks, and interactions surrounding the model as on the model itself.