Thin control plane · macOS and Linux
Your AI second brain, on a Linux VM you actually control.
Torio creates the Linux VM, runs a Hermes backend on the VM's own loopback, tells you in one command whether the whole stack is healthy, and gives the model access to exactly the repositories you listed. You open the connection, you hold the credentials, you decide what gets committed.
The pieces, and who owns them
Torio is not the AI, not the VM, and not the chat window. It is the layer that brings those three into a known-good state and then gets out of the way. Six moving parts, split across the two machines:
On your host
ssh -LThe one and only route from the host to the backend. You open it in a terminal you can see, and close it when you are done.localhost:19119 → the VM's 127.0.0.1:9119
Inside the Linux VM
hermes serve process, run as a user systemd service so it survives logout and restarts on its own. It binds 127.0.0.1 of the guest: nothing on your network, and nothing on your host, can reach it except through your tunnel.The VM is a Lima instance. Torio creates it from a pinned template, installs pinned versions of what the backend needs, and can reconcile it later without touching your data — the same run twice changes nothing the second time.
What a session looks like
First run is a short, ordered sequence. After that, torio serve status is the one to remember: it reports the systemd unit, the loopback endpoint and the Hermes version, so a backend that stopped answering names itself instead of leaving you to guess.
$ torio vm init # create the VM from a pinned template
$ torio vm bootstrap # install and verify what the backend needs
$ torio serve install
$ torio serve start # backend up on the VM's own loopback
$ torio serve status # and prove it answers
Backend ready on http://127.0.0.1:9119/api/status
systemd: active (active=true, enabled=true)
endpoint: 200 (ready=true)
$ torio brain init # your private, searchable Markdown vault
$ torio project add my-service https://github.com/you/my-service --use
— then, in a second terminal you leave open —
$ ssh -L 19119:127.0.0.1:9119 … # your tunnel; now Desktop can connect
From there you point Hermes Desktop at http://127.0.0.1:19119, paste the session token the backend requires, and work. On the code side the loop is yours end to end: edit or ask for edits, run a check that reads rather than writes, read git diff — and when you decide something should leave the VM, torio project shell gives you a session that can push and takes the capability back when you exit.
Projects are a list you keep
The model can only see repositories you have registered. That list is a plain file you own: each entry names a repository and where its clone lives on the guest, and it holds no credentials of any kind. Adding a project clones it into the VM and registers it with Hermes; nothing is discovered, scanned, or picked up automatically because it happened to be on disk.
Read access to a private repository is your job, set up by you on the guest. Torio never stores a token, never prompts for one, and never passes one to the model — a workspace it prepared has no push credentials in it at all.
What Torio will not do
The narrowness is the point. Torio never holds or prompts for a credential — the one it forwards is your SSH agent, into a session you opened, for as long as you keep it open. It never opens a tunnel or exposes a port beyond the guest's loopback. It never commits, pushes, merges, or tags — those are yours, always. It never deletes or re-images a VM, and it takes no data back out of one. And it is not an agent platform: no task queue, no dispatcher, no fleet of autonomous workers running while you sleep.
The rest of these docs
- TutorialsThe guided end-to-end run, complete on one page. Start here.
- How-to guidesOne task at a time, once you are set up: the tunnel, the session token, Desktop, providers, attaching repositories, pushing, your own editor, and troubleshooting.
- ReferenceEvery
toriocommand, exit codes, and the fixed boundaries. - ExplanationWhy Torio is narrow, and why credentials and Git writes stay human-only.