Inspiration

I'd been following Heather Elkington's work for a while — her newsletter, her plain-spoken "rip up the management books" register, her own origin story of getting promoted because she was good at her old job, not because anyone taught her how to manage people. That story is pretty universal, and it's the reason I started this.

So I built somewhere to do it once before it's real: a private room where you rehearse the actual conversation, turn by turn, against someone who reacts like a real person would — not a test with a score at the end, notes afterwards instead, the way a director gives an actor notes after a take.

How I built it

The idea underneath the whole thing: every hard conversation has an emotion running under it that nobody says out loud — the report who's actually scared of losing standing, the peer who's quietly protecting their own reputation, the manager who agreed to something they can't actually deliver. Every scene in the app carries one of these underlying drivers, authored in but never stated directly, not even to you. You only feel its effects in how the other person responds.

Here's what actually using it looks like. You either pick a pre-written scene or describe your own real situation in a couple of sentences, and the app builds a bounded scene around it — who you're talking to, what they tend to do under pressure, what you're actually trying to get out of the conversation. Then you rehearse it turn by turn, typed or spoken, your choice. Before you commit a line you can redo it as many times as you want — that's free, unlimited, and never shown as a count anywhere, because the whole point of a rehearsal is trying a line a few different ways before you find the one that's actually yours.

What changes each time is the other person's read on you. At any point in the scene they're reading as open, guarded, defensive, or softening, and that shifts based on how your actual words land — not on whether you hit some scripted correct answer. Say something dismissive or contemptuous and they close off. Get specific about what you need, hold your ground when they push back, or show you actually heard what they said, and they start to open back up. There's no meter, no score, no countdown — just a shape, a word, and a tint that changes, the same information announced instantly to a screen reader too. The rehearsal is really about learning to read and move that underlying emotion until the person in front of you can hear you, which is the same skill the real conversation needs.

It's also deliberately not styled like a chat app. I wanted it to read like a marked-up script instead: character names in caps, your own lines washed like an actor highlights their part, the room itself always dark, lit like a stage rather than a screen.

Afterwards you get notes, not a grade — ordered the other person first, you second, because leading with your own lines turns a debrief into a report card. What they were actually doing underneath, what landed and why, one line that might be worth trying a different way next time, and always a line saying there's no single right wording. Nothing about the conversation is ever marked correct or incorrect. And across your last several runs, a separate layer — plain Kotlin, no model involved — starts naming things that repeat: you apologise before you ask, you held the ask after pushback. Never a score there either, just what's actually true about how you tend to show up.

Under the hood

Solo, in Kotlin and Jetpack Compose. The stack is small:

  • Kotlin + Jetpack Compose for the app
  • Firebase AI Logic (Gemini) for three separate calls — building a scene from a description, playing one line at a time in character, writing the debrief afterwards — each with its own schema and a validation pass on the model's answer before it's shown
  • RevenueCat, one entitlement gating the cross-session pattern layer and a custom-scene builder, wired end to end but degrades to a fully working free app if it's ever unconfigured

Challenges I ran into

The constant pressure while developing was making sure the tool never becomes the thing it's meant to help people avoid — a harsh judge. That rule shaped almost every decision (no score anywhere, no fail state, no rewrite presented as correct), but rules on paper are easier than getting the actual tone right in a live conversation, so this will require multiple iterations until it is fully correct.

What I learned

Most of it wasn't technical. I am happy to have gotten the change to get introduced to new communication frameworks and to write scenes and debriefs with them — SBI for making a point concrete, Radical Candor for holding care and challenge at once, Crucial Conversations for what happens to a conversation under stress, Nonviolent Communication for the line between an observation and a judgement, a request and a demand.

Built With

Share this project:

Updates

Submission history