Join a Practice Room
💡 First time? Try the "main" room to meet other operators
📅 Regular Schedule (UTC)
Current time: --:--:-- UTC
🔧 How It Works
Connect
Enter your callsign and join a room - microphone access required
Key CW
Send Morse via audio input from your keyer or paddle
Hear & Decode
Real-time audio + automatic text decoding from all operators
Practice Together
Improve your CW skills with operators worldwide
✨ Features
Ultra-Low Latency
WebRTC P2P delivers 70-100ms latency - like real QSO conditions
Adaptive Decoding
Smart decoder adapts to your speed (12-35 WPM) automatically
Zero Cost
Free forever. No registration, no ads, no tracking
Worldwide Practice
Connect with CW operators from any continent, any time
Cross-Platform
Browser-based - works on desktop, tablet, mobile
End-to-End Encrypted
SRTP audio encryption keeps your practice private
🔌 Using Real CW Gear?
Connect your USB paddle, iambic keyer, or straight key with our native Python client:
# Install dependencies
pip3 install pyaudio numpy pyserial
# Run the sender (auto-detects your keying style)
python3 cw_usb_key_sender.py main iambic-b 25 /dev/ttyUSB0
# The client handles:
# - Iambic A/B keying logic
# - Adaptive timing (12-35 WPM)
# - Audio sidetone generation
# - Network buffering & jitter compensation
🟢 Active Rooms Now
Loading active rooms...
⚙️ Technical Specs
Audio Quality
48kHz sampling • Opus codec • 70-100ms latency
Jitter Buffer
300ms adaptive buffer • Smooth network variations
Decoder Engine
Exponential smoothing • Auto-adapts to 12-35 WPM
Network Protocol
WebRTC mesh P2P • Duration-encoded CW events
Security
DTLS-SRTP encryption • No central server decryption
Scaling
2-8 operators per room (mesh) • Cloudflare Durable Objects signaling
❓ FAQ
What equipment do I need?
Just a modern web browser and microphone access. Key CW by routing audio from your electronic keyer into your microphone input. For the best experience, use our Python client with a USB paddle or straight key.
How does the adaptive decoder work?
The decoder uses exponential smoothing to track dit duration from the shortest tones it receives. It automatically adapts to speed changes (12-35 WPM) within 3-5 characters, and adds proper inter-element spacing for accurate playback.
Why is there latency?
The 300ms jitter buffer smooths out network timing variations, ensuring clean CW without clicks or gaps. Total latency (70-100ms network + 300ms buffer) is comparable to HF propagation delays, so it feels natural for radio operators.
Can I use this for official QSOs?
This is a practice platform, not a licensed amateur radio service. Use it to improve your CW skills, then take those skills to the air!
Can I create private rooms?
Absolutely! Enter any unique room name when joining. Share the room name with your friends for private practice sessions.
Is this open source?
Yes! MIT licensed. Check out the GitHub repository for the full source code, protocol documentation, and technical deep-dives.