What you can do↑ Why · Alex reaches the laptop at home from a café Alex's shell on the home laptop, from a café, carrying on when the wifi drops.
Open a shell on a node from a browser, and reattach after a drop
A session dies with its pipe; the shell must not.
Shown when end to end through a relay; kill the pipe, reattach, the shell is the same.
0 of 3 tests passed · 2 places in the code
- not run a test
e2e/node/pair.spec.mjs:419 - not run a test
node/tests/session.rs:3 - not run a test
services/terminal/tests/pty.rs:1 - code
services/terminal/src/lib.rs:4 - code
web/app/terminal.js:17
List, read and write files on a node
Shown when end to end through a relay.
0 of 3 tests passed · 1 place in the code
- not run a browser adds a Linux machine with the line it shows, uses its files, edits one in the editor, and a second browser joins from a link
e2e/node/pair.spec.mjs:14 - not run a test
node/tests/session.rs:3 - not run a test
services/files/tests/paths.rs:1 - code
services/files/src/lib.rs:7
Its desktop↑ Why · Alex reaches the laptop at home from a café Alex uses the home laptop's desktop from a café while the laptop sits locked on the desk.
A node's desktop in a pane: see it and use it.
See and use a node's desktop from a browser
Shown when end to end through a relay and directly: a test app's frame counter reads correctly off the pane's canvas, and a click turns the app the colour it paints on a click.
How The desktop
0 of 1 test passed · 1 place in the code
- not run a browser opens the desktop of a GNOME machine nobody is logged in to, sees its app and drives it, through resizes, a pipe change and crashes
e2e/desktop/desktop.spec.mjs:78 - code
services/desktop/src/main.rs:13
A desktop of its own, while the machine stays locked
Nothing remote shows on the machine's screen, and locking or unlocking that screen doesn't touch the remote desktop. It needs no root, and it works with nobody logged in.
Shown when with the machine's session locked, and again logged out, a pane gets
a desktop and drives it; the lock screen stays up and the session's
LockedHint never changes.
How The desktop
No test yet · 1 place in the code
- code
services/desktop/src/shell.rs:8
The screen at the machine, only while it is unlocked
A locked screen is never shown or unlocked from afar: whoever walked away from it decided.
Shown when unlocked, the pane shows the monitor; on lock the pane says so and gets no frame until the machine is unlocked at the machine.
How The desktop
Not built: nothing in the code or tests names this yet.
The desktop is the pane's size
Shown when resizing the pane resizes the desktop within a second, and frames carry on.
How The desktop
0 of 2 tests passed · 1 place in the code
- not run a browser opens the desktop of a GNOME machine nobody is logged in to, sees its app and drives it, through resizes, a pipe change and crashes
e2e/desktop/desktop.spec.mjs:78 - not run a test
e2e/desktop/desktop.spec.mjs:131 - code
services/desktop/src/capture.rs:8
A lost frame never holds up the next
Shown when with 5% loss on a direct pipe the picture mends within a keyframe; over a backed-up relay the newest frame is shown and older ones dropped; on a LAN, a click shows its change within 150 ms at the 95th percentile.
How The desktop
Not built: nothing in the code or tests names this yet.
Many watch, one types
Shown when two panes see the same frames from one encode; input goes from the pane that typed last, and both show which one holds it.
How The desktop
No test yet · 1 place in the code
- code
services/desktop/src/main.rs:13
It mends itself
Shown when killing the encoder, the stream or PipeWire brings frames back within five seconds without reopening the pane; an idle screen, which sends nothing, is never taken for a dead one.
How The desktop
0 of 2 tests passed · 2 places in the code
- not run a browser opens the desktop of a GNOME machine nobody is logged in to, sees its app and drives it, through resizes, a pipe change and crashes
e2e/desktop/desktop.spec.mjs:78 - not run a test
e2e/desktop/desktop.spec.mjs:157 - code
services/desktop/src/capture.rs:8 - code
services/desktop/src/main.rs:13
The desktop is a right of its own
A grant to the shell or files doesn't open the screen.
Shown when a caller with terminal and files rights but not desktop is refused.
How The desktop
No test yet · 1 place in the code
- code
node/src/msg.rs:20
Every call is checked
The machine with the data checks every call itself, against grants you signed. No server is asked, so it works offline. Who may call, and how a person is asked, is Access; an agent's way in is MCP.
Staying up to date↑ Why · Alex reaches the laptop at home from a café The laptop at home takes every fix without Alex going back to it, and never mid-session.
A machine you set up once keeps itself current: nothing to type, nothing interrupted, and nothing installed that we didn't sign.
A node updates itself
It looks for a release when it starts, every fifteen minutes and as soon as
its relay says one is out (wire/release-hint), downloads it and switches
to it, with nothing typed on the machine.
Shown when a machine running one release, with the next published, is running the next one a few minutes later, its session back and its files working.
How Updates
0 of 1 test passed · 2 places in the code
- not run a machine takes signed, newer releases when idle, refuses the rest, and goes back from one that never comes up
e2e/update/update.spec.mjs:80 - code
node/src/update.rs:228 - code
node/tests/update.rs:138
Only a release we signed is installed
A release is a manifest of its version and each build's SHA-256, signed with the release key, Ed25519 and ML-DSA both (D-2). The node carries the public key; the host serving the downloads can't make it run anything.
Shown when a manifest that is unsigned, signed by another key or changed after signing is refused, and the machine stays on its version.
How Updates
0 of 1 test passed · 3 places in the code
- not run a machine takes signed, newer releases when idle, refuses the rest, and goes back from one that never comes up
e2e/update/update.spec.mjs:80 - code
node/src/update.rs:85 - code
node/tests/update.rs:13 - code
node/tests/update.rs:138
Never an older version
Shown when a correctly signed manifest for the running version, or an older one, is refused.
How Updates
0 of 1 test passed · 2 places in the code
- not run a machine takes signed, newer releases when idle, refuses the rest, and goes back from one that never comes up
e2e/update/update.spec.mjs:80 - code
node/src/update.rs:93 - code
node/tests/update.rs:41
A node restarts into an update only when nobody is using it
It downloads and checks at once, then waits until no session has carried anything for a few minutes and no file is open, or a day has passed.
Shown when with a session active, or a file open, the new build sits on disk and the old one keeps serving; once idle, the node is running the new one.
How Updates
0 of 1 test passed · 2 places in the code
- not run a machine takes signed, newer releases when idle, refuses the rest, and goes back from one that never comes up
e2e/update/update.spec.mjs:80 - code
node/src/update.rs:105 - code
node/tests/update.rs:55
A release that doesn't come up is rolled back, and never tried again
The new build has a minute to attach to the relay, start its services and load the account's log; if it doesn't, the machine goes back to the build it had, and skips that release from then on, still taking a later one.
Shown when a release that exits at once is tried, the machine is back on the one before, serving files, refuses that release when it is offered again, and takes the next.
How Updates
0 of 1 test passed · 3 places in the code
- not run a machine takes signed, newer releases when idle, refuses the rest, and goes back from one that never comes up
e2e/update/update.spec.mjs:80 - code
node/src/update.rs:171 - code
node/src/update.rs:340 - code
node/tests/update.rs:70
Updating a service restarts only that service
Sessions stay up; a call in flight to it gets gone.
Shown when a service updated under an open session ends that service's calls
with gone, and the session and other services carry on.
How Updates
Not built: nothing in the code or tests names this yet.
Services outlive a restart of the node
The new node takes over the services the old one started, through their sockets, so a shell survives an update of the core.
Shown when a shell open across a node update keeps its process and its scrollback.
How Updates
Not built: nothing in the code or tests names this yet.
An extension updates on its own, signed by its publisher
Never by our key, and never along with the node.
Shown when an extension release signed by our release key, or by anyone but its publisher, is refused.
How Updates
Not built: nothing in the code or tests names this yet.