Desktop app
Starts the host and herdr-core on this computer, installs herdr-core for you when it is missing, and offers this computer to your phone.
doritermend-to-end encrypted terminal
Every machine you own, linked through an end-to-end encrypted mesh.
Noise IK sessions · ChaCha20-Poly1305 · the relay holds no key
~/api main $ bun test
✓ 412 pass 0 fail 3.1s
~/api main $
● cloud-box: api@4f2c healthy
mini:~/api $ omo
● Reading migrations/0042_keys.sql
! Needs you: apply to staging?
✓ Applied. 41 tests pass
ubuntu@cloud-box:~ $ tail -f deploy.log
pull api@4f2c migrate restart
api@4f2c healthy in 41s
attached to OmO on mac mini
! apply to staging?
› 1 yes, apply it
01App
Spaces on the left, agents grouped by whether they need you, are working or are done, and split terminals on the right. On a phone the same terminal gets a key bar with ctrl, esc and the arrows. What you see here is the app's own components, live, with sample data.
02Relay
Your phone and your machine agree on keys with a Noise IK handshake, then seal every record with ChaCha20-Poly1305 and rekey every 220 messages. The relay, on Cloudflare Workers, matches the two ends by host id and copies bytes between them. It keeps no accounts and stores no messages.
~/app $ git status
no key, no plaintext, no storage
~/app $ git status On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean
03Pairing
The pairing secret lives in the link's #fragment, which a browser never sends to any server.
No camera handy? Type the 8-character code instead.
CPace keeps the relay from testing guesses offline, and the host answers at most 10 tries
per offer.
~ $ doriface-host pair
04Mesh
Put your laptop, a build box and a VPS in one mesh and each one shows the others in its sidebar. Membership is a set of records every member signs with its Ed25519 key and syncs over the same encrypted relay. The relay stores none of it and can forge none of it.
hc lists the other three as machines.
mesh pair on laptop invites a fifth machine; pi asks to join.
admit record syncs, and every member dials
pi.
mesh revoke vps --compromised: every member closes its sessions and refuses its
keys.
A machine joins after you approve it on a member, unless you opened the invite with --auto.
For seven days every member shows who joined, who invited it and its fingerprint.
Each member adds every other member as a herdr machine on its own, so their spaces and agents appear under their names.
With --compromised, one record removes a member and every machine it admitted. Its sessions
close and its keys are refused on every path.
05Platforms
Terminals render with libghostty, built from Ghostty's own source and compiled to WebAssembly, so a pane on your phone draws the same cells as on your desktop.
Starts the host and herdr-core on this computer, installs herdr-core for you when it is missing, and offers this computer to your phone.
Open app.doriterm.com, pair, and every pane of every machine is there. Nothing to install on a borrowed computer.
Install it from the browser as an app. A key bar puts ctrl, esc and the arrows under your thumb, so you can answer an agent from anywhere.
$ doriface-host pair # a QR code, a link and a code for your phone
$ doriface-host mesh pair # invite another machine into your mesh
$ doriface-host mesh join <code> # on that machine: ask to join
$ doriface-host mesh revoke <member> # remove a member everywhere
doriterm is open source under AGPL-3.0, and the wire format it is built against is published, relay section included.