A modern, polished desktop GUI for ham radio packet chatting over KISS TNCs — built in Rust with egui.
- Monitor tab — live view of all AX.25 UI frames heard, with station sidebar
- TCP TNC backend — connect to software TNCs like Direwolf over KISS/TCP
- Serial TNC backend — connect to hardware TNCs via serial port
| Feature | Status |
|---|---|
| UI frames (unconnected broadcast) | ✅ Working |
| Monitor tab with station sidebar | ✅ Working |
| TCP KISS backend | ✅ Working |
| Serial KISS backend | ✅ Working |
| AX.25 connected sessions (SABM/UA) | 🚧 In progress — UI is present but session establishment is buggy |
- Rust 1.85+ (edition 2024)
- A Linux, macOS, or Windows desktop
- A KISS TNC reachable over TCP or serial — e.g. Direwolf, SoundModem, or a hardware TNC
cargo build --release
The binary is at target/release/squawk.
- Enter your callsign in the top bar.
- Choose a connection type — TCP (host:port) or Serial (port + baud).
- Click Connect.
- Monitor tab: watch all UI frames on the channel. Click a callsign in the sidebar to set the destination.
- Sessions tab (in progress): UI is present for AX.25 connected sessions but session establishment is not yet fully working.
In your direwolf.conf, set:
KISSPORT 8001
Then in Squawk, select TCP, host 127.0.0.1, port 8001.
Select Serial, enter the port (e.g. /dev/ttyUSB0 or COM3), and set the baud rate to match your TNC (typically 9600).
src/
main.rs — eframe entry point
app.rs — egui UI, event loop, session routing
ax25.rs — AX.25 frame encode/decode (UI, I, S, U frames)
kiss.rs — KISS framing (encode + streaming decoder)
session.rs — AX.25 connected-mode state machine
tnc/
mod.rs — TncHandle, TncEvent, TncCommand types
tcp.rs — TCP KISS backend (background thread)
serial.rs — Serial KISS backend (background thread)
Licensed under the MIT License.