Repository navigation
v0.5.0
jumpgate v0.5.0 adds a terminal UI, a signed controller/agent model for the boxes you manage, and desktop builds for macOS, Windows and Linux.
Long operations now run on the box as durable jobs; the first one, node.migrate-names, moves legacy nodes to the jumpgate-node account. Read Upgrading before you upgrade.
Highlights
- Terminal UI. Run
jumpgatewith no arguments in a terminal, or open the terminal launcher for your OS. It has six screens: Fleet, Hosts, Signers, Gateways, Jobs and Settings. They cover every box at once, plus each box's status, disk, endpoints, firewall, live logs and services, pairing, and the signing key.1–6switch screens,:takes a command (:logs box-a,:restart beacon box-a) and?lists every key. Stopping or restarting a service asks you to type its name. The TUI needs an 80x24 terminal. It draws in plain ASCII on the classic Windows console and the Linux virtual console, or withJUMPGATE_ASCII=1, andNO_COLOR=1turns colour off. The TUI holds no keys and does no work itself: it talks to the local server, and quitting leaves the server running.jumpgate homeshows the plain line-based screen instead. - Controller and agent.
jumpgate keys initcreates a controller signing key in the macOS Keychain, Windows Credential Manager, Secret Service, 1Password or an owner-only file.jumpgate hosts addpairs a box: you confirm its host key by fingerprint, and jumpgate installs a small agent (jumpgate-agent.service) and a restrictedjumpgatetunnel user. Every command to a paired box is then a signed intent, which the agent checks against its policy and answers with a signed receipt. Each release carries both Linux agents (amd64 and arm64), so a controller on any OS can pair a box with nothing else to download. - A command line.
jumpgate helplists the commands:status,logs,service,hosts,keys,jobs,ssh,open,serveandstop. Exit codes are documented in the README. A security failure, such as an unconfirmed or changed host key or a reply the paired agent didn't sign, always exits 4. - macOS, Windows and Linux. macOS ships
Jumpgate.app(a window and a menubar icon) andJumpgate Terminal.app. Windows shipsjumpgate.exeandjumpgate-tray.exe(a window and a notification icon). Linux ships a desktop bundle with "Jumpgate" and "Jumpgate (window)" menu entries, on amd64 and arm64. One background server per user is shared by the app, the TUI and the CLI. Downloads come with SHA-256 checksums and build-provenance attestations. - Durable jobs. A durable job is a multi-step operation that the box runs itself, so it outlives the TUI, the controller and an agent restart. Every step and answer goes into a signed, hash-chained log that the controller verifies. When a step can't choose safely, the job stops and asks you. One controller drives a job at a time; the others watch, and can adopt a job whose controller has been silent for 90 seconds. Press
5in the TUI to open the jobs inbox, or runjumpgate jobs. node.migrate-names.jumpgate migrate-names HOST --yesrenames a legacy node'svalve-node-appaccount, group, units and data root tojumpgate-node. It checks the box before it renames anything, leaves a mounted data root at its path once you agree, and asks before it stops leftover processes. New setups usejumpgate-nodefrom the start.- Also new:
jumpgate relayruns keyed, metered RPC as its own process, away from the controller key. API keys are issued, listed and revoked from the RPC screen.- A Public gateway tier serves your own domain with a Let's Encrypt certificate.
- Log lines sent for an AI explanation have addresses, peer ids and secrets redacted first.
Upgrading from v0.4.4
- Quit v0.4.4 before you start v0.5.0. Both listen on
127.0.0.1:8799. - Your settings move automatically. On first run,
~/.valve-node-appmoves to~/.jumpgate, and aMOVEDnote is left in the old place. It's a rename, not a copy, so secrets never exist twice on disk. If both directories hold aconfig.json, jumpgate stops and asks you to keep one and remove the other. It doesn't merge two configs. - Secrets are tightened at startup. The server makes existing secret files private to you. It refuses to start if a signing key can't be made private.
- Bare
jumpgatein a terminal now opens the TUI. You get the web app withjumpgate open, with a flag such as--bind, or with no terminal (a pipe or the app bundle). - Browser sign-in uses a one-time login link.
jumpgate opensigns your browser in with a link that works once, within 60 seconds, from this computer only. The session token is never put in a URL or on a command line. For a browser that can't read~/.jumpgate, usejumpgate open --print. - Host keys are checked strictly. A box that is paired, confirmed or listed in your
~/.ssh/known_hostsmust present the same key. A changed key is refused, not learned again. Only a box with no such record is still trusted on first use. - Pairing is optional for existing boxes, but jobs need it. Boxes you already manage keep working over SSH. Durable jobs and signed intents need a paired box: run
jumpgate keys initonce, thenjumpgate hosts add NAME --ssh root@HOST. Once pairing succeeds, disable root SSH login on the box (PermitRootLogin no). - Upgrade every controller before you migrate a box's names. A controller from before this release doesn't know about the migration. Running setup from it afterwards would set the box up under the legacy names again. A current controller refuses to set up a migrated box under the legacy names.
- While a job runs, the node belongs to the job. The box refuses service start, stop and restart, and the controller refuses setup and service clear on it (
409 job_active). - Platform minimums:
- macOS 10.15.
- Windows 10 1803 or Windows Server 2019.
- The Linux window needs WebKitGTK 4.1 (Ubuntu 22.04+, Debian 12+, Fedora 38+).
Security fixes
- Built with Go 1.26, which carries the current fixes to
net/http, HTTP/2 andcrypto/tls. - Updated golang.org/x/crypto for two SSH denial-of-service fixes.
- A cookie-authorised write to the local API must now come from the app's own origin. Before this fix, a page on another local port could drive the API with your cookie.
- The Gemini API key is sent in a header, not in the URL, so it no longer appears in error messages.
- The browser is signed in with a one-time login code instead of the session token.
- Host keys that were paired, confirmed or listed in
known_hostsare checked strictly: a changed key is refused. - Every secret jumpgate writes is created private to you: owner-only files on Linux and macOS, DACLs on Windows. Existing ones are tightened at startup.
Known limitations
- Durable jobs need a Linux box with systemd. A box without systemd refuses to start one (
jobs_unsupported). Controllers on any OS can list, watch, decide and adopt jobs. - There is no approval-tier signer yet. jumpgate refuses an approval-tier question with
409 approval_unavailable. - Validators are not supported.
- The agent runs on Linux only. To run a node on macOS or Windows, use a WSL2 or Lima VM as an ordinary Linux box.
jumpgate sshrefuses a box that is reached through a jump host.- Pairing this machine with
--localworks on Linux only. - Downloads are not code-signed yet. Windows SmartScreen may warn you, and macOS may ask you to allow the app in System Settings > Privacy & Security.