A complete Morse code (CW) workstation that runs in your browser — decode and send, no extra hardware required.
CW Studio pairs a Morse Decoder that reads CW from your receiver's audio with a Morse Keyer that sends it, both served by one small local service on your PC. The signal processing runs in the browser on the Web Audio API; the local service bridges the things a web page can't reach on its own — transceiver CAT control and serial-port keying.
You need a receiver and a sound card. That's it.
Most software CW decoders assume textbook Morse: perfect 1:3 dot-to-dash ratios, exact spacing, clean signals. Real operators and real bands are nothing like that. CW Studio is built around that reality.
- Fist adaptation — dot, dash, and spacing timings are tracked as three independent statistical clusters, so a heavy fist (1:4), a light one (1:2.2), or a contest operator who compresses spacing all decode correctly. The measured weight is shown live in the status bar.
- Error correction, at the word level — real sending is not metronomic. A
character gap that comes out slightly short merges two letters into one
(GE —
--. .— becomes--..= Z), and a stretched in-character gap splits one letter into two (SURE arrives as SUL). Both readings are made of entirely valid characters, so nothing looks wrong until you read the word — which is precisely how an operator spots it. CW Studio re-reads each finished word, reconsidering the gaps that sat closest to the decision boundary and scoring the alternatives against an English and amateur-radio vocabulary. It will also split a word that has run into the next one, such as a greeting backed straight onto a callsign. Corrections appear in amber with the original reading on hover, so the decoder never quietly guesses at you. - Interference tolerance — brief dropouts inside a mark are statistically detected and spliced out, so QSB flutter and static crashes don't chop dashes into dots. Impulse noise is rejected without breaking character timing.
- Multi-channel copy — decode the strongest signals across the whole band simultaneously, each with its own filter and decoder. Click any row to tune the main decoder to that station.
- Contest pileup trainer — practise against 1–3 simultaneous stations with realistic generated callsigns, serial exchanges, and randomised speeds, pitches, strengths, and fists. No radio needed.
| Display | Live spectrum, scrolling waterfall, frequency ruler, signal-envelope scope |
| Tuning | Click-to-tune, AFC that follows drifting signals, go-to-max, auto-GTM |
| Filters | Four bandwidths (400 / 200 / 100 / 50 Hz), adjustable envelope smoothing |
| Detection | Adaptive threshold with noise-floor tracking and squelch, or manual |
| Speed | Automatic tracking roughly 5–60+ WPM, with lock and min/max limits |
| Sources | Microphone / line-in, audio files, or the built-in practice generator |
| Rig control | Click a signal and the transceiver retunes so it lands on your TX pitch (VFO or RIT) |
| Compact view | Shrink to a small window showing only the decoded text and speed — for keeping copy in view while running a contest — and expand back |
| Themes | Dark and light interfaces, switchable from the header and shared across every window |
| Output | Copy or save the received text; all settings persist automatically |
| Keyboard sending | Type-ahead — characters go out as you type; Backspace edits unsent text; Esc aborts |
| Macros | F1–F8 with substitutions for your call, their call, name, RST, and auto-incrementing serial |
| Timing | WPM with true effective-speed readout, dash:dot ratio, weighting, Farnsworth spacing |
| Sidetone | Clean keyed sine with adjustable pitch and rise/fall edge — feed it to an SSB rig to transmit with no keying cable |
| Hardware keying | Serial-port DTR/RTS keying with optional PTT and lead/tail delays, timed natively for millisecond precision |
| Paddle | Iambic A/B or straight key — on-screen, keyboard, USB gamepad adapter, or a real key on a serial port's CTS/DSR lines |
| Extras | Tune (continuous key-down), beacon mode, prosigns typed as <AR> <SK> <KN> |
Download CWStudio-1.1.0-x64.msi from the
latest release and run it.
Everything is self-contained — no Python or other prerequisites.
You will see "Windows protected your PC — Microsoft Defender SmartScreen prevented an unrecognized app from starting."
To continue: click More info, then Run anyway.
Why it happens: the installer is not yet code-signed. Windows shows this for any installer without a purchased code-signing certificate, regardless of whether the software is safe. It is a statement about the certificate, not about the contents.
How to satisfy yourself it is genuine: every line of source in this repository built this installer — the build is reproducible with
installer/build.ps1. You can verify your download is byte-for-byte the file published here:Get-FileHash CWStudio-1.1.0-x64.msi -Algorithm SHA256Expected SHA-256 for 1.1.0:
4f50455d1e0e64804674ecd534e359d78e83b205786572dcfe16cf7f91eec874If you would rather run nothing unsigned at all, use Running from source below instead.
CW Studio starts automatically when the install finishes, and adds a CW Studio entry to the Start Menu. Launching it puts an icon in the system tray and opens the launch menu:
Right-click the tray icon for Open Morse Decoder, Open Morse Keyer, Open both (tiled side by side), and Start / Stop server.
Tip: Windows 11 hides new tray icons behind the ^ arrow. Drag the CW Studio icon onto the taskbar to keep it visible.
Requires Python 3.9+ on Windows. pip install pywin32 enables rig control and
serial-port keying; without it, everything else still works.
git clone https://github.com/requirementXYZ/CWStudio.git
cd CWStudio
python src/server.py
Then open http://localhost:8321. For the tray launcher, run pythonw src/tray.pyw,
or create a Start Menu shortcut with powershell -ExecutionPolicy Bypass -File src/create-shortcut.ps1.
- Launch CW Studio and pick Morse Decoder (or Open both).
- Press ▶ Start — browsers require one click before audio may run.
- With no radio connected, set the practice generator going to see it work.
Or append
?demoto the decoder URL for an instant simulated contest pileup. - For live decoding, choose Mic / Line and feed your receiver's audio into the computer's line or microphone input.
Receiving — connect the receiver's audio output (headphone or line out) to the computer's line-in or microphone input, then select Mic / Line as the source and choose your radio's sound card in the Device list — otherwise Windows hands over its default input, which is usually a webcam or laptop microphone. Many modern transceivers with a built-in USB audio codec appear as a sound device directly. If a rig feeds audio down only one side of a stereo input, set Channel to Left or Right. The Input level meter shows at a glance whether audio is actually arriving.
Transmitting — two options, no soldering required for the first:
- Sidetone into an SSB rig: feed the computer's audio output to the transceiver's mic or line input and use VOX or PTT. The keyed sine becomes CW.
- Serial-port keying: a keying interface (a transistor or optocoupler between a serial control line and the rig's key jack) driven by DTR or RTS, with optional PTT on the other line.
Rig control — install OmniRig and CW Studio can retune your transceiver when you click a signal on the waterfall.
Running alongside other station software — OmniRig serves several programs at once, so CW Studio can share the radio with a cluster, logging or DX dashboard application and both can tune it; tuning is last-action-wins rather than a tug of war, and CW Studio re-reads the dial at the moment you click so it never tunes from a stale frequency. Point both programs at the same OmniRig rig slot, and let only one of them use RIT. The real clash is serial ports, which only one program may open at a time — give CAT, keying and paddle input their own ports. See the user guide for the detail.
A real key or paddle — wire it to a USB gamepad adapter (dit and dah on buttons 1 and 2), to a serial port's CTS and DSR input lines, or via a microcontroller that emulates a keyboard. All three are supported natively and covered in the user guide.
The pages send a heartbeat to the local service. When the last CW Studio tab is
closed, the service shuts itself down about ninety seconds later — nothing is
left running. The tray menu always shows the true state, and The service listens on 127.0.0.1 only, so nothing is exposed to your
network. It prefers port 8321 and steps up to the next free port if another
application already holds it, so it cannot be blocked by a clash.
To keep it running headless, start the service with --stay.
A full user guide is built in — the ? Guide link in either tool's header, or
help.html. Every panel has an ⓘ icon that opens the guide at that topic.
- Band-pass filter — two cascaded biquad sections centred on the tuned frequency, running per-sample in an AudioWorklet.
- Envelope detector — rectification and one-pole smoothing, decimated to a ~1.5 kHz envelope rate.
- Adaptive threshold — independent trackers for the signal peak (fast attack, ~2 s decay so it rides QSB) and the noise floor, with a squelch that keeps pure noise out of the decoder entirely.
- Keying detector — hysteresis, asymmetric glitch filtering, and statistical dropout bridging: a gap is only spliced out of a mark when it is anomalously short against the observed gap distribution.
- Speed and fist estimator — median-filtered mark lengths are split into dot and dash clusters at the largest statistical jump; the cluster centres adapt independently and decision boundaries sit at their geometric means.
- Character decoder — marks are re-classified with the latest estimates at each character boundary; failures go to the repair engine described above.
src/ application source
index.html launch menu
rx.html app.js Morse Decoder
tx.html tx.js Morse Keyer
dsp-worklet.js band-pass filter and envelope detector (AudioWorklet)
help.html user guide
server.py local service: static files, rig bridge, serial keyer, watchdog
tray.pyw system-tray launcher
installer/ WiX source and build script for the MSI
docs/ screenshots
Requires PyInstaller and
WiX Toolset v5 (dotnet tool install --global wix --version 5.0.2):
powershell -ExecutionPolicy Bypass -File installer/build.ps1
This produces build_out/CWStudio-1.1.0-x64.msi.
- Windows 10 or 11 (the local service uses Windows APIs for rig control, serial keying, and window management)
- A current Chromium-based browser — Edge or Chrome — for AudioWorklet support
- A receiver and a sound card for live decoding; nothing extra for practice mode
CW Studio is released under the MIT Licence. You may use, modify and redistribute it freely, and it comes with no warranty of any kind.
This software is provided as-is and is not supported. There is no warranty that it will work correctly, decode accurately, or be fit for any particular purpose, and no undertaking to fix faults or answer questions. Use it at your own risk.
Amateur radio carries real risks, and managing them is your responsibility:
- Transmitting requires an appropriate licence. You alone are responsible for operating within your licence conditions, national regulations and band plans.
- CW Studio can key a transmitter through a serial interface, and beacon mode can transmit repeatedly without further input. A mis-wired interface, a wrong setting or an unattended beacon may put a signal on the air when you did not intend it. Check your configuration before connecting it to a radio, and do not leave it transmitting unattended.
- Transmitters, amplifiers, antennas and feedlines can carry dangerous voltages and RF energy. Antenna work carries risks of falls and of contact with power lines. Nothing in this software assesses or limits RF exposure.
- Decoded text may be wrong. Never rely on it where accuracy matters — in particular for emergency or safety-of-life traffic, or where there are legal or financial consequences.
To the fullest extent permitted by law, the authors and contributors accept no liability for any injury, loss, damage to equipment, interference caused, or breach of regulations arising from the use of this software.
This is not legal advice.
CW Studio is an independent project, not affiliated with any equipment or software vendor. 73!


