Release Notes
Highlights
- IPv6-disabled hosts get a clean refusal instead of a crash-dump (#242). Connecting a WireGuard profile whose
Addressline declares an IPv6 entry used to fail mid-way insidewg-quickwith a rawRTNETLINK answers: Operation not supportederror and a retry loop. Both the TUI and CLI now refuse pre-flight with an actionable message: re-enable IPv6 via sysctl (or removeipv6.disable=1from the kernel cmdline), or drop the IPv6 entry from the profile. The profile is never rewritten silently. (#247) - CLI lifecycle hardening (#249).
vortix upis now truly idempotent, live tunnels are no longer flagged as "possible orphans" on everydown, and concurrentup/down/reconnectinvocations from multiple terminals serialize instead of racing.
Fixed
vortix upis now truly idempotent. Re-runningupfor an already-connected profile printsAlready connectedand exits 0 instead of re-spawning the tunnel. Previously a secondupof an OpenVPN profile spawned a duplicate daemon whose--writepidclobbered the first's pidfile, leaving the original daemon untracked. (#249)- No more spurious orphan warnings for live tunnels. The startup orphan scan now excludes PIDs recorded in profile pidfiles (
run/<name>.pid), sovortix down/statusno longer flags the active session's ownopenvpndaemon as a "possible orphan from a previous session." (#249) - Concurrent
up/down/reconnectinvocations are serialized via aflocklifecycle lock in the config dir. Two terminals racing the same mutation now queue instead of interleaving; the second prints a one-line "waiting…" note. (#249) - OpenVPN double-spawn guard at the tunnel layer:
up()refuses when the profile's pidfile records a live daemon (covers the mid-negotiation window the scanner can't see). (#249) - WireGuard connect on a Linux host with IPv6 disabled no longer fails mid-way inside
wg-quick(see Highlights). Detection covers both disable mechanisms: sysctldisable_ipv6=1and theipv6.disable=1boot param, verified against real kernels in both states. (#242, #247) - Daemon socket now binds inside the Tokio runtime (#233).
Security
- Bumped
crossbeam-epoch0.9.18 → 0.9.20 for RUSTSEC-2026-0204 (invalid pointer dereference infmt::Pointer; reached via a build-tooling dependency chain, not vortix's runtime path).
Changed
- README now documents the kill-switch reboot boundary: firewall rules do not survive an OS reboot, so
vpn-onlyis unenforced between boot and the next vortix launch. Persistence across reboot is tracked in #250. (#249) - The flip-panel widget now ships as the extracted
ratatui-flip-panelcrate, consumed as a dependency. (#232)
Documentation
- README overhaul: install matrix, named competitor comparison, security model, contributing section. (#230)
- Refreshed demo GIFs (hero + 4 scenario clips) and README cleanup. (#236)
- X/Twitter handle badge. (#244)
Install vortix 0.4.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Harry-kp/vortix/releases/download/v0.4.3/vortix-installer.sh | shInstall prebuilt binaries via Homebrew
brew install Harry-kp/tap/vortixInstall prebuilt binaries into your npm project
npm install @harry-kp/vortix@0.4.3Download vortix 0.4.3
| File | Platform | Checksum |
|---|---|---|
| vortix-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| vortix-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| vortix-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| vortix-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| vortix-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| vortix-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |