GitHub - sethdeckard/atria: TUI for managing multiple AI coding agents in terminal tabs and panes.

6 min read Original article ↗

CI

A single dashboard for all your AI coding agents — wherever they run.

atria discovers your agents, shows their real-time status, and lets you send prompts from one place. It works with your existing terminal setup instead of replacing it.

atria demo

Why atria

Keep your tmux workflow

You already have agents running in tmux windows? Keep doing that. Enable the tmux integration and atria discovers them, shows you which ones need input, and lets you send prompts — all without changing how you work.

Keep your terminal tabs

Same for iTerm2, Kitty, and WezTerm. Keep using tabs and panes the way you always have. atria finds your agents, tracks their status, and makes it easy to jump between them.

Just want a simple multiplexer?

Don't use tmux or a fancy terminal? No problem. atria's built-in terminal launches and manages agents with zero setup. Just run atria and go.

Supported Agents

  • Claude Code (claude)
  • Codex (codex)
  • OpenCode (opencode)
  • GitHub Copilot (copilot)

Quick Start

  1. Install:

    brew install sethdeckard/tap/atria
    

    Or with Go:

    go install github.com/sethdeckard/atria@latest
    
  2. Run:

  3. On first run with no config, atria opens a setup wizard to configure watch directories, default agent, and optional integrations. You can also open it later with S (when the agent list is empty) or from settings (I).

atria scans your watch directories for projects and lets you launch and manage agents in each one. Configuration is stored at ~/.config/atria/config.toml.

Requirements

  • macOS or Linux
  • At least one supported agent on $PATH: claude, codex, opencode, or copilot

Configuration

Create or edit ~/.config/atria/config.toml:

# Directories to watch for projects
watch_dirs = ["~/projects"]

# Default agent to launch: "claude", "codex", "opencode", or "copilot"
# default_agent = "claude"

# Terminal dimensions for built-in PTY sessions
# pty_cols = 120
# pty_rows = 40

# Check for updates on startup (default: true)
# update_check = true

# Data directory for session state and debug logs (default: ~/.config/atria)
# data_dir = "~/.config/atria"

Most settings can also be configured interactively from the settings screen (I key).

Usage

Key Action
j/k or arrows Navigate agents
v Toggle agent screen stream
n Launch a new agent
t Cycle agent type
s Cycle sort column
S Reverse sort / run setup (when empty)
f Focus (switch to) the agent's terminal
B Batch send to multiple agents
Enter Open chat view to send a prompt
I Open settings
Ctrl+R Arm quick response (when stream open + agent needs input)
y / Esc / 1-9 Respond after arming quick response
? Toggle help
Ctrl+\ Return from embedded terminal
q / Ctrl+C Quit

Embedded Terminal

When focusing a built-in PTY agent, atria opens an embedded terminal view with full keystroke forwarding. Press Ctrl+\ to return to the dashboard.

Chat View

Press Enter on an agent to open the chat view. Type a prompt and press Enter to send it. The stream panel shows live terminal output from the agent.

Integrations

Integrations let atria discover agents already running in other terminals and launch new ones as native tabs/windows. They must be explicitly enabled — without them, only the built-in PTY backend is used.

  • iTerm2 — discovers agents in iTerm2 tabs/panes; launches as native tabs when running inside iTerm2
  • Kitty — discovers agents in Kitty windows; launches as native windows when running inside Kitty
  • tmux — discovers agents in tmux windows; launches in a detached tmux session
  • WezTerm — discovers agents in WezTerm panes/tabs; launches as native windows when running inside WezTerm

Enable in config or toggle from the settings screen (I):

integrations = ["iterm2", "kitty", "tmux", "wezterm"]

When an integration is active (i.e., you're running inside that terminal with its integration enabled), pressing n to launch offers a choice between the native terminal (e.g., a new tmux window) and the embedded PTY. When no integration is active, agents launch directly in the embedded PTY.

Each discovered agent is managed through its native integration — focusing an iTerm2-discovered agent switches to its iTerm2 tab, focusing a Kitty agent switches to its Kitty window, while focusing a PTY agent opens the embedded terminal view.

iTerm2

Communicates via iTerm2's native protobuf-over-WebSocket API on a Unix socket. No external dependencies.

Requirements:

  • iTerm2 with the Python API enabled (Settings > General > Magic > Enable Python API)

Config:

integrations = ["iterm2"]

For cross-terminal discovery (running atria outside iTerm2 while discovering iTerm2 sessions), disable iTerm2's automation auth by creating ~/.config/iterm2/disable-automation-auth. Without this, iTerm2 discovery only works when atria runs inside iTerm2.

Kitty

Communicates via Unix socket using the kitten @ CLI.

Requirements (kitty.conf):

allow_remote_control yes
listen_on unix:/tmp/kitty-{kitty_pid}

Config:

integrations = ["kitty"]
# kitten_path = "kitten"

tmux

Agent sessions are discovered across all tmux sessions. New launches go into your current tmux session by default; outside tmux they fall back to a detached atria session.

Config:

integrations = ["tmux"]
# tmux_path = "/usr/bin/tmux"
# tmux_session = "atria"  # optional override

The tmux default allow-rename on is required for Claude Code's terminal title to propagate. If Atria launches into the detached fallback session, you can interact with those agents directly via tmux attach -t atria.

WezTerm

Communicates via the wezterm cli over a Unix socket (auto-discovered).

Requirements:

  • A running WezTerm instance (the CLI auto-discovers its socket)

Config:

integrations = ["wezterm"]
# wezterm_path = "wezterm"

FAQ

What problem does atria solve?

If you run multiple AI coding agents across projects and terminal sessions, atria gives you a single dashboard to discover them, see their status, send prompts, and switch focus — instead of manually tracking each one.

How is this different from tmux or terminal tabs?

tmux and terminal tabs manage terminals. atria manages agent sessions — it adds status detection, prompt routing, and a unified view on top. See Why atria above.

How does discovery work?

atria detects running agent sessions in supported backends and shows them in the dashboard automatically. If you already have Claude Code running in a tmux window, atria surfaces that session without requiring a relaunch. Enable integrations to discover sessions across iTerm2, Kitty, tmux, and WezTerm — or use the built-in PTY to launch agents directly.

Can atria show sessions from multiple backends at once?

Yes. The dashboard shows sessions from the built-in PTY backend and any active integrations simultaneously.

How does atria detect agent status?

atria reads the bottom of each agent's terminal screen every few seconds and matches against known UI patterns (prompts, spinners, permission dialogs) to classify status as working, idle, needs input, or error.

Which agents are supported?

Claude Code, Codex, OpenCode, and GitHub Copilot — terminal-oriented agents that can be launched and monitored from the command line.

Debug

  • --debug logs screen-read diagnostics to ~/.config/atria/debug.log by default, using metadata-only entries that omit raw terminal contents.
  • --debug-unsafe logs full raw screen contents to the same file and may capture prompts, paths, secrets, and other sensitive terminal output.
  • If data_dir is set in config, the debug log is written to <data_dir>/debug.log.

License

atria is licensed under the MIT License. See LICENSE for the project license and THIRD_PARTY_NOTICES.md for dependency notices.