NetKeyer is a cross-platform GUI application for CW (Morse code) keying with FlexRadio devices, supporting both serial port and MIDI input devices.
A cross-platform GUI application for CW (Morse code) keying with FlexRadio devices, supporting both serial port and MIDI input devices.
Download pre-built binaries of NetKeyer now!
If you don’t want to use the pre-built binaries, you can build from source directly.
cd NetKeyer
dotnet build
cd NetKeyer
dotnet run
The MIDI note configuration dialog allows you to assign any MIDI note (0-127) to one or more functions:
Default mappings (compatible with HaliKey MIDI and CTR2):
Radio not found:
GUI client binding fails:
No sidetone:
High latency:
Serial port not found:
dialout group)MIDI device not responding:
NetKeyer supports detailed debug logging controlled by the NETKEYER_DEBUG environment variable. This can help diagnose issues with specific subsystems.
Log File Location:
Debug messages are automatically written to a log file in the NetKeyer application data folder:
%APPDATA%\NetKeyer\debug.log~/.config/NetKeyer/debug.log~/Library/Application Support/NetKeyer/debug.logYou can easily access the log folder via Help → View Debug Log… in the application menu.
Note: On Windows, GUI applications don’t show console output when run outside a debugger. Debug messages are always written to the log file, making them accessible even when the console isn’t visible.
Available Debug Categories:
| Category | Description |
|---|---|
keyer |
Iambic keyer state machine (paddle state, element timing, mode transitions) |
midi |
MIDI input parsing and raw event processing |
input |
Input abstraction layer (paddle state changes, indicator updates) |
slice |
Transmit slice mode monitoring (CW vs PTT mode detection) |
sidetone |
Audio sidetone provider (tone/silence state machine, timing) |
audio |
Audio device management (initialization, enumeration, selection) |
Usage Examples:
Linux/macOS:
# Enable all debug output
NETKEYER_DEBUG=all dotnet run
# Enable specific categories
NETKEYER_DEBUG=keyer,midi dotnet run
# Enable all MIDI-related categories using wildcard
NETKEYER_DEBUG=midi* dotnet run
Windows PowerShell:
# Enable all debug output
$env:NETKEYER_DEBUG="all"
dotnet run
# Enable specific categories
$env:NETKEYER_DEBUG="keyer,midi"
dotnet run
Windows CMD:
# Enable all debug output
set NETKEYER_DEBUG=all
dotnet run
# Enable specific categories
set NETKEYER_DEBUG=keyer,midi
dotnet run
Common Debugging Scenarios:
NETKEYER_DEBUG=input,keyer to see paddle state changes and keyer logicNETKEYER_DEBUG=midi,input to see raw MIDI events and parsed paddle statesNETKEYER_DEBUG=audio,sidetone to see device initialization and tone generationNETKEYER_DEBUG=slice to see transmit mode detectionNetKeyer/
├── Views/ # XAML UI layouts
├── ViewModels/ # Application logic and data binding
│ ├── MainWindowViewModel.cs
│ ├── MidiConfigDialogViewModel.cs
│ ├── AudioDeviceDialogViewModel.cs
│ └── AboutWindowViewModel.cs
├── Models/ # Data models
│ ├── UserSettings.cs
│ ├── MidiNoteMapping.cs
│ └── AudioDeviceInfo.cs
├── Services/ # Core application services
│ ├── InputDeviceManager.cs
│ ├── KeyingController.cs
│ ├── RadioSettingsSynchronizer.cs
│ ├── SmartLinkManager.cs
│ └── TransmitSliceMonitor.cs
├── Audio/ # Sidetone generation
│ ├── SidetoneGeneratorFactory.cs
│ └── ISidetoneGenerator.cs
│ ├── SidetoneGenerator.cs (PortAudio)
│ ├── WasapiSidetoneGenerator.cs (Windows WASAPI)
│ ├── SidetoneProvider.cs (waveform generation)
├── Midi/ # MIDI input handling
│ └── MidiPaddleInput.cs
├── Keying/ # Iambic keyer logic
│ └── IambicKeyer.cs
├── SmartLink/ # SmartLink authentication
│ ├── SmartLinkAuthService.cs
│ ├── SmartLinkModels.cs
├── Helpers/ # Utility classes
│ ├── DebugLogger.cs
│ └── UrlHelper.cs
├── lib/ # Compiled FlexRadio libraries
Serial Port (HaliKey v1):
MIDI Devices:
WASAPI Backend (Windows preferred):
PortAudio Backend:
User settings are stored in:
~/.config/NetKeyer/settings.json%APPDATA%\NetKeyer\settings.json~/Library/Application Support/NetKeyer/settings.jsonStored settings include:
FlexLib components are Copyright © 2018-2024 FlexRadio Systems. All rights reserved.