-
-
A question. Your words: pick a place, and your own saved replies are ready.
-
Consent comes first: you allow it, then your partner agrees.
-
Tap a phrase, or type: speaking is always free.
-
Your words, your way: edit every phrase, with Ren beside your grid.
-
Turn Listen: one $24.99 payment through RevenueCat, with Restore Purchases in Settings.
-
A face for your voice: choose a companion, and show your partner what you said.
-
Screenshot, 1179 × 2556, no device frame: "How was physio?" with the saved reply "It was hard"
-
App icon, 1024 × 1024, uncropped
Turn is an iPhone app for people who can't rely on their speech. As your partner talks, Turn offers replies from your own saved phrases, so you can answer before the conversation moves on. The AI only picks; it never writes a word.
Entering: the Next Gen Award, with a public repository and a demo video in place of a store listing.
Simulator Build → · Demo Video · Website · Source Code

Try it
- Download
Turn.app.zipfrom the latest release, unzip it, and install it on a booted iOS 27 Simulator (Xcode 27):xcrun simctl install booted Turn.app, thenxcrun simctl launch booted com.m1ku.turn. - Tap Home at the top of the grid and choose Clinic. Tap Listen, then Allow, then They agreed on the partner's consent card.
- The Simulator has no microphone transcription, so type the partner's line: tap Tap here to type what they say., enter "How was physio?", and send it.
- Tap It was hard in the reply row to hear it spoken.
- To reach the paywall, open Settings and tap Unlock Listen mode, or send 21 partner lines. The purchase runs on RevenueCat's Test Store, so it's free.
Inspiration
Someone using a speech app answers a question by finding or typing a reply, one tap at a time. By the time it's ready, the conversation has often moved on, and the reply arrives late or not at all. A partner asks "How was physio?", and the person has a perfectly good answer saved, "It was hard", but no time to find it.
Turn listens for them. It never writes a reply of its own, because the words a person says should be their own; it only finds which of their saved phrases answer what was just said.
What it does
Turn is an augmentative and alternative communication (AAC) app for iPhone, for adults who can read and tap but can't rely on their speech.
Features
- Speak: tap a saved phrase, or type, and Turn speaks it in a system voice or your iOS Personal Voice, at one of 5 speech rates. Typed replies are saved to a Typed category.
- Your own phrase bank: 159 starter phrases, 154 in 9 categories plus a five-phrase conversation strip, to review and make your own. Add, edit, move, and delete phrases, with undo, and tie them to places: Home, Clinic, Shop, Out, or your own.
- Listen mode: Turn captions the partner on the phone. When the partner finishes a line, a row above the grid offers up to 6 replies from your saved phrases, or one big button when Turn is sure, or no change when nothing fits. A yes-or-no question puts Yes, No, and Not sure first, then up to 3 phrases.
- Nothing speaks until you tap. The row offers; you choose.
- A companion, if you want one: an optional animated Live2D face, from four, with a switch to let it move. Tap the face for the partner view: the face and the last line in large type, flipped 180° to face the partner, with "Say it again".
- Your phone, your settings: Turn follows Bold Text, text size, Reduce Motion, Increase Contrast, and Reduce Transparency. Settings show your own stats on this phone and can erase all data.
How it works
1. Pick a place. Each place brings its own phrases forward.

2. Speak. Tap a phrase or type, and Turn says it.

3. Listen. With the partner's consent, Turn captions what they say.

4. Answer. The row offers your own phrases that answer the line.

5. Keep listening. The row follows the conversation, line by line.

Screenshots
| Screen | What it shows |
|---|---|
| Speaking grid | Categories, the conversation strip, and the toolbar |
| Suggested replies | The reply row under a partner's line |
| Partner consent | The card the partner answers before Turn listens |
| Phrase bank | Editing phrases, categories, and places |
| Paywall | Turn Listen, through RevenueCat |
| Settings | Voice, places, Unlock and Restore, privacy |
| Companion | The optional companion on the home grid |
| Partner view | The flipped view for the partner |
How it makes money
Speaking is always free: the grid, typing, the phrase bank, and Personal Voice. Listen mode is the part that costs money on every line, so it's the part that's paid for: Turn Listen, which unlocks the listen entitlement. Turn's site lists it at US$24.99, once, with no subscription, so nobody loses their voice when a payment lapses. Every phone gets 20 free partner lines first.
Built with RevenueCat
| Piece | Where | What it does |
|---|---|---|
react-native-purchases 10.10.1 |
apps/mobile/src/purchases |
Configures RevenueCat with the phone's app user ID, reads the listen entitlement, and restores purchases |
react-native-purchases-ui 10.10.1 |
revenuecat-engine.ts |
presentPaywallIfNeeded with requiredEntitlementIdentifier: 'listen', so the paywall and its offering come from the RevenueCat dashboard |
| RevenueCat REST API v2 | apps/relay/src/entitlement.ts |
The relay checks active_entitlements before it spends a model call past the free lines |
| Test Store | apps/mobile/app.config.ts |
Judges and the Simulator buy with a Test Store key, at no cost |
Three doors to the paywall. The 21st partner line answers with 402, which opens the paywall; closing it without buying ends Listen mode. Tapping the locked Listen control opens it, and a purchase carries straight on into Listen. Settings has Unlock Listen mode and Restore Purchases.
Checked on the server, too. The relay counts only answered lines: a line the model fails on gives its free line back. Past the free lines, it asks RevenueCat with a 500 ms timeout, caches a yes for a day and a no for a minute, and skips the cached no on the first line after a purchase. If RevenueCat can't answer, the relay returns 503, never a false 402.
How we built it
Architecture
Made with Archify.
- On the iPhone, our
turn-listenSwift module transcribes the partner with Apple's SpeechAnalyzer, on the device, and a line ends after 500 ms of silence. Apple's name tagger, with a gazetteer built from the bank, replaces names with tags such as[PERSON 1]before a line leaves the phone; if the name model is missing, nothing is sent. - The phone picks a shortlist of 40 from its SQLite bank: phrases already in the row, up to 24 keyword matches, the 8 most tapped in 30 days, the 8 tied to the place, then the rest. The whole bank never leaves the phone.
- A Cloudflare Worker relay checks the line against three SQLite Durable Objects, for each device, each address, and the day's budget, then asks a hosted decision model, pinned to version 1.13.0, to score the 40. It returns scores, never text.
- The row's rules, in code, turn scores into the row: a floor of 0.6, a big button only above 0.85 with a lead of 0.15, and no big button on pain or consent topics.
- Offline, or when the model is slow or down, the phone ranks by keyword itself, says "Ranked on this phone", and says Listen mode is degraded after 2 failures in 3.
Privacy and consent
- Before Listen mode first starts, Turn says what will be sent, and asks permission.
- Every time listening starts, the partner sees a consent card, "Can my phone listen while we talk?", and answers They agreed or They said no. My partner is under 18 keeps the microphone off and ranking on the phone.
- No audio is recorded, captions expire after 120 seconds, and there are no accounts. The relay logs no text and keeps only salted hashes of IDs and addresses.
- The partner's line, the place, the category names, and the 40 phrases go to a third-party AI service in the United States, which may keep what it receives to monitor its service. The app says so before Listen mode first starts.
Tech stack
- App: Expo SDK 57, React Native 0.86, React 19, Expo Router, expo-sqlite, Reanimated 4, TypeScript
- Native: Swift Expo modules for SpeechAnalyzer and Personal Voice
- Purchases:
react-native-purchases,react-native-purchases-ui, RevenueCat REST API v2 - Relay: Cloudflare Workers, SQLite-backed Durable Objects
- Ranking on the phone: MiniSearch (BM25+)
- Tests: Vitest across the app, relay, shared code, and evaluation; 31 Maestro flows on the Simulator
Challenges we ran into
- Picking without writing. A model that writes replies can put words in someone's mouth. Turn's model only scores the person's own phrases, and the row's rules, in code, decide whether to show anything at all.
- Privacy on the way out. The partner's words leave the phone, so names are tagged on the device first, and nothing is sent if Apple's name model is missing.
- Never punishing a paying user for an outage. If RevenueCat can't answer, the relay says so with a 503, rather than a 402 that would lock a paid user out.
- Staying useful offline. Every failure except the paywall falls back to ranking on the phone, so the row never just disappears.
Accomplishments that we're proud of
On 80 partner lines and the app's own starter bank, with the decision model pinned to version 1.13.0, on the 64 lines that have an acceptable reply besides Yes, No, and Not sure (packages/eval/results.md):
| Ranker | Top 1 | Top 6 |
|---|---|---|
| chance | 5% | 26% |
| keyword | 16% | 23% |
| embeddings | 22% | 45% |
| hosted decision model | 67% | 75% |
Its top 6 leads embeddings by 29.7 points, with a 95% paired interval of 17.2 to 42.2. The shortlist of 40 held an acceptable reply on 91% of those lines, and the model's median time per line was 777 ms. Claude subagents wrote the lines, the bank, and the labels at the team's direction, and as of September 23, 2026, no clinic had reviewed them.
What we learned
- The safest AI feature is a narrow one. Scoring the person's own phrases, and holding the row when nothing fits, keeps every word theirs.
- Consent belongs in the flow, not the settings. Asking the partner each time listening starts made consent part of the conversation.
- One-time pricing fits a voice. A subscription that lapses shouldn't take away the way someone talks.
What's next
Known limitations
- English (US) and iPhone only.
- The Simulator build can't transcribe, so partner lines are typed there.
- Purchases run on RevenueCat's Test Store; there's no store listing yet.
- If the decision model or RevenueCat is down, Listen mode ranks by keyword on the phone.
- The evaluation's lines and labels were written by Claude subagents, and no clinic had reviewed them as of September 23, 2026.
Roadmap
Next, from the limitations above: a clinician's review of the starter bank and the evaluation, more languages, and a store listing. Open now: keeping the toolbar off the reply row at the largest text size, and showing the speaking state as the voice starts. See open issues for a full list of proposed features (and known issues).
Getting started
Prerequisites
- macOS with Xcode 27 and CocoaPods
- Node and Bun 1.4.2
gh, signed in, for the companion's models
Installation
The quickest way in is the Simulator build in Try it. To build it yourself:
git clone https://github.com/M1KUAPP/Turn.git
cd Turn
bun install
bun run check # lint, types, and tests
bash scripts/build-simulator.sh # Turn.app.zip, for the Simulator
License
MIT. See LICENSE for more information.
Acknowledgments
- RevenueCat
- Apple's SpeechAnalyzer and Personal Voice
- Live2D Cubism, for the companion faces
- Archify
- Shields.io
AI disclosure
The team built Turn with Claude Code and OpenAI Codex as coding agents: commits Claude co-wrote carry a Co-Authored-By trailer, and others were merged from claude/ and codex/ branches. Claude subagents wrote the evaluation's lines and labels and the starter phrases at the team's direction, as packages/eval/results.md records. An agent drafted this description from the source code.
Built With
- bun
- cloudflare-workers
- durable-objects
- expo.io
- live2d
- maestro
- minisearch
- personal-voice
- react
- react-native
- revenuecat
- speechanalyzer
- sqlite
- swift
- typescript
- vitest