About
tncd is a userspace bridge that lets AGWPE-compatible applications (Winlink,
Xastir, APRSIS32, etc.) talk to KISS TNCs — serial, TCP, or Bluetooth.
Tested over the air with real Winlink sessions at 1200 baud.
It implements full AX.25 connected mode including SABM/UA handshake, I-frame sequencing, delayed acknowledgement, and dynamic T1/T2 timers — with no kernel AX.25 stack required.
Install
curl -fsSL https://tncd.dev/tncd.pub \
| sudo gpg --dearmor \
-o /usr/share/keyrings/tncd.gpg
echo "deb [signed-by=/usr/share/keyrings/tncd.gpg] \
https://tncd.dev/apt stable main" \
| sudo tee /etc/apt/sources.list.d/tncd.list
sudo apt update
sudo apt install tncd
sudo curl -fsSL \
https://tncd.dev/rpm/tncd.repo \
-o /etc/yum.repos.d/tncd.repo
sudo dnf install tncd
sudo curl -fsSL \
https://tncd.dev/rpm/tncd.repo \
-o /etc/zypp/repos.d/tncd.repo
sudo zypper refresh
sudo zypper install tncd
# Download the PKGBUILD
curl -fsSL https://raw.githubusercontent.com/ben-kuhn/tncd/main/packaging/PKGBUILD \
-o PKGBUILD
# Build and install
makepkg -si
tncd is available via a custom overlay that includes the package and its Python dependencies.
# Clone the overlay
sudo mkdir -p /var/db/repos
sudo git clone https://github.com/ben-kuhn/tncd.git \
/var/db/repos/tncd
# Register the overlay
cat <<'EOF' | sudo tee /etc/portage/repos.conf/tncd.conf
[tncd]
location = /var/db/repos/tncd/packaging/gentoo-overlay
EOF
# Install (add bluetooth USE flag for BT support)
sudo emerge --ask net-misc/tncd
The overlay also provides ebuilds for
dev-python/kiss3, dev-python/pyham-ax25,
and dev-python/ax253.
tncd is packaged in nix-ham-packages. Add the overlay and service module to your NixOS configuration:
let
ham = builtins.fetchTarball
"https://github.com/ben-kuhn/nix-ham-packages/archive/main.tar.gz";
in {
nixpkgs.overlays = [ (import ham) ];
imports = [ "${ham}/tncd/module.nix" ];
services.tncd = {
enable = true;
settings = {
server.callsign = "N0CALL";
client = {
type = "serial";
device = "/dev/ttyUSB0";
serial_baudrate = 9600;
ota_baudrate = 1200;
};
};
};
}
See the Nix README for Bluetooth setup and all module options.
macOS is available on the 2.0 beta line only (the Go rewrite), and without OS service integration — run it yourself or wrap it in a launchd unit.
Download the matching
tncd-<version>-macos-arm64.tar.gz (Apple
silicon) or -macos-amd64.tar.gz (Intel) from the
GitHub releases,
extract it, and run:
tar -xzf tncd-<version>-macos-arm64.tar.gz
# macOS blocks unsigned downloaded binaries (Gatekeeper). tncd is not
# notarized, so clear the quarantine flag before the first run:
xattr -dr com.apple.quarantine ./tncd
./tncd -c tncd.ini
If you skip that step you'll get “cannot be opened because the developer cannot be verified.” You can also allow it via System Settings → Privacy & Security → Allow Anyway.
Bluetooth TNCs: pair the device, then use type = serial with
its /dev/cu.* port. Homebrew tap coming later.
Windows is available on the 2.0 beta line only (the Go rewrite) — there is no Windows build of the stable 1.3.x line.
Download tncd-<version>-windows-amd64.zip
(or -arm64) from the
GitHub releases,
unzip it, and double-click tncd.exe. With no
config present it launches an installer that asks for your callsign and
TNC — serial ports and paired Bluetooth devices are listed for you — then
installs tncd as an auto-starting Windows service. Run tncd.exe
again to start/stop the service, open the config, open the web monitor, or
uninstall.
Command-line equivalents:
tncd.exe ports
tncd.exe install -c tncd.ini
tncd.exe service start
tncd.exe uninstall
Bluetooth TNCs connect natively (Winsock RFCOMM): pair once in Windows Settings, then pick the device in the installer.
python3 and bluez need to be present.
The 2.0 beta (NixOS, Windows, macOS, FreeBSD) is a single static Go binary
with no runtime dependencies.
Quick Start
Copy the example config and edit it for your TNC:
sudo cp /etc/tncd.ini.example /etc/tncd.ini
sudo $EDITOR /etc/tncd.ini
Enable and start the service:
sudo systemctl enable --now tncd
See the README for full configuration reference.