Mobile app · React Native
Hadi
An app that records a lecture and shows two-way Korean/Japanese ↔ Vietnamese subtitles in real time, keeps sessions offline-first and syncs them after each lecture.
- Platform
- Mobile
- Status
- Live in production
- Stack
- React Native · Expo · TypeScript · Firebase · Soniox · Next.js · SQLite

The problem
Students learning Korean or Japanese need real-time translated subtitles during lectures, with timestamped notes. Most speech-translation apps are one-directional, laggy, or don't save the session.
Technical choices
- 01
The phone streams audio straight to Soniox stt-rt-v5 over a raw WebSocket, using a short-lived single-use key minted by a Cloud Function
- Why
- A provider key must never ship inside the client. The temporary key is scoped to transcription and expires after 300 seconds.
- Trade-off
- Soniox is the only provider on the recording path: if it is down, recording and live translation stop, so balance alerts and error monitoring are required.
- 02
All AI post-processing runs in Cloud Functions: summaries, retranslation, politeness labels and kanji lookup
- 03
Offline-first: sessions are stored in expo-sqlite and synced to Firestore across devices after each lecture
- 04
Audio is never stored, only the transcript and its translation; Firestore security rules block any cross-user access
- 05
A shared design-token package with a test that fails on hard-coded colours and a numeric WCAG AA contrast check over 56 colour pairs
Architecture
- Speech
- Soniox stt-rt-v5 (WebSocket, temporary key)
- Live bilingual subtitles
- expo-sqlite (offline)
- Firestore sync
- Cloud Functions: summary and retranslation
Supporting services
- Local storage
- expo-sqlite
- Sync and data
- Firestore
- Auth
- Firebase Auth (Apple, Email)
- Server logic
- Cloud Functions
- Billing
- Apple in-app purchase, verified on the server
What shipped
- Real-time bilingual Korean/Japanese ↔ Vietnamese subtitles on a single socket.
- Offline-first storage with expo-sqlite and multi-device sync via Firestore.
- A marketing website built with Next.js.
- Hadi Live, a Chrome extension that captions a tab's audio (in development).
- Live in production, app version 1.3.2.
More facts
- languages
- 3
- version
- 1.3.2
- commits
- 1,800+
- test files
- 500+