Gyred

An AI agent control room as a native desktop window, rendered without a browser (Rust + Dioxus). One place for every session: what is waiting, what is working, what is planned and the whole conversation. The same code also compiles to other platforms.

Gyred
TL;DR

A native desktop window for running many AI agent sessions at once, built in Rust + Dioxus and rendered without a browser. Every session in one place - what is waiting for a decision, what is working, what is planned, plus the full conversation with each - instead of dozens of tabs and constant switching.

Overview

Gyred is the desktop incarnation of the Gyre agent control room. Gyre is one place to run many sessions at once: you see them, talk to them, plan the work and get a signal when something needs a human. This case study covers the desktop client - the window this control room lives in all day, next to the rest of a developer's tools.

A core principle of all of Gyre: the panel never owns a session. Whatever you see in the window, you can also open in your own terminal - Gyred is a convenient view onto sessions, not a cage around them. There is a separate phone client for the same workflow; the desktop bets on information density and the keyboard at a desk.

The ten-tab problem

When you run one agent session, a browser tab is enough. When you run ten, the tab turns into a trap. You cannot see at a glance which session has stalled and is waiting for your decision and which is still grinding on. You switch back and forth, lose the thread and miss the moment an agent got stuck on a question - and that moment is the most expensive one, because the session just sits there doing nothing until you answer.

Gyred flips that layout. Instead of one window per session - one window for all sessions, with a clear split between what needs a human now and what can quietly keep working. The list on the left shows the state of the whole; the panel on the right shows the full conversation with the selected session. You do not have to remember where the one that is waiting went; it surfaces on its own.

That is the difference between managing your attention and scattering it. Ten tabs demand that you keep checking each one yourself. One window with a clear state does that for you and frees you from standing guard.

Rust and Dioxus instead of a second browser

An app meant to run in the background all day and refresh the state of many sessions live cannot eat resources like a second browser. So instead of Electron we went with Rust and Dioxus. Dioxus lets you write the interface in the component style familiar from the front end, but it compiles to a native binary - without shipping a whole Chromium engine just to draw a list and a text field.

In practice that means a window that starts instantly and keeps a low memory footprint even with a dozen sessions open. For a tool meant to stay on all the time, that is not cosmetics - it is the difference between a program you forget about and one that warms your laptop in the background.

Startup memory footprint (illustrative, MB)

Dioxus client
55
Same thing in Electron
260

One core, many incarnations

Gyred is not a separate program next to the panel and the mobile app. The session core - the connection, the event queue, each conversation's state, the rules for what needs a human - lives in a Rust layer independent of whatever draws it. The Dioxus view is a shell over that core, wired to it through shared types, not a separate API to itself.

The same decision brings a bonus that fell out along the way: the component code also targets other platforms. You write the view once, and the session logic is a single one across every incarnation of Gyre. A new rule or a new session state is caught in the core and shows up everywhere in the same commit, instead of being rewritten three times and broken three different ways.

1
window for all sessions
3
session states: waiting, working, planned
0
wrapped browsers

Whoever waits goes to the top

The whole value of a window like this comes down to one thing: never missing a session that is waiting for you. So sorting does not go by creation time but by whether a session needs a human. One agent blocked on a question belongs at the top of the list, not buried among ten that are still working.

session.rs · rust
enum SessionStatus {
    Waiting,
    Working,
    Planned,
}

fn needs_human(status: &SessionStatus) -> bool {
    matches!(status, SessionStatus::Waiting)
}
➜
Tip

A simple rule that changes how the work feels: sort sessions by whether they are waiting for a human, not by creation time. The queue arranges itself, and you only look at the top of the list instead of scanning the whole thing for the one that stalled.

1
Session core in Rust

the connection, the event queue and each session's state in a layer independent of the view.

2
View in Dioxus

the session list and the full conversation as components, wired to the core through shared types.

3
Priority for the waiting ones

sessions waiting on a decision land at the top, the rest below, so nothing gets lost.

4
One desktop binary

compiled to a native window that starts fast and keeps a low memory footprint.

What the final result is

Instead of hunting through tabs you get one screen that shows at once where your turn is. You answer a session straight from the window, go back to your own work, and the agents keep going. Less switching, fewer missed decisions, fewer sessions left standing in a void just because you did not notice the question.

And because it is a native binary, not a wrapped page, the window behaves like the rest of the programs on the desktop: it starts instantly, does not weigh on memory and does not get lost in a thicket of tabs. The Rust core is a single one for every incarnation of Gyre, so the desktop is not a separate project to maintain - it grows alongside the panel and the mobile app.

One window that shows at once whose turn it is - the rest lines up in the queue on its own.

More projects

More work from the same category - see how we tackle similar challenges.

Have a similar project?

Get in touch - a quote is free and comes back within an hour.