How it works
One Core
Section titled “One Core”The portable C++ Core parses terminal output, keeps the screen and scrollback, decodes images, decides which rows changed, and checks effects such as clipboard access against the permission policy. Native frontends and the host use that Core. The Emacs and Neovim clients read its replicated state without linking the C++ library.
The host keeps the session
Section titled “The host keeps the session”ubiquitty-host is that Core running as a daemon. It owns a pseudo-terminal for every pane, the programs running in them, their screens and scrollback, and the layout: a workspace of windows, each with tabs, each with a tree of panes. Detach every client and the host keeps the shells running.
The macOS app carries the host inside it and starts it when a session needs to outlive a window. On another machine, the app installs the host over SSH the first time you connect.
Clients are screens
Section titled “Clients are screens”A client keeps a replica of each pane’s screen and draws it with its own renderer: Metal and CoreText on the Mac, iPhone and iPad, WebGL2 in a browser, an Emacs or Neovim buffer, or plain text for ubq. It sends up what you type, its size and its focus. Two clients can show the same session at once, and an agent’s client is held until a person on that session agrees to let it in.
The macOS app and the Linux frontend can also run the Core in-process, for a window whose shell is local to the app. On macOS, sharing a local window hands its shell to the host without restarting it.
Sync between them
Section titled “Sync between them”The Sync protocol carries the session between host and client, over any byte stream: the host’s local socket, SSH, QUIC after SSH has authenticated, a WebSocket bridge for the browser, or the host’s attach bridge for the editor clients.
- Attach. The client says hello with its size and the session it wants, by id or by name, and presents a token if it is an agent or a remote client.
- Checkpoint. The host sends the whole screen once.
- Updates. From then on it sends only the rows and state that changed since a frame the client acknowledged, paced to the link. The host batches changes around coherent frames, with a bounded wait for programs that keep drawing.
- History. Scrollback comes separately, newest lines first and older ones to the depth the client asks for, so a phone on a metered link does not download a day of build logs to show a prompt.
- Reconnect. A returning client presents its retained replica identity. The host sends changes from retained state when possible, or a checkpoint when a fresh base is required. The shell keeps running on the host.
Numbered input and receipts keep transport delivery distinct from application output. Screen, history and pane metadata travel independently. The Sync protocol page links the specification for client implementers.
Where to read more
Section titled “Where to read more”- Multiplexer and sessions: what the host keeps, and what survives what.
- Security and permissions: how effects are checked, by who drove them.
- Platforms: every client, and what each one draws.
Ubiquitty and this site are copyright © 2026 Stanislav Yaglo. Ubiquitty is licensed under the Apache License 2.0.
Apple, iPad, iPadOS, iPhone, Keychain, Mac, macOS, Metal, Swift and Xcode are trademarks of Apple Inc., registered in the U.S. and other countries and regions.