← Projects

MorseCode-Learner

watchOS trainer that teaches Morse through silent haptic taps.

Spring 2024 · watchOS · Archived

MorseCode Learner hero image — close-up Apple Watch face labeled MORSE CODE with vibration readout, large red MorseCode Learner title above, and red haptic-wave arcs radiating from both sides of the watch
The pitch in one image — Morse, on the wrist, felt not heard.

Stack

Stack: Swift · watchOS · WatchKit

WKInterfaceDevice.play() ships with a small vocabulary — .click, .success, .notification — and none of them is 'a dash three times longer than a dot.' Whatever the dash was, I had to build it out of the dot.

Log

  1. Spring 2024 — a silent skill

    Wanted Morse for a future project. Every trainer I tried put the lesson on a screen and used audio. I wanted a way to practice silently in class, and the wrist already taps for notifications.

  2. Picking the dot

    Cycled every WKInterfaceDevice.play() case looking for one that read as a Morse pulse on the skin. .click won — short, dry, unmistakable to me. Everything else felt too long or too much like a system alert.

  3. Faking the dash

    A real dash is three dots long, but the Taptic Engine has no native concept of duration. Dot became one .click; dash became playTripleDashHapticImmediate — three .clicks fired back-to-back, tight enough that my wrist reads them as one longer pulse. Not elegant. The dot/dash line became clear to me.

  4. Tapping back

    Input is the inverse problem — was that a dot or a dash, and was that gap a letter break or a word break? Built an adaptive timer that watched my last few taps and slid its dot/dash threshold around my rhythm. In my own trials, I found it could recognize both slow and fast tapping.

  5. The loop

    App feeds a word, taps it on the wrist, user taps it back. That's the whole interface.

  6. Tap-back-from-memory

    The intended loop was feel-the-word, tap-it-back. The loop that actually taught me was: feel the word, walk to the next class, then tap it back from memory thinking about the letters, not the buzzes. The delay forced the translation through language instead of muscle.

  7. Inventory

    Most of the alphabet now lives in my wrist. X and G still don't — they don't come up enough in the word list to drill in. Not enough to chat with a telegraph operator, but more Morse than anyone I know.

    Morse alphabet chart with large navy letters and dot-dash patterns in a grid; G and X are faded gray and handwritten 'still missing' appears under each of them
    Stuck on X and G. Everything else is in the wrist.

Result

Most of the alphabet — still missing X and G

What I learned

The Taptic Engine isn't a speaker — it has maybe four distinguishable voices and no native concept of duration, which means anything expressive on it has to be assembled out of the small set of pulses it'll give you. That constraint turned out to be fine for a two-symbol language. The bigger lesson was about the channel itself: a haptic loop the user can run without looking is a teaching surface most apps leave on the table.