Aether

Your coding agents, side by side, in one native window.

Aether is a desktop workspace written in Rust. It drives the agent CLIs you already use and keeps their Git worktrees, terminals and files in the same window, so you can run five agents without losing track of any of them.

macOS 12+Linux x86_64 and aarch64Source opens soon

Illustration of the session workspace: a lead Claude Code chat has started a Codex child and an OpenCode child, each on its own worktree branch. The OpenCode child is waiting for approval.

Uses the CLIs you already pay for

Aether does not ship a model or resell tokens. Each agent chat is a live session of a real CLI, started in your project folder, so your subscription, settings, skills and MCP servers come with it.

  • Per chat pick the provider, the model, the effort and the access mode the CLI offers: Ask, Auto-edit, Read only or Full access.
  • While it works steer the running turn or queue the next message. Approvals and questions from subagents reach you too.
  • After a restart chats pick their sessions back up, with drafts and layout where you left them.
How Aether connects to each provider
ProviderHow Aether talks to it
Claude Codeclaude -p with stream-json over stdio
Codexcodex app-server
OpenCodeone shared opencode serve and its event stream
Pipi --mode rpc, NDJSON over stdio
Antigravityagy -p
OpenRouterHTTP API, for direct chats that need no project

One lead chat, many child agents

Turn on Lead for a chat and its CLI gets five tools over MCP. The lead can start children on other providers, talk to them and stop them. Each child’s result comes back to the lead on its own, so nothing polls.

  • The MCP server is Aether itself, run as aether mcp and wired into the CLI at launch. No config file to write.
  • Up to 8 children at once by default. max_children in settings goes from 1 to 50.
  • Children are ordinary chats. Open one in a pane and take over whenever you want.

How orchestration works

Tools a lead chat can call
list_agents
See the children this lead has started and their state.
spawn_agent
Start a child chat on any CLI provider, with an optional idempotency key.
message_agent
Send a running child a follow-up.
read_agent
Read a child’s transcript so far.
stop_agent
Stop a child that is going the wrong way.

Panes go where you need them

Split a session right or down, float it over the workspace, or detach it into its own desktop window. A moved session keeps its draft, scroll position, running turn and pending questions.

ManualPanes stay where you split and drag them
StackFirst pane left, the rest stacked right
ColumnsSide by side, equal widths
GridRows and columns
MonocleOne pane, the rest behind tabs

Three chat layouts

Tabbed keeps chats in top tabs. Sidebar docks the Agent, Explorer, Terminal and Browser panel beside the chat and lets it collapse. Split keeps that panel docked. Layouts, window positions and drafts restore when you reopen the app.

Keyboard first

Focus the pane in a direction
⌘⌥Arrow
Cycle tile layout
Ctrl⌥L
Float or dock the pane
Ctrl⌥F
Make it the main pane
Ctrl⌥Enter
Command palette
⌘K

On Linux, ⌘ is Ctrl and ⌥ is Alt.


Everything the agent touches, in the same window

Review what an agent changed, run what it wrote and open the file it mentioned without switching apps.

Git and worktrees

Give a chat its own worktree from the composer. Aether creates an aether/<slug>branch from the prompt on first send, never reusing a branch or folder. Sidebar rows show the branch, changed files and ahead or behind counts. Stage, diff, commit and push from the Changes panel.

Terminal

A global terminal that survives page changes, plus one for each project or worktree. tmux and Neovim keep running with the drawer closed. Ctrl` toggles it.

Explorer and editor

File tree, tabs, Quick Open ⌘P and workspace search⌘⇧F. A file path in an agent reply opens at its line.

Agent manager
Lists Claude Code, Pi and OpenCode agents started from a terminal or tmux, shows their state, and opens them in Aether.
Dictation
Speak into the composer. Speech becomes text on this device after a one-time 141 MB model download. English only.
Notes
Markdown notes in ~/notes with search, templates, archive, trash and manual Git sync. Edit in Aether or in Neovim over tmux.
Watch list
Pin chats and terminals to one corner button, then peek at them and reply from any page.
Usage
Context and quota gauges in the composer, plus a usage history page.
Browser and images
A browser panel on the system web view, and an image viewer with zoom, pan and pinch.
Themes
Catppuccin, Rosé Pine, Gruvbox, Solarized, Nord and Dracula, any installed UI font, and window opacity.
Skills
One page for the SKILL.md folders of Claude Code, Codex, OpenCode, Antigravity, ~/.agents and Aether itself.

Aether is one Rust binary drawn with GPUI, the GPU-rendered UI framework behind the Zed editor. No Electron. Agents run as ordinary processes on your machine.

  • No Aether account. Nothing to sign in to. Your CLIs keep their own logins.
  • Local storage. Chats live in aether.db, a SQLite file in your config folder. Attachments are copied next to it.
  • Real packages. A DMG for macOS, a tarball or .deb for Linux, each with a SHA-256 checksum.

Questions people ask first

Does Aether come with its own model?

No. Agent chats run the CLIs you have installed and signed in to, under your own subscriptions. The only API Aether calls itself is OpenRouter, for direct chats, with a key you provide, stored in the system keychain.

Which platforms does it run on?

macOS 12 or newer on Apple Silicon and Intel, and Linux on x86_64 and aarch64 with glibc. Linux builds use GTK 3 and WebKitGTK 4.1 for the browser panel and need a Vulkan driver. There is no Windows build.

Can it see agents I already started in a terminal?

Yes, for Claude Code, Pi and OpenCode. The Agents page finds them, shows whether they are working, waiting or idle, and can open them in Aether or stop them after you confirm.

Do I have to configure MCP for lead chats?

No. Turn on Lead for a chat and Aether passes its MCP server to that CLI at launch. Antigravity is the one exception: it needs a one-time global registration, which Aether offers to run the first time a lead starts.


Built in the open, soon

The source goes up on GitHub shortly. The docs already cover how Aether is put together, how to build it and how to send a change.

# Rust via rustup; the toolchain is pinned in the repo
cargo run --locked -p aether

# Installer for this OS, written to dist/
uv run scripts/build.py