Download GopherTrunk

Latest release: v0.1.0 · all releases · SHA256SUMS

Windows 11

One-click installer, signed static binary, no DLLs to ship.

After install, swap the WinUSB driver via Zadig — the OS won't see your RTL-SDR until you do this once.

macOS

Static binary + sample config. Bundled with README and LICENSE.

Builds are unsigned — right-click → Open the first time to bypass Gatekeeper, or run xattr -dr com.apple.quarantine gophertrunk.

Linux

Tarballed static binary. No librtlsdr or libusb at runtime.

RTL-SDR needs udev rules + DVB blacklist on first install.

Verify your download

Every binary archive is SHA-256-checksummed. Refuse to install on a hash mismatch:

# Linux / macOS
curl -L -O https://github.com/MattCheramie/GopherTrunk/releases/download/v0.1.0/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS    # Linux
shasum -a 256 --ignore-missing -c SHA256SUMS  # macOS
# Windows
$expected = (Get-Content SHA256SUMS | Select-String "windows-amd64-setup.exe").ToString().Split(" ")[0]
$actual = (Get-FileHash gophertrunk-v0.1.0-windows-amd64-setup.exe -Algorithm SHA256).Hash.ToLower()
if ($actual -ne $expected) { throw "checksum mismatch" }

The daemon also self-reports its build provenance — every release pins the commit + build time at link time:

$ ./gophertrunk version
v0.1.0 (sha=abc1234, built=2026-05-13T19:00:00Z)

The sha= value matches the commit on the release tag; built= is the UTC timestamp the CI runner produced the artefact. Both are injected via -ldflags and are empty on go run / go test builds.

Quick start by OS

Linux

VERSION=v0.1.0
curl -L -o gophertrunk.tar.gz \
  https://github.com/MattCheramie/GopherTrunk/releases/download/${VERSION}/gophertrunk-${VERSION}-linux-amd64.tar.gz
tar xzf gophertrunk.tar.gz
cd gophertrunk-${VERSION}-linux-amd64
cp config.example.yaml config.yaml          # edit before launch
./gophertrunk version                       # confirms ldflags landed
./gophertrunk run -config config.yaml

For a systemd-managed install, copy gophertrunk.service to /etc/systemd/system/ and follow the install header.

macOS

VERSION=v0.1.0
ARCH=$(uname -m)                            # arm64 on Apple Silicon, x86_64 on Intel
case "$ARCH" in
  arm64)  PKG=darwin-arm64 ;;
  x86_64) PKG=darwin-amd64 ;;
esac
curl -L -o gophertrunk.tar.gz \
  https://github.com/MattCheramie/GopherTrunk/releases/download/${VERSION}/gophertrunk-${VERSION}-${PKG}.tar.gz
tar xzf gophertrunk.tar.gz
cd gophertrunk-${VERSION}-${PKG}
xattr -dr com.apple.quarantine gophertrunk  # bypass Gatekeeper (unsigned build)
cp config.example.yaml config.yaml
./gophertrunk version
./gophertrunk run -config config.yaml

RTL-SDR on macOS uses the bundled IOKit driver — no kext or driver swap required.

Windows 11

Run the installer:

# Or just double-click the .exe in Explorer.
.\gophertrunk-v0.1.0-windows-amd64-setup.exe

After install, complete the WinUSB driver swap via Zadig — see install-windows.md for the full step-by-step (the installer’s last page links there too). The OS won’t see your RTL-SDR until that swap is done.

Build from source

For every platform, the full source build is:

git clone https://github.com/MattCheramie/GopherTrunk.git
cd gophertrunk
make build               # → ./bin/gophertrunk (static, CGO_ENABLED=0)
make test                # unit tests
make integration         # daemon end-to-end (no SDR required)

Requires Go 1.25+ — the project’s go.mod pins the toolchain to 1.25.10 (closes the 23 stdlib CVEs in the bare 1.25.0). See CONTRIBUTING.md for the full dev setup.

Docker

The repository ships a multi-stage Dockerfile + docker-compose.yml with RTL-SDR USB pass-through wired:

git clone https://github.com/MattCheramie/GopherTrunk.git
cd gophertrunk
docker compose up -d

See hardening.md §”Docker” for the USB pass-through + healthcheck + Prometheus scrape config.

Security

Found a vulnerability? Please follow the responsible-disclosure process in SECURITY.md — do not open a public issue. Use GitHub’s private security advisory workflow:

https://github.com/MattCheramie/GopherTrunk/security/advisories/new

Older releases

Every prior tag stays on GitHub’s Releases page; binaries remain downloadable indefinitely. Security fixes only back-port to the most recent stable tag — older tags receive best-effort support.