tncd

AGWPE-to-KISS Translation Bridge for packet radio

GitHub Releases Documentation Changelog Blog GPL-3.0

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.

x86_64 i686 arm64 armhf riscv64

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.

Install from source using pip:

git clone https://github.com/ben-kuhn/tncd.git
cd tncd
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python tncd.py -c tncd.ini

Homebrew package coming soon.

tncd is best run under Windows Subsystem for Linux (WSL). Install WSL with a Debian or Ubuntu distribution, then follow the Debian / Ubuntu instructions above.

wsl --install -d Ubuntu

Once inside WSL, serial devices are accessible via /dev/ttySN and TCP TNCs work normally.

Packages include all Python dependencies. Only python3 and bluez need to be installed separately (usually already present).

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.