Skip to content

Repository files navigation

Agent Window

Agent Window is a UNIX-philosophy local interface for macOS that watches, from outside, a workspace where multiple Agent CLIs are running.

Each Agent CLI launches normally inside a tmux pane. It never calls a model through an API or SDK. It uses only the capabilities each CLI already has.

Design philosophy · 日本語

Agent Window hero 1 Agent Window hero 2


Setup

The current implementation targets macOS.

Requirements

  • python3
  • tmux
  • cargo
  • tauri-cli
  • Xcode Command Line Tools

./setup/preflight checks for missing dependencies and the commands needed to install them. The script never installs anything itself.

Install whichever Agent CLIs you plan to use individually, and authenticate each one the normal way.

Launch

Run the following from the repository root.

./tauri_app/tauri_start

This builds and launches the Tauri App. The Hub is started by the Tauri App and uses port 8788 by default.

Use

Start a session

Choose a workspace from New Session in the Hub.

A unified log continues across changes in session name, workspace, and participating Agents. New Session starts another log; when to do that is up to the human. To rename a session, rename its ~/.agent-window/session/{session_name} folder. To change its workspace, archive it, reload the Hub, edit workspace in its .meta file, and revive it. Renaming a session does not restart its chat server or change its URL.

Archive, revive, and delete sessions from the Hub.

Add an Agent

Add / Remove Agent in the top right adds or removes Agents from the session. Running more than one instance of the same CLI Agent produces instance names such as Claude-2.

  • Terminal — opens a compact, pane-switching tmux terminal directly (the tmux socket name is fixed as agent-window)
  • Finder — opens the current workspace in Finder

The separate reload button beside it hard-reloads the GUI server. If the source code has changed, the running server is replaced with the new implementation.

Menu

Send

The input field is normally minimized to leave more room for the chat, and expands with the O button at the bottom of the screen or by pressing the scroll wheel. Which Agent icons are selected determines who a message is sent to.

Text in the input field is entered directly, via tmux send-keys, into the pane running the selected Agent CLI. It is not converted into an Agent Window-specific message format, so slash commands and other native CLI commands also pass through the same input field. A failed send is detected as send_error, but success is not notified. Minimal controls that CLIs don't offer by default — restarting a pane, interrupting from mobile — are wired in by Agent Window.

Typing @ searches files in the workspace. Files can also be attached with the plus button or by drag-and-drop. Attached files are saved to <workspace>/.agent-window/uploads/, and their path is passed to the Agent as ordinary text.

Read

The GUI displays the unified log as a single timeline across the human and all Agents.

Messages continue in the same unified log as CLIs switch, Agents run concurrently, and processes restart. Changes to the session name or workspace leave past entries unchanged.

The unified log's substance is an append-only JSONL file.

~/.agent-window/session/{session_name}/.log.jsonl

It's also reachable from the current workspace via a symlink. It isn't a database closed inside Agent Window — it survives Agent Window stopping, and reads as an ordinary file.

The unified log isn't each CLI's detailed execution history. It's a projection, reduced to a granularity both humans and Agents can read across.

Tool calls are streamed to the screen while running, for a sense of progress, but are not kept in this timeline.

Each CLI's execution record is watched from outside, and the process/log-path mapping is re-resolved whenever necessary. So the CLI process's lifespan and the unified log's lifespan don't have to match.

Each entry records the path of its source native log, and its position within it.

Watch the workspace

Git and workspace state are watched and projected onto the right pane. File search also uses the observed workspace information.

Clicking a file opens it in the macOS default application. The desktop version of Agent Window does not reimplement a file viewer that already exists elsewhere. Mobile can't rely on that, so a bottom-sheet-style built-in viewer opens instead.

Clicking an uncommitted change opens it in git's configured diff viewer (git difftool).

Connect Agents to each other

An Agent can send a message directly to another Agent in the session with agent-send. Place SKILL.md at the designated location if needed — it is the only SKILL Agent Window has committed to.

agent-send <target> <message>

agent-send is a thin wrapper around the same tmux send-keys a human uses. It only resolves the destination and attaches a prefix such as [From: Claude].

Here, success only means the input was delivered to the runtime. It doesn't mean the target Agent understood it or acted on it.

Give a name

Agent Window's one and only unnecessary feature.

agent-send name <target> <name>

An Agent can be given a name that works within the session. The name is used only as an agent-send address and in the [From: ...] prefix; existing instance names and log identities are unchanged.

Use it from a phone

You can connect to the same screen from a mobile device on the same LAN.

First, start the Tauri App and Hub in HTTP mode. While they are running, run:

./setup/pwa/enable

This script checks the running Hub and prepares mkcert and a local certificate. mkcert installs a local CA on the system.

From then on, ~/.agent-window/state/pwa/enabled is detected at launch and Agent Window starts in HTTPS mode.

./tauri_app/tauri_start

Send mkcert's rootCA.pem to the device that will connect, install the certificate profile, and enable trust for it. Then open either of the following in Safari:

https://<Mac LAN IP>:8788/
https://<Mac name>.local:8788/

Add it to the Home Screen to use it as a PWA.

For reaching Hub from outside the LAN, see external-access/README.md.

Mobile UI, light 1 Mobile UI, dark 1 Mobile UI, light 2 Mobile UI, dark 2 Mobile UI, light 3 Mobile UI, dark 3 Mobile UI, light 4 Mobile UI, dark 4

Supported CLIs

Claude, Codex, Antigravity, Cursor, Grok.

The receiving side needs to know where each CLI's native log lives and what format it's in, so there is per-CLI handling. The sending side is the same for every CLI. It only enters text into a pane, so there is no CLI-specific message protocol.

License

0BSD. Do whatever you want with it.

About

A macOS interface built on UNIX philosophy. It operates CLIs running directly in tmux, projecting reality across processes and workspaces into a single unified log. Semantics are returned to human perception, not owned by the app. It implements only what's unavoidable, nothing more.

Topics

Resources

Stars

7 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages