Inspiration
I got promoted to product manager this year. The work part I was ready for. The people part, not really.
A few weeks in, my manager promised my team a new project we had zero room for, and it was on me to push back. I'd never said no to him before. I went over it in my head for two days and then folded in about thirty seconds. I didn't even say anything wrong. I just said nothing useful.
That's when it clicked. Nobody practises these conversations. We practise presentations, we practise interviews, but saying no to your boss, giving someone hard feedback, holding a boundary? You get one shot, live. So I wanted somewhere to say it out loud first, to someone who actually answers back.
What it does
Pick the conversation you're dreading. There are 33 of them, built around what new managers actually run into: saying no, giving feedback, setting boundaries, managing stakeholders, and a few genuinely hard ones like the week after layoffs. Or write your own: describe the situation, who you're talking to, what you're afraid they'll say, and the date it's really happening. The app counts down to that day.
Meet the cast. Sixteen recurring characters play your company: senior managers, directors, defensive reports, nervous underperformers, demanding clients, stressed peers. Each has their own face, voice and way of pushing back. Richard, the senior manager most people meet first, does not roll over when you're polite.
Have it out loud, face to face. The other person is a live, lip-synced avatar that reacts while you talk. Stay vague and you get vagueness back. Hold your ground and they give a little. Voice-only works anywhere; face-to-face is there when you want it to feel real.
★ The cast remembers you. Come back to the same conversation and the character remembers how the last one went: the date you promised, the point where you gave ground. They pick up from there instead of starting fresh. It costs no extra call time, because nothing is asked of you; the character just knows.
See exactly where it turned. When you're done, Rehearse reads the whole conversation back and shows you "the moment": your exact words, what the other person heard, and a stronger way to say it. You get a score out of 100 and four sub-scores (clarity, empathy, assertiveness, structure), two things you did well and one thing to try next.
★ Feedback that tracks you. Practise again and the feedback compares you with last time, so you can see "assertiveness went from 2 to 4" and what changed in your own words.
Walk in prepared. A prep card for the real conversation: your opening line, the fact to anchor on, three ways they might push back with your answer to each, your red line, and how to close.
Close the loop with real life. On the day of the real conversation, Rehearse asks how it actually went: well, okay or badly, and one thing you'd do differently. That answer comes back into your next rehearsal. It's not just practice, it's practice that learns from the real thing.
Watch yourself improve. Insights track your four skills over the week, month and 90 days. Badges and a career ladder (Shift Lead, Team Lead, Manager, Director, VP of Difficult Conversations) reward showing up, never the content of a conversation, so they're safe to share.
How I built it App: Flutter, one codebase for iOS and Android. Both are live in the stores. Backend: TypeScript on AWS (Lambda + DynamoDB), handling scenarios, sessions, scoring, custom scenarios, prep cards and the "how did it go" loop. The character's instructions are built on the server for every call, so the app never sees or supplies them.
The live call: a Python voice agent on LiveKit, using OpenAI's realtime model to play the character, so it listens and responds like a person instead of taking turns like a chatbot.
The face: Anam renders the lip-synced avatar from the agent's voice, so the face and the voice are one thing. Each character's face is cast for their role, and the voice always matches the face.
Feedback: a separate coaching model grades the transcript against a fixed rubric. Every quote in "the moment" is checked word for word against what you actually said, so it can never invent a line you didn't say.
Memory: a short summary of your previous rehearsals per scenario and per character, kept on the server and added to the character's instructions at the start of a call. If memory can't load, the call simply runs as it always did.
Money: RevenueCat. You get free credits to start (enough for a face-to-face call plus some voice practice), then monthly plans top you up, with one-off credit packs if you just need more. Voice costs 1 credit a minute and face-to-face costs 5, since the face is the expensive part to run.
Challenges I ran into Finding a face that actually felt real. I tried a few avatar tools before this worked. Some looked great in a demo video but lagged badly in a live call, so the mouth moved half a second after the voice. Others looked like a video game character, which made the whole thing feel like a toy instead of a tough conversation with your boss. Anam was the first where the lips matched the voice in real time and the face didn't break the mood. Once I switched, people started reacting to Richard like he was a person, and that's when the practice started to work.
The face going missing. When an avatar account was busy, calls would silently drop to voice-only, which kills the whole point. I ended up pooling avatar accounts so one busy account doesn't take the face away mid-call.
Doubled audio. If the avatar starts even slightly after the call, you get the agent and the avatar talking over each other, over a frozen face. The order things start in turned out to matter a lot.
Making the character hard but fair. Too easy and it's useless; too harsh and people quit. It took a lot of rehearsals to get someone who pushes back like a real manager but gives ground when you actually earn it.
Roles that stay put. Early on, the character sometimes did the thing the trainee was supposed to practise: Richard would say no on your behalf. The scenario brief is written to the trainee, and the model read it as instructions to itself. Separating "what you're practising" from "who I am" fixed it.
Memory without wasting minutes. Calls cost credits, so a character that chats about last time would burn the user's money. Memory had to be silent: it shapes what the character pushes on, never adds small talk. Pricing honestly. Face-to-face minutes cost real money, so credits had to be simple and fair, not a trap.
Accomplishments that I'm proud of It's live on both stores, not just a demo. The first time I talked to the avatar and caught myself folding the exact same way I had in real life. That's when I knew it worked.
The loop that asks "how did it go?" on the actual day, and feeds the answer into the next practice. A cast of sixteen characters with real faces, so practising with a defensive report feels different from practising with your boss.
What I learned
The feedback that sticks isn't a score. It's seeing your own sentence quoted back at you with a better one next to it. People prepare far better when the practice feels a little uncomfortable, which is exactly what the face does. And practice works best when it's tied to a real date and a real person, not a hypothetical.
What's next for Rehearse
Rewinding to the exact moment it went wrong and retrying from there, more scenarios from people who've used it, and team plans so companies can give every new manager a place to practise before their first hard conversation.
Built With
- anam
- aws-lambda
- dart
- dynamodb
- flutter
- livekit
- openai
- python
- revenuecat
- typescript

Log in or sign up for Devpost to join the conversation.