Voice-first roleplay language learning with:
- a Pipecat Python server for live voice conversations
- an Expo React Native app for the mobile client
The current local-dev setup uses:
- Pipecat SmallWebRTC on the server
- Pipecat React Native SmallWebRTC transport in the app
- Gemini Live for the in-character voice agent
- a separate helper model call for translation, suggestions, and completion judgment
The repo now also has a small app-facing backend contract:
/app/home/app/scenarios/app/scenarios/{id}
Those routes are JSON-backed today and are the intended contract for the mobile app. Debug routes still exist, but they are not the long-term app contract.
talkthrough/
├── app/ # Expo React Native app
├── server/ # Pipecat backend
├── docs/ # Product docs / PRD
└── Makefile # Root dev shortcuts
Important docs:
You should have these installed locally:
uv- Node.js + npm
- Xcode if running iOS
- Android Studio / Android SDK if running Android
adbavailable in your shell if using Android
You also need:
server/.envwith a validGOOGLE_API_KEY
Start from:
cp server/.env.example server/.envThen fill in the API key.
cd talkthrough
make server-installThis runs uv sync inside server/.
cd talkthrough
make app-installThis runs npm install inside app/.
From the repo root:
make help
make doctor
make server-dev
make server-check
make android-check
make android-ready
make android-unreverse
make app-start
make app-android
make app-iosmake doctor- quick status check for backend + Android device
make server-install- installs backend dependencies with
uv
- installs backend dependencies with
make server-dev- runs the Pipecat backend in the foreground
make server-check- checks whether the backend is responding on
http://localhost:7860/debug-client
- checks whether the backend is responding on
make android-check- shows connected Android devices
make android-reverse- forwards Android
localhost:7860to your computer’slocalhost:7860
- forwards Android
make android-unreverse- removes that reverse port mapping
make android-ready- checks backend + Android device, then applies reverse port forwarding
make app-install- installs Expo app dependencies
make app-android- builds/runs the Android dev client
make app-ios- builds/runs the iOS dev client
make app-start- starts Expo Metro for the dev client
Run the backend in one terminal:
cd talkthrough
make server-devThe backend will be available on:
http://localhost:7860
If you are using a real Android phone, use this flow:
- Start backend:
make server-dev- In another terminal, prepare Android localhost forwarding:
make android-ready- Start Metro:
make app-start- If the Android dev client is not built yet, or native config changed, rebuild it:
make app-androidIn the app, use:
http://localhost:7860
because adb reverse maps device localhost back to your computer.
When you no longer want the mapping:
make android-unreverseIf app native dependencies or Expo plugins changed, regenerate and rebuild:
cd app
make clean
make android
make reverse-android
make startOr from root:
make server-dev
# in another terminal
make android-ready
make app-android
make app-startFor iOS simulator:
- Start backend:
make server-dev- Start Metro:
make app-start- Build/run the iOS dev client if needed:
make app-iosFor local simulator use, localhost:7860 is usually fine.
If you prefer working directly inside app/:
cd app
make helpAvailable there:
make installmake startmake androidmake iosmake prebuildmake cleanmake reverse-androidmake unreverse-androidmake watchman
If you prefer working directly inside server/:
cd server
uv sync
uv run bot.pyThe RN app currently opens to the home screen and fetches its content from the backend app routes.
The main implemented flow today is:
- home screen backed by
/app/home - scenario roleplay route backed by
/app/scenarios/{id} - live Pipecat roleplay session with
scenarioId,difficultyId, andlanguageId
There is also still a debug roleplay screen for integration testing. It lets you:
- choose scenario
- choose language
- set server URL
- connect to the Pipecat backend
- inspect:
- latest bot speech
- translation
- suggestions
- judge output
- transcript
Main RN files:
- app/src/features/roleplay/RoleplayDebugScreen.tsx
- app/src/lib/pipecat/useRoleplaySession.ts
- app/src/lib/pipecat/client.ts
The server currently:
- runs the live voice character with Gemini Live
- after each assistant turn, calls a helper model
- sends
helper_resultover RTVI to the app - sends
session_completewhen the conversation is done
Main server files:
Run:
make server-checkIf it fails, start the backend:
make server-devRun:
make android-readyThen keep the app server URL as:
http://localhost:7860
Rebuild the app:
cd app
make clean
make androidRun:
cd app
make watchman