NexaPipe 0.4.0
Release

NexaPipe 0.4.0

The desktop app now asks the operating system before it shows a credential — the other half of the door Android got in 0.3.0. A server whose backends are all down says so instead of dialling into a timeout, and the client's DNS cache answers only what it holds.

30 September 2026 · one tag ships the server archives, the desktop bundles and the Android APK.

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.

Desktop & mobile app — nexa

Operating system x86_64 arm64 / aarch64
Windows Installernexa-0.4.0-windows-x86_64-setup.exe Installernexa-0.4.0-windows-aarch64-setup.exe
macOS Disk image — Intelnexa-0.4.0-macos-x86_64.dmg Disk image — Apple siliconnexa-0.4.0-macos-aarch64.dmg
Linux Debian / Ubuntunexa-0.4.0-linux-x86_64.deb Fedora / RHELnexa-0.4.0-linux-x86_64.rpm AppImagenexa-0.4.0-linux-x86_64.AppImage Debian / Ubuntunexa-0.4.0-linux-aarch64.deb Fedora / RHELnexa-0.4.0-linux-aarch64.rpm AppImagenexa-0.4.0-linux-aarch64.AppImage
Android APK — emulatorsnexa-0.4.0-android-x86_64.apk APKnexa-0.4.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-0.4.0-x86_64-unknown-linux-gnu.tar.gz tar.gznexapipe-0.4.0-aarch64-unknown-linux-gnu.tar.gz
Linux (musl, static) tar.gznexapipe-0.4.0-x86_64-unknown-linux-musl.tar.gz tar.gznexapipe-0.4.0-aarch64-unknown-linux-musl.tar.gz
macOS tar.gz — Intelnexapipe-0.4.0-x86_64-apple-darwin.tar.gz tar.gz — Apple siliconnexapipe-0.4.0-aarch64-apple-darwin.tar.gz
Windows zipnexapipe-0.4.0-x86_64-pc-windows-msvc.zip zipnexapipe-0.4.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.

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/v0.4.0/nexapipe-0.4.0-x86_64-unknown-linux-musl.tar.gz
tar -xzf nexapipe-0.4.0-x86_64-unknown-linux-musl.tar.gz
cd nexapipe-0.4.0-x86_64-unknown-linux-musl && ./nexapipe --version
# macOS, Apple silicon
curl -LO https://github.com/open-nexa/nexapipe/releases/download/v0.4.0/nexapipe-0.4.0-aarch64-apple-darwin.tar.gz
tar -xzf nexapipe-0.4.0-aarch64-apple-darwin.tar.gz
cd nexapipe-0.4.0-aarch64-apple-darwin && ./nexapipe --version
# 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/v0.4.0/SHA256SUMS.txt
sha256sum -c --ignore-missing SHA256SUMS.txt

All assets: SHA256SUMS.txt.

What's new

0.4.0 follows 0.3.0, released 29 September 2026. Nothing in it breaks a working configuration: with no [timeouts] section the server dials exactly as 0.3.0 did, and the desktop app reads its credential store with the key it already had.

Desktop: the app asks the operating system first

Not yet watched running on every platform. The gate compiles on macOS, Windows and Linux, the two-minute window it opens is pinned by unit tests, and the macOS prompt has been driven by hand. What has not been seen is the prompt itself on a Windows or a Linux machine — if one misbehaves, that is the part to look at first.

Backends: refusing what is already known

# config.toml
[[routes]]
host_pattern = "app.example.com"
strategy = "least_conn"
backends = ["http://10.0.0.1:8080", "http://10.0.0.2:8080"]

[timeouts]
connect_secs = 10
response_secs = 30

The client's DNS cache answers only what it holds

Linux: the keychain really holds the key

Android: it asks before taking another app's VPN

The tunnel carries IPv6

Android: an APK for the emulator

The backends are asked whether they still answer

A dead backend is still handed out. This release only notices them: the balancer picks by index into a list it cannot change, so taking one out needs the group to become mutable — a change to every holder of it. That half is left for the next release, and the one to watch for in the meantime is a request served by a backend the log has already reported as silent.

Changelog

Added

Changed

Fixed

Before upgrading

Downgrading the desktop app means re-importing the invite. A node's connection string moved from the config payload into the encrypted store. A newer build migrates it on the way in; an older one reading the new payload finds nothing and drops the node. Upgrading keeps the node — going back does not.