-
-
The town map, a café order spoken out loud, and your stars after a mission.
-
Hints with romanization and audio, WhatsApp-style voice notes, and Mandarin in pinyin only.
-
Hand-drawn scenes and characters: props change with what you say.
-
App icon (1024 × 1024).
-
Screenshot (1179 × 2556, no frame): a café conversation in Korean.
-
Screenshot (1179 × 2556, no frame): the town map.
The problem
Most language apps teach you to recognise words on a screen. Then you walk into a real café, someone asks "hot or iced?", and you freeze. What beginners lack isn't vocabulary. It's practice saying things out loud to someone who answers back, in a place where getting it right actually matters.
What it is
TownTalk is a speaking game set in one illustrated neighbourhood. You move in, and you get through everyday moments by talking: order at the café, find what you need at the market, drop off shopping for your neighbour, get to know her. Every mission has a concrete goal ("order a drink", "hand over the gift"), and you reach it in your own words, not by tapping answers from a list.
Pick Korean, Mandarin Chinese or Japanese. Each town has its own people, food, prices and manners, and each script was written for its language, not just translated.
Who it's for
Adult beginners who know a few words but freeze when someone replies. Travellers, heritage learners and anyone with a trip or a family dinner coming up.
How it plays
- Talk like a voice message. Tap the mic, say your line, pause and listen back, then send. The character hears you and answers in their language, with their voice.
- The story bends. Say something unexpected and she reacts: sold-out items, a wrong order, a neighbour with questions. Go off script and she answers you in character (one short AI-generated reply), then steers back to the goal.
- Never stuck. The light bulb gives 2–3 lines you could say, each with audio, romanization (pinyin only for Mandarin, no characters) and English. Every line has play and slow-play buttons, and each word lights up as it's spoken.
- Stars, not grades. After each mission you get up to three stars, a short note on how you sounded, and the words to practise. Replay it without hints to earn the third star.
Monetization (RevenueCat)
- Free: two full missions in every language (Meet your neighbour, Order from the menu). A new player reaches a real result within five minutes, with no paywall during the first mission.
- Town Pass: $4.99/month auto-renewing subscription via the RevenueCat SDK (
react-native-purchases). One entitlement (town_pass), one offering, one monthly package. It unlocks five more missions per language and unlimited AI conversations (up to 20 a day, which keeps our speech and AI costs bounded). - The paywall appears where players want more: tapping a Town Pass mission on the map, or running out of free conversations. It shows the price, renewal terms, Restore purchases, and links to the Terms and Privacy Policy.
- Server-side entitlement check. The game backend (Firebase Cloud Functions) decides whether a conversation is allowed. It's kept in sync by a HMAC-signed RevenueCat webhook, and when that hasn't arrived yet it falls back to reading the subscriber straight from the RevenueCat API. So a purchase unlocks instantly, and a reinstall followed by Restore works even without an account.
- No account or sign-in needed: RevenueCat anonymous IDs plus Firebase anonymous auth.
What makes it different
- It's a game, not a course: a map, recurring characters, missions, stars and consequences.
- Real speech in, real reaction out: OpenAI transcription plus a scripted evaluator that accepts many valid answers, with an AI judge only when the evaluator is unsure, and Azure pronunciation checks.
- Hand-drawn scenes and characters for each place and language (flat, picture-book style), with blinking, mouths that move with her voice, expressions and props that change with what you said.
- Mandarin is taught in pinyin only, so absolute beginners aren't blocked by characters.
How we built it
- App: Expo SDK 57 / React Native 0.86, expo-router, expo-audio (WhatsApp-style recorder), RevenueCat
react-native-purchases. - Game engine: a pure TypeScript package (session state machine, evaluator, scoring, allowances) shared by the app and the backend, covered by about 700 unit tests.
- Content: mission scripts in JSON for three languages, compiled into "town packs" with slot grammar (item, size, price, name) so characters' lines adapt to what you ordered. Native-speaker review packets are generated from the same source.
- Backend: Firebase (anonymous auth, Firestore, Cloud Functions
game,ttsAudio,revenueCatWebhook). Azure Speech for voices and pronunciation, OpenAI for transcription, the fallback judge and in-character off-script replies. - Quality: Maestro UI flows on the iOS Simulator (onboarding, free café, paywall, recorder, layout sweeps across phone sizes, store screenshots) and end-to-end runs against production with synthesized speech.
- Built in the Shipaton window, with Claude Code as a pair programmer.
Challenges
- Beginner difficulty. The first version had a required Learn step and long lines, and it felt like homework. We rebuilt it play-first: short lines, one question per line, hints on demand.
- iOS audio sessions. A player finishing a clip silently cut off the next recording. The fix was to keep the audio session active, and we found it by reading audio sizes in the Cloud Run request logs.
- Entitlements without accounts. We added the RevenueCat REST fallback so paying players are never blocked by webhook delay.
What's next
The train station chain (buy a ticket, find the platform, missed train) is already built, followed by more places on the map. Also on the list: a full visual-novel-style scene layout, and raising the free allowance once real per-conversation costs are measured.
Categories
- Best Game: missions, stars, recurring characters and a story that reacts to what you say, with a subscription that fits the play loop.
- RevenueCat Design Award: hand-drawn scenes and characters with living animation (blinks, mouth movement, expressions, props that follow your order) and a calm, readable chat layout.
Built With
- azure-speech
- claude-code
- expo.io
- firebase
- firestore
- google-cloud-functions
- maestro
- openai
- react-native
- revenuecat
- typescript
Log in or sign up for Devpost to join the conversation.