I built IPA Coach to make English pronunciation practice less fragmented. The starting point was my own experience as a Spanish-speaking learner: I could understand English, but spelling and familiar sound categories made it difficult to know what I was actually hearing or producing. The app turns that problem into a progression through phonemes, words, and sentences, with practice and rehearsal screens that keep the IPA, guidance, audio, and recording workflow together.
The main client is a bilingual English/Spanish Next.js application. It is exported as a static site and deployed to Cloudflare Workers Static Assets, and the same web app is packaged for iOS and Android with Capacitor. The program data is checked into the repository: phonemes, articulation material, missions, adventures, sentences, and a large Oxford-based word collection. A client-side program store tracks the current adventure and mission, while authenticated progress is synchronized through the API. The practice model unlocks words after their relevant phonemes and sentences after their words, so the order is intentional rather than just a collection of dictionary lookups.
The backend is a Hono-based Cloudflare Worker. It exposes endpoints for IPA conversion, text-to-speech, pronunciation scoring, products and payments, and program progress. The IPA path is deliberately layered: it tokenizes the input, asks a Firebase Python function to resolve words from CMUdict or g2p-en with lightweight heteronym heuristics, and uses an LLM provider only for unresolved tokens. That gives common words a deterministic result while retaining a fallback for cases the local resolver cannot cover. Azure Speech supplies reference audio and pronunciation scoring, with Firebase authentication, Firestore usage tracking, quotas, and plan entitlements around the service.
There is also a Chrome MV3 extension. It can show an IPA tooltip when I hover over a word or select a phrase on a webpage, play native audio, and authenticate through the web app. The extension and the web client use the same Worker API, which keeps the pronunciation behavior and quotas in one place.
The project is working but still in progress. The core learning flow, word practice, static word routes, audio assets, bilingual routes, and an editorial/articles system are present, and the latest commits are focused on navigation and content infrastructure. Remaining work includes polishing the product, continuing the browser-extension integrations, and resolving deployment and scale tradeoffs around the very large static word export and Cloudflare asset limits.