A Lightweight KISS/AX.25 Client for the Everyday Operator
Introduction
The Simple Packet Terminal (SPT.py) is a Python-based tool written by Greg “Chengmania” Cheng, KC3SMW, designed to connect directly to a KISS interface and give operators a clean, no-frills terminal for packet operations.
Unlike heavy GUI-based clients, SPT.py is lightweight, intentionally simple, and fully cross-platform — running cleanly on Windows, Linux, and macOS. The goal is to offer a packet terminal that is:
- Easy to install and use (just Python and a terminal)
- Cross-platform friendly (no Windows-only dependencies)
- Operator-focused (streamlined for node access, BBS work, and UNPROTO keyboard chat)
- Hackable (open source, so others can expand on it)
By removing the distractions of graphical interfaces and complicated configuration menus, SPT.py makes it easy for both new and experienced hams to connect to packet nodes, explore BBS systems, or engage in real-time keyboard-to-keyboard chat.
Downloading SPT
You can grab the latest code straight from GitHub:
https://github.com/chengmania/SimplePacketTerminal
Clone with git:
git clone https://github.com/chengmania/SimplePacketTerminal.git
cd SimplePacketTerminal
Or just click Download ZIP on the GitHub page, then unzip it.
Inside you’ll find SPT.py
—that’s the script you’ll run.
Running the Program
First, make sure Direwolf or SoundmodemTNC is running and configured to provide a KISS TCP port.
Using Direwolf (Linux, macOS, Windows/WSL)
Open your direwolf.conf
and look for a line like this:
KISSPORT 8001
Make sure it’s present (and not commented out with a #
). This tells Direwolf to open a TCP socket on port 8001, which SPT.py will connect to.
Then simply start Direwolf by typing:
direwolf
For more details on setting up Direwolf, see: Configuring Direwolf
Using SoundmodemTNC (Windows)
In UZ7HO Soundmodem, go to Settings → Devices → KISS Server Port and confirm the TCP port number (often 8100 by default). SPT.py connects to this the same way it connects to Direwolf.
Typical Default Ports
- Direwolf → 8001
- SoundmodemTNC → 8100
Starting SPT
Once your TNC software is running and listening on its KISS TCP port, launch SPT.
- Default start (MYCALL only):
python3 SPT.py N0CALL
This assumes your TNC is on the local machine (127.0.0.1
) and listening on its default port (usually 8001). - Explicit start (host + port):
python3 SPT.py N0CALL 127.0.0.1 8100
This connects to a TNC running on 127.0.0.1 (localhost) at port 8100 — useful if you’re using Soundmodem or if your Direwolf is configured with a nonstandard port.
Important:
When you launch SPT with either of the above commands, you are not yet connecting to a packet node over RF. You are connecting SPT to your software modem (Direwolf or Soundmodem) via TCP. The modem then handles the radio side.
Once SPT is linked to the modem, then you can use /connect
inside SPT to reach another station over RF.
Understanding the Prompt
The prompt changes depending on your mode:
- Idle:
[N0CALL] >>
- Connected to a node:
[N0CALL @ KC3SMW-7] >>
- UNPROTO/UI mode:
[N0CALL UI] >>
This makes it clear at a glance what state you’re in.
Using /
Commands
SPT works a lot like a chat client, but with slash-commands for control.
Example: To connect to a node running on KC3SMW-7, you’d type:
/connect KC3SMW-7
Once connected, you’ll see the node’s banner or menu. SPT buffers your keystrokes until it’s your turn, so you don’t collide with the node’s output.
Talking to a Node
After connecting, you interact with the node just like you would with any other packet terminal. Common commands might be:
BBS
— enter the bulletin boardSP CALLSIGN
— send a personal messageI
— get information about the node
When you’re done:
/disconnect
UNPROTO (UI) Mode
SPT lets you send UI frames (UNPROTO packets) in two different ways:
- One-shot message
Send a single UI frame in one line by including the destination, optional digipeater, and the message: /unproto CQ VIA W3SK Hello world!!! This transmits just that one message as a UI frame. - Persistent mode
You can also set a UI destination once, then type messages normally. Every line you enter will be sent as a UI frame until you change modes again. For example: /unproto CQ VIA W3SK (no text after it — just set the destination) Now your prompt changes to[N0CALL UI] >>
.
- In this mode, all UI traffic is monitored, so you can see beacons, chats, and digipeated frames in real time.
- Anything you type will be transmitted as a UI frame, giving you a simple keyboard-to-keyboard chat method with any station listening on frequency. To exit persistent UI mode, type: /upexit
SPT.py Command Reference
Link Commands
Command | Shortcut(s) | Description |
---|---|---|
/connect CALL [via DIGI1,DIGI2] | /c | Connect to a station or node. Optional digipeaters are comma-separated. Example: /c KC3SMW-7 via WIDE1-1,WIDE2-1 |
/disconnect | /d | Politely request disconnect. Prompt updates immediately. |
/quit | /q , /exit | Exit the program. If connected, sends DISC first. |
Screen & Help
Command | Shortcut(s) | Description |
---|---|---|
/clear | /cls | Clear the screen and reprint header/command summary. |
/help | /h | Show one-line command summary. |
/help -v | — | Show full detailed help. |
Status & Settings
Command | Shortcut(s) | Description |
---|---|---|
/status | — | Show link state, destination, sequence numbers, digi path, and I/O options. |
/debug | — | Toggle debug logging of raw frames. |
/echo on|off | — | Locally echo what you type as it is transmitted. |
/crlf on|off | — | Choose line ending for transmitted text. ON = CRLF (\r\n ), OFF = CR (\r ). |
/retries N | — | Set number of SABM retries (default = 3). |
Unconnected (UI) Frames
Command | Shortcut(s) | Description |
---|---|---|
/unproto DEST [via DIGI1,DIGI2] message... | /u | Send a one-shot AX.25 UI frame. |
/unproto DEST [via DIGI1,DIGI2] | /u | Enter persistent UNPROTO mode. Every line you type is sent as a UI frame. |
/upexit | /upoff , /upstop , /unproto off|stop|end|exit | Exit persistent UNPROTO mode. |
Why SPT?
SPT.py isn’t meant to replace heavyweight station clients like Outpost, LinBPQ, or RMS Express. Those are excellent for full-service packet messaging and Winlink workflows, but they come with extra layers of setup.
A closer comparison would be tools such as:
- QTTERMTCP (bundled with BPQ)
- EasyTerm (from UZ7HO)
- Other packet terminal clients that rely on GUIs and more complicated configuration
The difference is that SPT runs right in your command-line terminal — nothing fancy, no heavy GUI frameworks, no Windows-only restrictions. Just a clean Python script that:
- Connects directly to Direwolf or Soundmodem over KISS TCP
- Gives you a colorized prompt and pager-friendly display
- Handles both connected AX.25 sessions and UNPROTO (UI) frames
- Works equally well on Linux, macOS, and Windows (via WSL or native Python)
If you’ve ever wished for a “just works” packet terminal with no distractions, SPT.py is designed to fill that gap.
Quick Start Cheat Sheet
- Start your TNC software:
- Direwolf:
direwolf
(default KISSPORT 8001) - SoundmodemTNC: check Settings → Devices → KISS Server Port (often 8100)
- Run SPT: python3 SPT.py N0CALL
python3 SPT.py N0CALL 127.0.0.1 8100 # explicit host/port if needed - Basic commands:
- Connect to a node:
/connect KC3SMW-7
- Send a one-shot UI message:
/unproto CQ VIA W3SK Hello world!!!
- Enter persistent UI mode (keyboard chat):
/unproto CQ VIA W3SK
- Exit persistent UI mode:
/upexit
- Quit:
/quit