An Agent Only Lived in Text
However smart the agent, all it could do was answer. Opening a terminal, editing a file, watching the screen, moving the mouse — that was still on you. We needed an agent that could reach into the device directly.
Zyris is an expandable protocol. A node dials a server over one websocket and announces typed capabilities—terminal, files, input, screen, browser—as tools. Attacca is the reference deployment, calling those tools straight from an agent.
{
"kind": "hello",
"protocol": { "major": 1, "minors_supported": [0] },
"capabilities": ["terminal", "file_io", "screen_capture"]
}How It Works
However smart the agent, all it could do was answer. Opening a terminal, editing a file, watching the screen, moving the mouse — that was still on you. We needed an agent that could reach into the device directly.
A Zyris node dials a server over one websocket and announces its capabilities. The protocol is direction-symmetric — once the handshake is done there's no client or server, either peer can call the other, open streams, or change what it offers mid-session. Terminal, screen, whatever a node announces becomes a tool an agent can call — immediately.
This protocol met Attacca as its reference deployment. The tools a node announces become tools an agent can call directly, and the server announces attacca_api back so the node can drive agent sessions itself.
Out-of-the-Box Tools
terminal, file_io, input, screen_capture, browser_chrome — the standard capabilities ship ready to use, so an agent can run commands, touch files, and see and control the screen from day one.
Device-Grant Auth
Run a node and it prints an 8-character code. Enter that in Attacca and approve only the scopes you want — no secret ever has to travel between machines.
Two-Way Calls
Once the handshake is done, there's no client or server. A node announces its tools while also consuming the attacca_api the server announces back — able to drive agent sessions itself.
Build a Node
Zyris ships as a Rust library. Put #[zyris::capability] on a trait and the macro generates the descriptor, a server wrapper and a client — and doc comments become the tool descriptions a model reads.
Take it by git until the next crates.io release. enroll adds the 8-character-code flow that issues a credential.
[dependencies]
zyris = { git = "https://github.com/attacca-cc/zyris-protocol", features = ["enroll"] }One trait is one set of tools. Give it a name and a version, and write the doc comments for the model that will read them.
#[zyris::capability(name = "hello", version = 1)]
pub trait Hello {
/// Return a random friendly greeting, optionally addressed to `name`.
async fn greet(&self, name: Option<String>) -> zyris::Result<Greeting>;
}Build a node, put the capability on it and connect. connect keeps the link up across drops.
let link = Node::builder()
.name("my-node")
.kind(NodeKind::Service)
.capability(HelloServer(HelloWorld))
.build()?
.connect(zyris::DEFAULT_SERVER_URL, std::env::var("ZYRIS_CREDENTIAL")?)
.await?;
link.wait_closed().await?;cargo run -p zyris --example hello --features enrollWith nothing configured it enrols against attacca.cc and prints an 8-character code. Type it into Attacca on any device with a browser, ask an agent to call hello.greet, and the node answers "Hello World".
Use Cases
From terminal to screen, input, and browser — see what an agent can actually do with just the standard capabilities.
An agent runs shell commands through a node's terminal capability — builds, deploys, and scripts, right on your machine.
screen_capture hands the agent a look at your screen; the input capability lets it move the mouse and type — GUI automation and desktop tasks, done for you.
The browser_chrome capability opens a real Chrome window, fills forms, and clicks — handling web-based workflows end to end.
Products
You do not have to build a node yourself. Desktop, terminal or server — pick the one that fits what you want to connect.
The desktop app that keeps your computer connected to Attacca
Sits in the tray and hands your agents this machine's shell, files, keyboard, mouse and screen — plus the local MCP servers you already run. For Windows and Linux.
A coding agent, straight from the terminal
One line to install. Builds for Windows, Linux and macOS — the agent runs on Attacca, the tools run on your machine.
A container node that puts Docker and Kubernetes servers on Attacca
Watches system, Docker and Kubernetes state from inside a container, and when something it guards goes down, calls in an agent to diagnose and fix it.