Releases: theia-hq/swoosh
Release list
v0.8.0
Try it in one line with echo, open raw streams only when you say so, clean shutdown on every verb.
New
echo:service.swoosh serve demo=echo:serves a symmetric reflector that sends back whatever a
peer sends. It is safe to open to anyone with a plain--public(no--public-unsafe), so it is the
easiest first thing to try across two machines. The serve banner names it plainly.swoosh serve --public-unsafe <names>. Open a named raw stream (file:,fifo:,stdin:) to
strangers.--publicalone opens handlers, forwards, andecho:; a raw byte source hands out bytes with
no responder to gate them, so it stays gated unless you additionally name it here. Requires--public,
and a keyless shell is still refused outright.
Changed
- Rooted on nauthy 0.1.0. The authentication core is now the first standalone nauthy release, with its
generic capability vocabulary and rooted gate. swoosh keeps its own signet and fleet vocabulary on top;
no command changes. - Every reaching verb closes the node before exiting.
ping,speed,beam,forward, and the rest
now tear the connection down cleanly instead of printingAborting ungracefully, so the peer sees a
clean close rather than a dropped connection it has to time out. swoosh service --at <your-own-node>teaches instead of failing. Reading your own node's services is
not wired yet (it lands with the daemon); asking for it now says so plainly.
Fixed
- Serving a
file:source to a Linux peer works. A regular file cannot register with epoll on Linux,
sofile:sources failed to start there while working on macOS; fixed in the pinned tightbeam.
Internal
- Release robustness (Track C). A lock-source guard and pre-commit hook keep the committed lock in
shipping-form, cargo-deny checks dependency sources in CI, and the release build asserts the exact rev
pins (decision (A)) and fills the GitHub release notes from this CHANGELOG. No behaviour change.
v0.7.0
Prebuilt binaries for x86_64-linux, aarch64-linux, and aarch64-macos are attached below, each with a .sha256 checksum. Grab the one for your platform, chmod +x it, and run swoosh id to mint your node key.
Grant one service to a device, a whole person, or anyone; a clearer serve banner.
New
swoosh grant issue <svc> --for <who>bind a slip to a device or a whole fleet, with the kind in a
typed prefix:--for <person>/<device>or a raw key binds ONE device (standing access, locked to one
machine's key, inert if stolen, non-delegable);--for fleet:<person>or--for fleet:<signet-key>
binds a whole fleet (every device that person's signet vouches for, now or later, revocable at once). A
bare--for <person>is refused: you typefleet:to widen, so a device bind never silently becomes a
fleet bind.fleet:<person>binds that person's signet recorded withswoosh contact signet.swoosh contact signet <petname> <key>record a person's signet root under their petname, so
grant issue --for fleet:<petname>binds their fleet by name instead of a pasted key.swoosh grant lslist the grants you have issued, grouped by service, each with its holder and
remaining lifetime.swoosh grant revoke <peer>refuse every grant you issued to a device or person at once; the
existingrevoke <link>still refuses a single link. Both write a node-local denylist the gate loads
whenservestarts, so a revoke takes effect on the node's nextserve, not on a running one (live
revocation lands with the daemon).swoosh serve --public <svc>open named services to anyone, unauthenticated, per service: the
deliberate opt-out from the signet gate. A service with no safe public form, such as a keyless shell,
is refused by name.swoosh service --at <peer>read the services a peer serves and the gate on each, aSERVICE GATE
table; you see only what that peer's gate admits you for. Reading your OWN node's services is coming with
the daemon.swoosh serve <name>=fetch:<origin>pin a fetch service to one origin: the node fetches only that
origin and refuses any other before it connects. A barefetch:is unconstrained, but opening one to the
public (--public) now requires a scope, so an open fetch service can never be an anonymous any-origin
relay. Origin URLs carrying userinfo are rejected.swoosh ida short alias forswoosh identity: print this node's key, minting one if there is none.
Changed
signetis now a reserved device label. A contact device literally labelledsignet(added as
alice/signetbefore this release) is now read as that person's signet root, not a device. Pre-release
this is near-zero incidence; if you have one, re-add it under a different label.swoosh serve --for <duration>is now--expires <duration>.--foris reserved for naming WHO a
grant binds (grant issue --for), so serve's bounded-time timer moved to--expires, matching
grant issue --expires. Same local timer;--forno longer sets a duration.- Reformatted
swoosh servebanner. The node id stands alone, copy-clean; ahow peers reach you
section names each channel (internet, LAN, direct); services are grouped by who can reach them, safest
first, with one escalating danger marker so an open service always reads louder than a gated one. swoosh adoptno longer takes the authkey on argv. The authkey is a device secret, and the command
line is visible to other processes (ps,/proc). Pass it as-(stdin),@<path>(a file), or set
SWOOSH_AUTHKEY; a literal still works but is discouraged.- Clearer
--presenthelp. Thesheer:link flag on the reach verbs (ping,speed,status,
beam,forward,service,stop) now reads plainly: your own devices need no link, the dial
presents your membership badge; pass asheer:slip only to reach as a delegate. control.*readsnever publicin the serve banner. The always-gated node-control line is glossed
never public(it can never be opened with--public, unlike the other gated services), instead of
always family-gated.- A refused fan-out no longer reads as unreachable. When
pingorstatusreaches a peer but the gate
refuses the probe, the error saysreached, but refusedand stops there. Over quirk it no longer also
prints thepass --peeraddressing hint, which applies only when the peer was never reached at all. - Reach verbs take petnames uniformly.
stopand the other reach verbs now resolve a petname
(alice,me/laptop) the same waypingdid, instead of taking only a raw key. swoosh serveexits 0 on a gracefulcontrol.stop. A requested stop is a success, so a stopped node
no longer exits non-zero.
v0.6.0
swoosh v0.6.0
Push files to a key, stop a remote node, and honest failures.
New verbs
-
`); you push to it. A directory expands to every file under it, files stream over concurrent streams, and each is hashed with BLAKE3 and re-checked on arrival, so a truncated or tampered transfer is rejected, never written. Gated by your signet: only members (or a `sheer:` cap you hand out with `--present`) can push to your node.swoosh beam <path>... <peer>push a file or directory to a peer, verified end to end. The
receiver stays online withswoosh serve beam=beam:(files land in the current directory, or `--out -
swoosh stop <peer>tell a peer's node to stop serving, by its key or asheer:link. It dials
the node's gatedcontrol.stopservice and, once admitted, triggers the same graceful stop a Ctrl-C
gives. It stops the node, it does not power off the machine. Gated like the diagnostics, so for a
single-owner node only your own devices can stop it. -
swoosh serve --for <duration>serve for a bounded time (30m,2h,1d), then stop by itself.
A local timer: when the deadline passes the node stops gracefully. Pairs withswoosh stopto tear a
bounded session down early.
Changes
-
Loud failures.
ping,speed,status, andfetchnow error and exit non-zero when a node
refuses a service, instead of reporting a healthy line, 100% loss, or 0.00 MiB/s. A refusal is a
refusal, said plainly. -
+lossyfan-out (tightbeam): a raw-stream source can fan out to many receivers over unreliable
datagrams, dropping frames under load rather than blocking. See tightbeam's README.
Under the hood
- tightbeam's CLI command structs moved into its binary; its library exports only grant logic. swoosh
now calls that logic directly (mint_link/narrow_link/revoke_into) under its own clap surface.
No behaviour change: same flags, same wire.
Install
curl -fsSL https://raw.githubusercontent.com/theia-hq/swoosh/main/scripts/install.sh | shExperimental. The CLI, wire protocol, and identity format will change; not ready for production use.
v0.5.0
Release v0.5.0: flat ping/speed, --to selector, stdin: source, live p…
v0.4.0
release: drop --locked (cross-target lock incomplete); reproducible-l…
v0.3.1
release: swoosh 0.3.1 (adopt identity-store fix)
v0.3.0
swoosh 0.3.0: one binary (tunnel + grant issue/narrow/revoke), ssh --…
v0.2.0
swoosh 0.2.0 One human CLI over the theia stack. mint/adopt provision a device from your signet (2-field authkey, no stored bearer badge); `swoosh ssh` reaches a peer's sshd by membership over the authenticated overlay, pinning host keys in a private known_hosts keyed on node id. Auth core red-teamed clean.
v0.1.0
Release: also check out quirk (bifrost-quirk path-deps it)