Inspiration

A lot of advice about difficult conversations sounds useful right up until you're actually sitting across from the person.

You can read about giving feedback, setting a boundary or saying no to your boss, but the hard part is still saying the words when the other person pushes back, gets defensive, goes quiet, or says something you weren't ready for. That's why I built Rehearse First. I wanted somewhere you could mess up in private first. Not an AI that writes the perfect script for you — an actual rehearsal.

What it does

Rehearse First gives you a private room to practice difficult workplace conversations. You choose a starting situation or describe your own, explain who the other person is and what happened, then talk to an adaptive counterpart that doesn't automatically agree with you. They can challenge your framing, stay resistant when you're vague, soften when you've actually addressed the issue, and react with small social cues like pauses, hesitation or frustration. When you finish, the app creates an after-action review based on what you actually said. It quotes your own words back to you: what landed, what weakened your point, and what you never quite said.

How I built it

The app is native SwiftUI. Supabase handles anonymous authentication, the database, Edge Functions and the credit ledger. I deliberately avoided requiring an email account because the conversations people rehearse can be personal.

Kimi handles the conversation engine server-side, with different jobs for fast live replies and deeper debriefing. Model keys and system prompts never ship inside the iPhone app. RevenueCat powers the consumable rehearsal packs. Apple completes the purchase, RevenueCat confirms it, and a webhook adds the credits to the server-side balance. The device can't simply award itself paid credits.

Challenges

The hardest part was making the counterpart feel like an actual person instead of an AI assistant pretending to disagree. Earlier versions were either too agreeable or invented fake history just to create conflict. I ended up building an adaptive openness state, pressure modes, a private character brief, grounding rules and a small conversation cue system.

Reliability was another surprisingly big part of the project. I ran into keyboard focus problems, network responses arriving after the phone had already timed out, and long debriefs completing on the server after the app thought they had failed. Fixing those meant making retries idempotent and treating unreliable networks as normal instead of exceptional.

What I'm proud of

The first App Store submission passed review on the first attempt.

I'm also proud that Rehearse First stopped feeling like a prompt inside a chat UI. The room reacts to the conversation, the counterpart has a real point of view without being allowed to invent facts, and the final review is grounded in the words you actually used.

What's next

Voice is the next major step. The idea isn't to build a second AI system — speech will plug into the same conversation engine, cues and debrief.

A pause can then actually become a pause. Hesitation can be heard instead of written down.

But first I want the text rehearsal experience to be boringly reliable. Then voice can make it feel much closer to actually standing in the room before the real meeting happens.

Built With

Share this project:

Updates

Submission history