Press Start, allow the microphone, and key Morse on the beeper. The page measures the tone power every 10 ms, tracks the noise floor, and turns marks and gaps into letters. Audio never leaves this computer. Edge and Chrome open the microphone in raw mode, past the driver's enhancements. If the tone looks chopped or missing (Firefox on Windows often gets a processed signal), switch Mic to Browser default, turn off Audio enhancements for the microphone in Windows Sound settings, or use the desktop app below, which reads the raw microphone.
The same decoder and encoder as a desktop program. It reads the raw microphone endpoint, so it also works on machines where the browser only gets a processed signal, and it needs no browser and no internet connection.
Looking up the latest release…
★ Star on GitHub if the page or the app is useful to you: stars are how projects like this get found.
What the microphone hears, 0 to 8 kHz. The amber marker sits on the tone frequency; the faint marker at 3f shows a beeper's third harmonic. Auto-detect averages this view for a second and snaps the marker to the strongest peak.
Energy at the tone frequency, one point per 10 ms, scrolling over the last 10 seconds. The dashed pair is the hysteresis threshold, drawn from the tracked floor and signal. The strip beneath is the detector's verdict, the tape a Morse operator would read.
The letter being keyed builds up as dots and dashes and is committed at the next letter gap. On the right, the live estimates that drive the decoder: dit, dah, letter gap and the reverb offset, plus a histogram of recent mark lengths that should show two clusters.
Farnsworth: set an overall speed below the character speed and the letters keep their rhythm while the gaps between them stretch (ARRL spacing), the standard way to learn by ear. Type English, read the Morse. Letters are separated by a space and words by a slash. The bar underneath is the keying guide: marks and gaps drawn to scale at the chosen speed, with each letter labelled, so you can follow it while pressing the button. Play keys the tone through the speakers and runs a playhead along the guide. With Feed the decoder on, the decoder listens to the page's own signal while it plays: the microphone is turned down 40 dB in the decoder's input and returns 0.4 s after the sound stops, so a raw microphone's delayed echo of the speakers cannot fill the gaps. A recording of the speakers played back later still decodes, since the page is silent then.
Send Morse yourself. Single key: hold Space or the big button and the tone sounds while held, exactly like a straight key. Two keys: the left arrow sends dits and the right arrow dahs, timed at the encoder speed and repeating while held, like an electronic keyer, in iambic mode A or B. Bug: automatic dits, hand-made dahs, like a Vibroplex. Dah ratio (dits per dah) and weight (longer marks, shorter spaces) shape the elements. Change key under a button picks any other keyboard key, and the choice is kept in this browser. The sidetone is the pitch you hear (600 Hz by default, easier on the ear than a 2.5 kHz beeper); the decoder is always fed the beeper frequency. The Sent line reads back what you keyed even when the decoder is not listening.
Pick a drill, press Next target, key the word with the Key strip. When the Sent line matches, the target is marked correct; otherwise press Check to see the edit distance, your speed and how far your marks and gaps sit from the ideal proportions. Show the code reveals the dots and dashes while you learn.
A Morse code chart built from the same table the decoder and encoder use: letters, digits and punctuation with their dots and dashes. Open it with Show chart. As you key, or as the decoder builds a letter, every character the dots and dashes so far could still become lights up and the exact match stands out, so you can see where a letter is heading. Click a character to hear it at the encoder speed.
Input level in dBFS with a peak-hold tick, a 6 ms slice of the band-passed input so a dead microphone is obvious at once, and the key numbers as readouts. The detector pill lights amber on every mark.
Chromium browsers (Edge, Chrome) open the microphone in Windows raw mode when a page turns processing off, so the beeper arrives clean. Firefox gets the shared, processed signal: Windows noise suppression removes a steady tone after about 50 ms and echo cancellation removes the machine's own output, so slow beeps decode as T and Play is never heard. If marks arrive as fragments the page says so. Use Edge or Chrome, turn off Audio enhancements for the microphone in Windows Sound settings, use a USB headset, or run the desktop app.
People arrive here looking for different things, and the page does all of them: a Morse code simulator that keys, sounds and decodes a whole conversation on one machine; a Morse code translator from text to code and, through the microphone, from code back to text; a Morse code trainer with a straight key, iambic keyer and bug worked from the keyboard, practice drills that grade your copy, Farnsworth spacing and a chart that lights up as you key; and an audio Morse decoder for a real PC beeper, a code-practice oscillator or a radio's CW sidetone. No account, no upload, nothing to install unless you want the Windows desktop app.
The page opens the microphone with the Web Audio API and measures the power at one tone frequency every 10 ms with a Goertzel filter, the cheapest way to watch a single pitch. A slow tracker follows the noise floor and another the signal level; the tone is called ON when its power climbs well above the floor and OFF when it drops back, with hysteresis and a short debounce so clicks and reverberation do not chop it. Loud but broadband sounds such as speech never switch it on.
The ON and OFF runs are sorted into dits, dahs and the three kinds of gap by an adaptive estimate of the dit length, so the speed does not have to be set: it is measured from what arrives, between 2 and 40 words per minute, and re-locks within a few marks when the sender speeds up or slows down. Letters appear as they are completed, with the letter in progress shown as dots and dashes.
A desktop computer's onboard speaker keyed from a push button makes a clean square-ish tone around 2.5 kHz that a laptop microphone hears from across a room. It is a convenient Morse practice oscillator, and any other steady tone works the same way: a code-practice oscillator, a radio's CW sidetone or a recording played nearby.
The encoder turns text into Morse with a keying guide drawn to scale, plays it through the speakers and can space it Farnsworth-style for learning. The Key strip makes the keyboard a straight key, an iambic keyer with mode A or B, or a bug, with a sidetone, adjustable dah ratio and weight, and keys you can rebind. The Practice strip hands out words, call signs and number groups and grades your copy and rhythm. The decoded log, with the time each word arrived, can be downloaded. A Morse code chart at the bottom of the console lists the 26 letters, 10 digits and the punctuation marks . , ? / = ' ( ) : ; + - _ " @ ! with their codes; the letter being keyed or decoded lights up in it, and clicking a character plays it.
Everything runs in this browser tab. No audio, text or settings are sent anywhere; the only network requests are for the fonts and, from GitHub, the release list of the desktop app and the repository's star count.
Chrome and Edge give the page the raw microphone signal. Firefox on Windows supplies a processed signal that suppresses steady tones, so the desktop app, which reads the raw endpoint and needs no browser or internet connection, is the better fit there. Both share the same decoder, verified against the same recordings.
Yes. It simulates the whole loop: a text-to-Morse translator that plays the code, a straight key, iambic keyer and bug you work from the keyboard, and a decoder that reads the result back, plus practice drills and a chart. Everything runs in the browser.
Both ways. Type text and the encoder shows the Morse and plays it at any speed from 2 to 40 words per minute, with optional Farnsworth spacing. Play a Morse tone at the microphone, or key one yourself, and the decoder turns it back into text.
That is what the Key, Practice and Reference strips are for. The chart lights up the characters your dots and dashes could still become as you key, the Practice strip hands out words, call signs and number groups and grades your copy and rhythm, and Farnsworth spacing lets you hear characters at full speed with room between them.
No. The microphone is opened by the page and processed with the Web Audio API inside the browser. Nothing is recorded or uploaded, and the page works offline once loaded. The desktop app never uses the network.
Chrome and Edge open the microphone in raw mode when the page asks for it, so a steady beeper tone arrives clean. Firefox on Windows often supplies a processed microphone signal that suppresses steady tones; there, try Mic: Browser default, tick Feed the decoder to hear the built-in encoder and key, or use the desktop app, which reads the raw microphone endpoint.
Any frequency between 100 Hz and half the sample rate. The default is 2491 Hz, a common PC beeper pitch; Auto-detect picks the strongest steady tone in the spectrum, or type the frequency in.
Speeds from 2 to 40 words per minute. The speed estimate adapts as you key and re-locks within a few marks when the speed changes; Manual mode fixes it.
Yes. The desktop app for Windows is a zip on the GitHub release page; it needs no Python and no internet. The source runs on any platform with Python 3.11 or newer.