Ditty · working prototype
The direction is settled: Tape and Lamp are the two media inside Key, Rhythm is what Quests looks like, and Explore is the alphabet you can play. Tap the tabs — it's a real app, not a picture of one. On a computer you can type on your actual keyboard in Explore.
tap = dit · hold = dah · pause = new letter
tap a letter to hear it · every key wears its own code
match the rhythm — length matters, not speed
How quickly each letter is sent. Keep this near real speed so the rhythm you learn is the right one.
Extra silence between letters. Slide it left for longer pauses — the letters stay crisp, you just get more room to think.
Some ears find a lower tone easier to listen to for a long time.
Play mode uses these · Studio adds dit length in ms and Farnsworth ratio
Key
Tape and Lamp sit behind a segmented toggle — the same control as Huely's Ink/Light, over the same medium-aware state. Tape draws marks whose width is their duration: dit one unit, dah three. Lamp is the dark-room sibling, where the screen goes quiet so the ear can lead.
you key it — the app reads you
Explore
Every key wears its own code underneath, so the whole alphabet is visible at once. Tap one to hear it and add it to the strip; type your name and press play. This absorbs what a Learn tab would have been — the reference is the toy, so nothing has to be a chart.
you type it — the app sends it
Quests
Target rhythm above, yours below, in the same width-is-duration language. It's Huely's quest banner with the swatch swapped for a tune — same live match percentage, same 90 / 95 / 99 → ★★★, same confetti, and it matches how the Koch method actually teaches.
Settings
You were right that standard Morse is too fast for a child — but the fix isn't one speed slider. Slowing the letters teaches a shape that has to be unlearned later, because a slow "S" doesn't sound like a fast one. So there are two controls: letters stay near real speed, and thinking time stretches the silence between them.
That's the Farnsworth method, and it's what every serious Morse course uses. Move the sliders and key something — the app responds live.
letters at 12 · spacing at 6 = gentle but honest
Still to decide
Explore does the job a Learn tab would have — the alphabet reference became the playground instead of a chart — so the app lands on four tabs that each earn their place. If you want the culture and history (why SOS isn't “save our souls”, CQD on the Titanic, "What hath God wrought"), that's a scrolling section underneath the keyboard rather than a fifth tab.
Engine
lib/morse.ts owns units, WPM, Farnsworth spacing, the table and the decoder. Tape, Lamp and
the Quest lanes are pure presentation over the same element list — exactly how Beaker and LightStage share
one drop curve.
Play / Studio
Play shows the two friendly sliders above. Studio exposes dit length in milliseconds, the Farnsworth ratio, and sidetone shaping — same duality as Huely, no new architecture.
Saving
Nothing saves yet. When it should, it belongs in Explore as a small “my words” shelf — reusing
JarContext and the Apple backup — rather than a tab of its own.
| From Huely | Carries over as |
|---|---|
| TabBar, TopBar, ToggleSwitch | Verbatim, once TabBar takes a tabs array instead of hardcoded SVGs |
| Ink / Light medium toggle + pinned provider | Tape / Lamp, unchanged |
| QuestContext, starsForMatch, per-pack ladders | Unchanged — only “what counts as a match” differs |
| QuestBanner / QuestPlayScreen | The rhythm lanes, target renderer swapped |
| sound.ts audio() + silent-buffer warm-up | The sidetone — same iOS latency hardening |
| useDropInteraction's pointer hardening | New duration-based hook, same hard-won iPad fixes |
| functions/** Apple auth + KV sync | Verbatim; new App ID, Services ID, KV namespace, secret |
| i18n provider + reachability tests | Day one — a letter/prosign library invites the same dead-key bug |