Inspiration

The problem. Someone gets promoted on a Friday because they were good at the job. On Monday they own the hardest conversations of their career, and nobody has ever made them practise one.

I went looking for what that feels like from the inside. I read 635 posts from r/managers and r/ExperiencedDevs. 265 of them, carrying 14,614 upvotes and comments between them, were about giving feedback or handling someone who is underperforming. 96 were about outright conflict, 84 were first-time manager nerves, and 47 were about firing and layoffs.

Almost nobody in those threads was asking for theory. They know they are supposed to be direct. They were asking what to say when the person starts crying, or goes silent, or says everyone else is behind too. One post asks strangers to write the actual sentence: "Would anyone like to suggest language to limit meetings/chats with someone at my same level?" People rehearse in the shower, it goes fine, and then the real thing goes sideways in the first thirty seconds because the other person did something the shower version never did.

What it costs. This is not a soft problem. It is one of the most expensive things in a company.

  • People quit their manager, not the company, and it is not a figure of speech. In a Gallup study of 7,272 US adults, "one in two had left their job to get away from their manager to improve their overall life at some point in their career." Gallup also finds that managers "account for at least 70% of variance in employee engagement scores." (Gallup, Employees Want a Lot More From Their Managers, 2018: https://www.gallup.com/workplace/236570/employees-lot-managers.aspx)
  • Most of those exits were preventable at the time. "Fifty-two percent of voluntarily exiting employees say their manager or organization could have done something to prevent them from leaving their job." (Gallup, This Fixable Problem Costs U.S. Businesses $1 Trillion, 13 March 2019: https://www.gallup.com/workplace/247391/fixable-problem-costs-businesses-trillion.aspx)
  • Each one has a price. "The cost of replacing an individual employee can range from one-half to two times the employee's annual salary, and that's a conservative estimate." Gallup puts the total cost of voluntary turnover to US businesses at a trillion dollars a year. (Same Gallup article, 2019)
  • And it is happening constantly. 3,225,000 people quit a job in the United States in December 2025 alone, a quits rate of 2.0 percent. (US Bureau of Labor Statistics, Job Openings and Labor Turnover Survey, series JTS000000000000000QUL and JTS000000000000000QUR, retrieved December 2025 data from the BLS public API at https://api.bls.gov/publicAPI/v1/timeseries/data/; programme page https://www.bls.gov/jlt/)
  • Almost none of these managers were ever taught. "82% of managers who enter management positions have not had any proper management and leadership training, they are 'accidental managers'." (Chartered Management Institute with YouGov, Taking Responsibility: Why UK plc needs better managers, 2023, fieldwork June 2023: https://www.managers.org.uk/about-cmi/media-centre/press-releases/bad-managers-and-toxic-work-culture-causing-one-in-three-staff-to-walk/)
  • When it goes wrong formally, it is worse. Acas costed workplace conflict in the UK at "£28.5 billion" a year, "an average of £1,028 for every employee in the UK each year." Resignations account for £11.9bn of that and disciplinary dismissals for £10.5bn. The same report puts the median unfair dismissal award at £6,243 and the median legal cost of representation at £5,000. (Acas, Estimating the costs of workplace conflict, Saundry and Urwin, 11 May 2021: https://www.acas.org.uk/research-and-commentary/estimating-the-costs-of-workplace-conflict/report)
  • In the US the equivalent bill lands at the EEOC. It "received 88,531 new charges of discrimination in FY 2024" and "secured almost $700 million for over 21,000 victims of employment discrimination." (US Equal Employment Opportunity Commission, FY2024 annual reports, published 2025: https://www.eeoc.gov/newsroom/eeoc-publishes-annual-performance-and-general-counsel-reports-fiscal-year-2024)

So the bill for a manager who cannot hold a hard conversation gets paid twice. Once by the person who leaves, and again by the company that replaces them at half to twice their salary. Nobody ever sends an invoice with a manager's name on it, which is why the problem survives.

The solution. Role play fixes it. That is not a hunch. In a study of 147 medical students who rehearsed difficult psychosocial conversations with coached actors, composite self-efficacy rose from 26.60 to 38.86 on the same scale four weeks later, p < 0.001, and students rated the role play itself 8.23 out of 10 for usefulness. (Davis and Rajasegaran, BMC Medical Education, 15 June 2026, PMID 42298548: https://pubmed.ncbi.nlm.nih.gov/42298548). That is medical education rather than management, and I am not going to pretend otherwise, but it is the same mechanism: say the hard thing once to someone who reacts, get told how it landed, and you walk into the real one different.

The catch is that role play needs a second person. Almost no manager has one. Asking your HR partner to practise firing somebody is its own awkward conversation, and asking a friend gets you a friend being nice to you.

Tablework is the other person. You rehearse the specific conversation you are dreading, against someone written to react badly, and you find out which of your lines land before you use them on a person who will remember.

What it does

The reason managers put these conversations off is not that they do not know the words. It is that they cannot predict the reaction, and being wrong in front of someone who is upset is the part that costs them. So Tablework makes you have the conversation once, badly, where it does not count.

Pick a scenario. Someone late again. A request you have to turn down. A performance plan you need to start. The other person in the scene behaves the way people actually do. They deflect onto the workload, point at a colleague who is also behind, go quiet, or get upset.

At each turn you choose one of three lines, or write your own, and then you hear the reply. A short note comes back on the line you picked: Strong, Workable or Risky, one sentence saying why, and the step of a named model it served or skipped. Situation-Behavior-Impact for feedback. The Positive No for turning something down. The Third Story for opening a charged conversation. Tap the note and you can read the source's exact words with a link to where they came from. If a line did not land, back up to that turn and try another one.

You set a readiness dial before the take and again after. The second time, your first answer is still there as a ghost needle, so the change is something you can see rather than something you tell yourself.

Then the rehearsal turns into the document. One page: how to open, what happened, what effect it had, what you are asking for, and what to say if they push back. The words on it are the ones you just tried. Save it, or send it to your phone calendar so it sits next to the meeting at ten past ten instead of inside an app you will not open again.

Afterwards you write a dated note about how it really went and set the follow-up. Notes export as plain text. Prepare and Notes can lock behind your fingerprint, face or screen lock, because they are about real people.

Fifteen scenarios ship. Three are free and complete. A take runs five to eight minutes, which is about the gap between finding out you have to do this and having to do it.

Every line in every scenario was written by a person and read back. There is no AI in it, and that is a choice with a price attached, which the next sections explain.

How I built it

Building it was easy compared with writing it. The hard problem was making the other person unpleasant enough to be useful.

Kotlin and Jetpack Compose, one activity, no dependency injection framework. The scenarios are data rather than code. Each is a branching tree of turns, replies, ratings and notes in a JSON file, so a new pack is a set of files and not a change to the engine.

Everything stays on the phone. There is no account and no server. Android's app backup is switched off, so a note about a real colleague is not copied into a cloud backup either. Prepare and Notes can lock behind fingerprint, face or screen lock through androidx.biometric, because a draft performance plan on a work phone is not something you want read over your shoulder.

The sheet writes to the phone calendar through CalendarContract, so it sits next to the meeting at ten past ten instead of inside an app nobody opens twice.

26 commits, 115 unit tests and one end-to-end run on an emulator. Most of those tests are on the scenario engine and the validator. A choice that points at a node which does not exist would end a rehearsal halfway through, and that breaks the only thing the app is for. The engine, the variant picker and the sheet builder import no Android classes at all, so they can be tested as plain Kotlin.

How Tablework uses RevenueCat

The problem RevenueCat solves here is that my users do not all want the same thing. Some have one bad conversation coming up next Tuesday and will never have another like it. Others are three months into managing and will have one a month for years. Charging both of them a subscription loses the first group, and charging both of them once loses the money from the second.

So Tablework sells two shapes at once, and RevenueCat's Android SDK carries the ownership logic for both. The build uses purchases, purchases-ui and purchases-store-galaxy, all at 10.21.1, because the app bills through Samsung's in-app purchases on the Galaxy Store.

Three scenarios are free: Late again, Just this once, and You were rude. All three run every turn, with the notes, the readiness dial and the sheet at the end. They are not samples. Between them they cover feedback, saying no and a complaint about your own behaviour, so a manager with one uncomfortable conversation this week gets a whole product for nothing.

Three packs are bought once and stay bought: Performance, Boundaries and Endings. Endings covers letting someone go and a first layoff. Studio opens every pack, now and any added later, and adds the Follow-through timeline. Studio is monthly or yearly with a 7-day trial, or bought once for good.

Notes are never held hostage. A manager's written record of a real conversation stays readable and exportable as plain text whatever they have paid, because it is their record of something that happened, not content I sold them.

Entitlements map straight onto packs (pack_performance, pack_boundaries, pack_endings), with studio granting all of them plus hasFollowThrough(). The paywall is a custom Compose screen in the app's own design system, driven by Offerings and chosen by placement: a locked scenario row opens that pack's offering with the scenario visible behind the sheet, and the timeline opens default. A missing offering falls back to default. UpdatedCustomerInfoListener feeds an EntitlementsState StateFlow that the library, the timeline and the paywall all observe, so a purchase unlocks the scenario in place with no restart.

The thing I did not have to build is an ownership system. Three one-time items, two subscriptions and a lifetime purchase, all granting overlapping entitlements, is exactly the logic I would have got wrong by hand.

Challenges I ran into

The first drafts of the other person were too reasonable. They took the feedback, agreed, and thanked you for raising it. Rehearsing against someone like that teaches you nothing, because the reason managers avoid these conversations is the reaction, not the wording. I rewrote every scene so the other person deflects onto the workload, points at a colleague who is also behind, goes quiet, or gets upset.

Rating a line without lecturing was the second one. The user is about to have a real conversation, not sit an exam. A note that says Risky gets one sentence to explain itself and then has to get out of the way. Anything longer and people stop reading it, which is worse than no note at all.

Scripted also means the app can be wrong in a way it cannot recover from. If a choice points at a node that does not exist, the rehearsal collapses. That is why the validator and most of the tests exist.

There was also a dull and expensive lesson. Three Gradle daemons in parallel filled RAM and swap and killed my desktop session twice. One build at a time after that.

Accomplishments that I'm proud of

There is no AI in it, in a category where almost everything will have AI in it. Every line, every reply and every coaching note was written by a person and read back. That is a real cost. It caps how many scenarios exist and it means the other person cannot answer your exact words. I took the cost because a generated coaching line that is subtly wrong does not announce itself. You find out it was wrong while sitting across from someone who is crying.

The app says out loud what scripting loses. The About screen lists it: the other person cannot answer your own words, the situation is close to yours rather than yours, and the app cannot hear your tone.

The large-text work, which nobody would have noticed if I had skipped it. Ratings are always a word with an icon and never colour on its own. The take screen, the note and the sheet all hold up at twice the system text size. I put those screenshots in the gallery because they are the ones that made me change the layout.

And it changed how I would open one of these conversations myself. That was the only test I actually trusted.

It shipped on 4 August 2026 and has 99 downloads.

What I learned

People do not want a script. They want to have already survived the moment once.

The readiness dial was nearly cut for being soft. It is the part I now think makes the rehearsal count, because it is the only place in the app where the change is something you can point at rather than something you tell yourself. Putting it at 3 before a take and 7 after is what a take is actually for.

The other thing is that a coaching note is only believed when it says where it came from. "This skips the impact", with a link to the Center for Creative Leadership page that SBI is quoted from, reads like craft. The same sentence without the link reads like my opinion, and nobody is going to take my opinion into a room with someone who is crying.

What's next

The conversations further up the tree. Managing someone older than you. Pushback from a peer manager. Telling your own boss that a date will slip.

A short voice mode, so the marked turns can be said out loud rather than typed. Nothing recorded, nothing uploaded.

And more languages for the scripts, which is cheap to do now that the scenarios are data files.

Built With

  • jetpack-compose
  • kotlin
  • material3
  • purchases-android
  • purchases-store-galaxy
Share this project:

Updates

Submission history