Learning Morse Code the Hard Way (So I Built a Tool)

TL;DR

I (kind of) built a Morse code trainer. Click here to see the standalone version, or keep scrolling to learn more and play with it directly on this page.

What on Earth…?

If you’ve been following along recently, you know I’ve been tumbling down the amateur radio rabbit hole. I started with a handheld Baofeng scanning local repeaters from my dashboard, but I am quickly realizing that the real magic happens on the HF (High Frequency) bands.

And if you want to operate efficiently on HF—especially with portable, low-power gear that fits in a motorhome—you need to learn CW (Continuous Wave).

Also known as Morse Code.

Learning Morse Code as an adult is essentially learning a new language consisting entirely of beeps. There are plenty of great apps out there to help you learn, but when my developer brain hits a learning curve, my natural instinct is to over-engineer a solution.

Instead of just studying, I spent a few days “vibe coding” my own custom Morse Code trainer. There are lots of good options out there for this, but none of them quite gave me what I wanted, so I iterated with some AI help to build this thing from scratch.

A quick note on my philosophy regarding “vibe coding”: I believe using AI for creative works is morally fine, as long as you aren’t trying to take credit for it. In this case, I used Google Gemini to build and iterate on an initial prototype. I then manually converted it from a single-file web app into something a bit more structured. I then worked with Github Copilot to fix bugs, refactor some of the terrible code, add more features, etc. When it was in a stable state, I converted it into a Hugo module (Hugo is the system I use for this website) and shortcode, allowing me to import it into the website and embed it into this post. As a software engineer, I treat LLMs as yet another tool in the belt. I’d be a pretty terrible engineer if I just blindly tried to solve everything with AI, but for small side projects like this, LLMs are a solid option to fill in the gaps in my own understanding, as long as you understand their limitations and monitor them closely. I’ve always been weak with UI development, and I am obviously a newbie with Morse Code, so AI absolutely helped me put this together in a matter of days instead of weeks. I keep a close eye on what the model is producing and work hard to keep bad code at bay. In terms of workflow, I delegate small specific tasks to the LLM, and check its work at every step. Does this make me lazy? Probably. Do I care if you think that? Nope.

You can find the open-source code for it here on my GitHub .

The Roam Office CW Trainer (MorseMaster)

The goal of this tool is to help build muscle memory. You don’t want to count the “dits” and “dahs” in your head; you want your brain to instantly associate a rhythmic sound with a letter on your keyboard.

I built this in a way that lets me embed it directly into the blog, so you can test it out right here.

(Click the box below to start the trainer. Listen to the character, and type the corresponding key.)

How to use it:

Start Simple: If you are brand new, the trainer will start with just a few characters.

Listen, Don’t Count: Try to memorize the melody of the letter, not the number of dots and dashes. For example, “Q” sounds like “Here comes the bride.”

Volume Warning: Make sure your audio interface isn’t cranked up too loud before you hit start!

Features

Adaptive Learning: Automatically increases difficulty as your accuracy improves. This is the main feature that drove me to create this thing in the first place.

Koch Method: Introduces characters in a specific order (K, M, R, S, U…) to maximize rhythmic contrast.

Unique twist: You can manually add letters early on by clicking on them. This is useful if you’re studying using multiple approaches and don’t want to wait to “unlock” letters you already know.

Farnsworth Timing: Keeps the individual character speed high (e.g., 20 WPM) while slowing down the spacing between them, which prevents your brain from trying to count the dots and dashes.

Smart Practice Generators: This trainer uses multiple approaches to generate practice messages, including an AI-driven method:

Intercept Broadcast: Generates random practice sentences using only your currently unlocked characters.

Smart Coach: Analyzes your accuracy history and creates custom drills focusing specifically on your weakest characters.

Gemini API Integration: For the best AI-generated practice sentences, you can enter a Google Gemini API key directly in the settings. (Note: This is saved locally in your browser. My website never sees it, so your key is safe).

On-Device AI: If you use a browser that supports on-device AI (like Chrome), the tool will use a slimmed-down, local model to generate messages.

Fallback Logic: If no AI model is available, the tool falls back to generating messages using simple logic that doesn’t rely on an LLM at all.

Responsive Design: Works beautifully on both desktop and mobile.

Right now, the trainer can only help with learning to copy (hearing and translating the message). Eventually, I may add support for practicing sending messages, but the available tools for that are already fantastic, so I probably won’t bother reinventing the wheel.

The Standalone Version

While embedding it in a blog post is cool, it’s not exactly the best environment for a 30-minute practice session.

If you actually want to use this to study (or if you just want to bookmark it on your phone for when you have five minutes to kill), I have set up a distraction-free, full-screen standalone version.

Launch the Standalone Morse Code Trainer →

I am still very much a beginner at CW (I don’t even have an HF radio that can handle it yet, let alone a physical keyer to send messages), but building this tool forced me to stare at the logic of the alphabet for hours, which was a surprisingly effective study method on its own.

Give it a try and let me know how you score!