floWhale is a Korean listening and vocabulary app built on two core beliefs about how language learning actually works.

Six months ago, I couldn't understand a single word of Korean. As a developer learning the language on my own, I found that every existing app felt the same — flashcards, word lists, rigid lesson plans. None of them trained the skill I needed most: understanding Korean by ear, in real conversation. So I built it for myself — and used it every day while building it.
Six months later, I can follow more than half of a natural Korean conversation. Korean no longer sounds like an unbreakable code to me. Beyond new vocabulary, I can now read and understand sentence structures and grammar patterns I've never explicitly studied — simply because I've heard them, in context, over and over again.

That result is what gave me confidence in this app.
It isn't a theory. It's a method I lived through. The two principles at its core — Beyond Translation and Beat It Twice — weren't designed in a meeting room. They emerged from six months of real learning, real frustration, and real breakthroughs. If it worked for me, it can work for anyone.


💡 Beyond Translation

Most language apps hand you a fixed curriculum. flo Whale flips that.

The app starts as a translator — paste any Korean text you care about, whether it's a K-drama line, a song lyric, a news headline, or a message from a friend. The moment you translate it, the text is automatically segmented into sentences, and every Korean word is broken down for interactive study. One click on any sentence launches the game: the audio plays, key words go blank, and you select the correct Chinese meaning from randomized choices.

But what if you have nothing to paste yet? That's what the Generate button is for. One click — or Ctrl+G — and DeepSeek AI instantly produces 7 fresh intermediate Korean sentences: energetic, varied in mood (questions, commands, exclamations, statements), and never repetitive. Translation and word-level analysis load automatically. In under five seconds, you go from a blank screen to 7 fully playable sentences — no textbook, no prep, no content required.

Beyond Translation doesn't just mean learning content you love. It means the barrier to starting is always zero.


🥊 Beat It Twice

Recognizing a word in isolation is not the same as knowing it. flo Whale's vocabulary system is built around one rule: a word is only learned when you've correctly identified it in two separate sentences.

Here's how it works in practice. When you encounter a new word — say 집 (home) — it appears as a blank in your first sentence. You listen to the audio, choose the right Chinese translation from randomized options, and get instant feedback. The word stays in your active pool. Later — whether in your next pasted article or in a freshly generated batch — it surfaces again in a completely different context. When you get it right a second time, it's locked in.

This is where Generate becomes the engine of Beat It Twice. Every time you hit Generate, DeepSeek produces 7 new sentences with high creative randomness, designed for variety. That variety is precisely what creates the second encounter. You're not drilling the same sentence — you're meeting the same word living a different life, in a different context, doing a different job.

This isn't rote repetition. It's the way context-driven vocabulary acquisition actually works — the same way children absorb words by hearing them used differently, across different situations, over time. The 50-Word Vocabulary Module and Annotation System apply this same principle to your personal word list, with AI-generated sentences purpose-built to trigger the Beat It Twice loop.


🧱 Challenges We Ran Into

Korean Sentence Segmentation — Harder Than It Looks Korean text cannot be split on punctuation alone. Korean doesn't separate all word units with spaces, and a single clause can contain conjunctions, verb endings, and particles that all signal different types of boundaries — but with different weights. We ended up building a two-stage segmentation system:

A fast pass for immediate display, splitting on punctuation and merging fragments shorter than 3 words. And an optimized pass for the learning game, which scores every potential split point — conjunctions like 그리고/하지만 score highest, verb clause endings like -면서/-는데 score medium, adverbs score lower — and only cuts when the score crosses a threshold. Sentences longer than 12 words get split; fragments under 3 words get merged with their neighbor. Getting this to feel natural — not mechanical — took many iterations.

Web Speech API: A Browser API Full of Edge Cases The Web Speech API sounds simple on paper: pass text, get audio. In practice, it breaks in almost every direction.
Stall on extended playback.** The API sometimes freezes mid-sentence on longer sessions. The fix: a setInterval that calls pause() then resume() every 3 seconds while speech is active — an ugly workaround, but the only reliable one.
Interrupt race conditions.** When a user selects a word during playback, the new audio request races with the old one. We built a full interrupt system with a useRef flag and a tracked set of all pending setTimeout IDs so everything clears cleanly before the next utterance begins.

Chaining Three AI Calls Without Losing the User The full pipeline — Generate (DeepSeek) → Translate (DeepL) → Analyze (DeepSeek) — involves three sequential API calls. Running them naively meant users stared at a blank screen for 5–8 seconds. We resolved this by firing DeepL translation the moment DeepSeek generation resolves, then attaching the word analysis to the translation result — so the translated text appears first, and the word-by-word breakdown loads in behind it. The game is playable before the analysis finishes.


🌿 What We Learned

Context Is the Mechanism, Not Just a Metaphor

We started with the intuition that context matters. After building and using this daily, we understand why at a mechanical level: when a word appears in a real sentence with audio, grammar, and meaning all present simultaneously, the brain encodes it differently than when it appears on a flashcard. The Beat It Twice rule works not because "two is better than one" — but because the second encounter in a different sentence forces retrieval from a partially formed memory trace, which is exactly when consolidation happens.

The Web Speech API Is Powerful — and Completely Underestimated

Most developers reach for paid TTS APIs immediately. The Web Speech API, properly handled — with chunking, voice initialization, stall prevention, and interrupt control — produces genuinely natural Korean audio at zero cost. The engineering overhead is real, but so is the result: sub-100ms audio response on word selection, which is fast enough that it feels like part of the game rather than a loading state.

Korean Morphology Is a Different Kind of Hard

Korean agglutinates particles and endings directly onto stem words. What looks like one "word" to a parser might be a noun, a subject marker, a tense marker, and a politeness level all fused together. Building segmentation that produces learnable chunks — not linguistic atoms — required understanding enough Korean grammar to know which boundaries matter pedagogically, not just syntactically. Deepseek api gave us the tools; knowing what to do with the output took longer.


What's Next

  • AI-powered sentence generation: Automatically generate new example sentences for any learned word, using LLMs, so "Beat It Twice" never runs out of context.
  • Conversation mode: Use AI to simulate real Korean conversations based on the vocabulary you've learned.
  • Pronunciation feedback: Integrate speech recognition to check if the user is pronouncing Korean words correctly.
  • Social sharing: Let users share their favorite sentences and challenge friends to learn them.
  • More languages: Extend the "Beyond Translation" model to other language pairs (Japanese-English, Chinese-English, etc.).

Try It🍀

Paste any Korean sentence you love — and in 10 seconds, you'll be learning it. That's the promise of Beyond Translation.Hit Generate if you have nothing to paste. Seven sentences. Zero prep.
And when you meet the same word again in a new sentence, you'll know it. That's Beat It Twice.

What's Important Under the Hood

  • Generate — DeepSeek AI
    One button produces 7 fresh intermediate Korean sentences on demand: diverse in topic, varied in mood, and never repetitive. Temperature is tuned high for maximum variety — because Beat It Twice only works when the second encounter feels genuinely new.
  • Word Analysis — DeepSeek AI
    Every sentence is passed through DeepSeek AI for phrase-level grammatical breakdown — identifying subjects, verbs, objects, and particles with contextual explanations. This powers both the Word Analysis panel and the per-word audio interaction in the game.
  • Annotation System, Favorites & History
    Highlight any word or phrase to save it to your personal Annotation Store. Favorites and translation history persist across sessions — every sentence you've ever studied is one click away, ready to feed back into the Beat It Twice loop.
  • Translation — DeepL API
    Korean text is sent to DeepL's neural translation engine for high-accuracy Korean → Chinese (Simplified) and Korean → English output. Long input is automatically segmented sentence by sentence, so each line becomes an independent learning unit the moment it's processed.
  • Audio — Web Speech API
    Korean text-to-speech runs natively in the browser with no third-party audio dependency. Playback speed is fully adjustable — slow it down to catch every syllable, or run it at natural pace to train real listening comprehension.

Stack Frontend: React 18 + TypeScript, Vite, TailwindCSS, Radix UI, Framer Motion, TanStack Query Backend: Express.js, Drizzle ORM, PostgreSQL AI / APIs: DeepSeek (generation & analysis), DeepL (translation), Web Speech API (audio)


Built With

  • api
  • deepl
  • deepl-(translation)
  • deepseek
  • express.js
  • framer
  • radix-ui
  • react-18-+-typescript
  • speech
  • tailwindcss
  • vite
  • web
Share this project:

Updates