Skip to main content
NMHx.
Work
Services
About
Process
FAQ
Contact
mythiep
Hadi
crossweave
Open GitHub
Chuyển sang Tiếng Việt
Toggle light/dark theme

↑↓ select · Enter open · Esc close

All work

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 Hadi website, showing the app recording a lecture with live bilingual subtitles

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

  1. 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.
  2. 02

    All AI post-processing runs in Cloud Functions: summaries, retranslation, politeness labels and kanji lookup

  3. 03

    Offline-first: sessions are stored in expo-sqlite and synced to Firestore across devices after each lecture

  4. 04

    Audio is never stored, only the transcript and its translation; Firestore security rules block any cross-user access

  5. 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

  1. Speech
  2. Soniox stt-rt-v5 (WebSocket, temporary key)
  3. Live bilingual subtitles
  4. expo-sqlite (offline)
  5. Firestore sync
  6. 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+