NexaPipe 1.0.0
Release

NexaPipe 1.0.0

The first release that changes what a client is allowed to reach and where the server keeps what it learns. A device's credential can be a key instead of a shared secret, a client can be held to the ports it may reach and not only to the names, the server's runtime state lives in a file of its own, and both clients can bring the tunnel back by themselves. No client has to be enrolled again — the handshake, the ALPN and the L4 preface are unchanged on the wire, so a 0.6.1 client talks to a 1.0.0 server and the other way round. What did change is what a deployment and a device have to do.

24 October 2026 · one tag ships the server archives, the desktop bundles, the Android APK and the container image.

Download for your platform

Pick a build below if the guess is wrong.

Downloads

Client app first, then the server. Nothing needs an account, and nothing is gated.

The macOS and Windows desktop bundles are published unsigned.

A code signature costs money — the Apple Developer Program is $99 a year and a Windows certificate is bought per year on top of that — and this project has no revenue, so the first release ships the artifacts without one. Everything else is signed: the Android APK carries the release keystore, the server archives carry a checksum, and the container image is signed with the release key and carries a provenance attestation.

On macOS the refusal is the strict one: the app does not open until the user chooses “Open Anyway” in the dialog, which is a click in System Settings → Privacy & Security. The Tauri updater’s own signature is separate from the operating system’s and is present either way, so an update installs the same way as the first install does.

Desktop & mobile app — nexa

Operating system x86_64 arm64 / aarch64
Windows Installernexa-1.0.0-windows-x86_64-setup.exe Installernexa-1.0.0-windows-aarch64-setup.exe
macOS Disk image — Intelnexa-1.0.0-macos-x86_64.dmg Disk image — Apple siliconnexa-1.0.0-macos-aarch64.dmg
Linux Debian / Ubuntunexa-1.0.0-linux-x86_64.deb Fedora / RHELnexa-1.0.0-linux-x86_64.rpm AppImagenexa-1.0.0-linux-x86_64.AppImage Debian / Ubuntunexa-1.0.0-linux-aarch64.deb Fedora / RHELnexa-1.0.0-linux-aarch64.rpm AppImagenexa-1.0.0-linux-aarch64.AppImage
Android APK — emulatorsnexa-1.0.0-android-x86_64.apk APKnexa-1.0.0-android-arm64.apk

One APK per ABI: arm64-v8a for every phone, x86_64 for the emulator images a development machine can run. Desktop bundles are signed with the Tauri updater key; the in-app updater reads latest.json in the same release. iOS is not a supported platform — see the roadmap.

Checksums for every asset above: SHA256SUMS.txt.

Server & client library — nexapipe

Operating system x86_64 arm64 / aarch64
Linux (glibc) tar.gznexapipe-1.0.0-x86_64-unknown-linux-gnu.tar.gz tar.gznexapipe-1.0.0-aarch64-unknown-linux-gnu.tar.gz
Linux (musl, static) tar.gznexapipe-1.0.0-x86_64-unknown-linux-musl.tar.gz tar.gznexapipe-1.0.0-aarch64-unknown-linux-musl.tar.gz
macOS tar.gz — Intelnexapipe-1.0.0-x86_64-apple-darwin.tar.gz tar.gz — Apple siliconnexapipe-1.0.0-aarch64-apple-darwin.tar.gz
Windows zipnexapipe-1.0.0-x86_64-pc-windows-msvc.zip zipnexapipe-1.0.0-aarch64-pc-windows-msvc.zip

Each archive holds the nexapipe binary, the client cdylib for embedding, config.toml.2fa.example, the README and the licence. Checksums for every asset above: SHA256SUMS.txt.

Container image

Published with everything else, as one multi-arch manifest for linux/amd64 and linux/arm64. Both READMEs carry a systemd unit for the server now as well.

# This release exactly
docker pull ghcr.io/open-nexa/nexapipe:1.0.0

# The newest stable release (:latest never points at a pre-release)
docker pull ghcr.io/open-nexa/nexapipe:latest

docker-compose.yaml names the published image, so docker compose up pulls it rather than building — --build still builds locally under the same name.

The image runs as uid 1000, not root. The three mounted directories have to be writable by that uid, so run sudo chown -R 1000:1000 config secrets logs before the first start of an upgraded deployment. Without it the iroh.key cannot be opened and is regenerated — a new Node ID, and every client stops finding the server. See before upgrading.

Install from a terminal

No package manager yet — these are the release assets, straight from the tag.

# Linux x86_64, static binary
curl -LO https://github.com/open-nexa/nexapipe/releases/download/v1.0.0/nexapipe-1.0.0-x86_64-unknown-linux-musl.tar.gz
tar -xzf nexapipe-1.0.0-x86_64-unknown-linux-musl.tar.gz
cd nexapipe-1.0.0-x86_64-unknown-linux-musl && ./nexapipe --version
# macOS, Apple silicon
curl -LO https://github.com/open-nexa/nexapipe/releases/download/v1.0.0/nexapipe-1.0.0-aarch64-apple-darwin.tar.gz
tar -xzf nexapipe-1.0.0-aarch64-apple-darwin.tar.gz
cd nexapipe-1.0.0-aarch64-apple-darwin && ./nexapipe --version
# Linux — verify before extracting: the check looks for the archive beside
# SHA256SUMS.txt, so it has to run before the cd into the directory
curl -LO https://github.com/open-nexa/nexapipe/releases/download/v1.0.0/SHA256SUMS.txt
sha256sum -c --ignore-missing SHA256SUMS.txt
# macOS — the same check with shasum, which is what ships there. macOS 26
# added sha256sum, but every release older than that has only shasum, and not
# every version of it understands --ignore-missing, so grep narrows the list
# to the one archive you actually downloaded. Still before the cd.
curl -LO https://github.com/open-nexa/nexapipe/releases/download/v1.0.0/SHA256SUMS.txt
grep nexapipe-1.0.0-aarch64-apple-darwin.tar.gz SHA256SUMS.txt | shasum -a 256 -c -

All assets: SHA256SUMS.txt.

What's new

1.0.0 follows 0.6.1. No configuration key is removed or renamed and every key this cycle adds is optional, so a config.toml that works on 0.6.1 still loads — but five things behave differently without being configured to, and all of them are listed under before upgrading.

A device can hold a key instead of a shared secret

A client can be held to the ports it may reach

The server's state lives in a file of its own

The third-party boundary is two settings now

Both clients can stay up on their own

A backend can be reached over TLS, retried, and taken out of rotation

Changelog

One line each; the full entry is in CHANGELOG.md.

Added

Changed

Fixed

Before upgrading

The server

The clients