Architecture
Your sessions should not live in the window
Closing a terminal tab kills whatever was running in it. That is a decision, not a law — and NabuCode makes the opposite one.
5 min read
Every terminal you have used ties the life of a process to the life of a window. Close the tab, and the thing running in it gets a hangup. For thirty years that was the right trade: the process was a shell, the shell was you typing, and when you stopped typing there was nothing left to preserve.
Coding agents broke that assumption. An agent working through a refactor is not waiting on your keystrokes — it is working, for minutes at a time, and it will keep working whether or not you are looking. Tying it to a window means the window becomes something you cannot close, which is a strange thing to be true of a window.
The daemon owns the session
So NabuCode does not run sessions in the app. A Rust daemon called nabud owns the PTYs and all the persistent state. The desktop app is a view over that daemon, and so is the phone app — both speak the same protobuf protocol, and neither of them owns anything.
The consequence is small to describe and large to use: closing a tab detaches from a session instead of ending it. Killing is still available, but you have to ask for it. The default stopped being destructive.
What that buys
- Quit the app mid-run. The agent keeps going; reopen and you are back where you were.
- Pick a session up from another device while it is still running — the phone app attaches to the same daemon.
- Crashes stop being expensive. The UI is the part that crashed, and the UI is the disposable part.
- Updating the app no longer means finding a moment when nothing is running.
The cost
This is not free architecture. A daemon is a second thing to install, a second thing to version, and a second thing that can be running when you did not expect it. State that outlives the window is state you can leak, so sessions need a lifecycle you can actually see and reason about — which is why the grid shows five statuses per pane rather than a spinner.
The reason to pay that cost is simple: the alternative is a window you are not allowed to close.
There is a wider principle here, and it is the one the whole suite is built on. Local-first does not mean your data merely happens to be on disk. It means the thing that owns your work runs on your machine, under your control, and keeps running whether or not any particular piece of UI is pointed at it.