🖼️ a r t a
agent runtime terminal application
Terminal workspace manager for concurrent AI coding agent usage. Enables parallel agent usage over a single SSH session.
Organize projects in a sidebar, manage multiple tmux or zellij-backed sessions, and switch between them — all from a single binary. Close, reopen and continue from where you left off.
┌────────────────┬─────────────────────────────────────────────┐
│ -------------- │ ─────────────────────────────────────────── │
│ │ $ ~/projects/my-app │
│ 🖼 a r t a │ > claude │
│ │ ╭─────────────────────────────────────╮ │
│ -------------- │ │ claude> fix the login bug │ │
│ ▼ my-app (2) │ │ ... │ │
│ session-1 │ ╰─────────────────────────────────────╯ │
│ session-2 * │ $ npm test │
│ ▶ api-svc │ ✓ 42 tests passed │
│ ▼ fe-web1 (1) │ │
│ session-1 * │ $ █ │
│ │ focused ─────────────────────────────────── │
│ ---------------│ interactive | v0.2.1 | MIT │
│ ctrl+space run │ [] 1 claude * - 2 zsh 2026-04-02 18:27│
│ J/K reorder │ │
└────────────────┴─────────────────────────────────────────────┘
sidebar tmux session (full PTY)
Features
- Project sidebar — add, rename, reorder, and remove projects
- Tmux or Zellij sessions — each session is backed by tmux (default) or zellij, with an agent window and a terminal window
- Configurable coding agent — defaults to
claude, but can be set tocodex,gemini,opencode, or any command - Session persistence — quit ARTA, sessions keep running. Reopen and reattach instantly
- Session restore — remembers and reopens your last active session on startup
- Multiple profiles — use
ARTA_CONFIG_ROOTandARTA_SESSION_PREFIXenv vars to run independent ARTA instances with separate configs and sessions - Open IDE — press
oto launch your configured IDE (e.g.,webstorm .,idea .) for any project - Project configuration — press
cto configure project name, path, or open command via a navigable menu - Bell notifications — focus-aware bells via a Claude Code
Notificationhook (auto-installed into~/.claude/settings.json); shows a sidebar indicator and plays a sound for unfocused sessions, reliable across tmux and zellij - Nerd Font detection — auto-detects and uses icons when available, falls back to Unicode
- Full-width input panel — tab-complete paths, browse directories, rename with full cursor support
- Single binary — built with Ratatui + tui-term + portable-pty
Install
arta needs tmux (the default backend) or zellij. The Homebrew install pulls in tmux automatically; for other install methods, install one yourself — see Requirements.
Homebrew (macOS, Linux)
Shell installer (macOS, Linux)
|
Cargo
mise / ubi
From source
# Install Rust: https://rustup.rs/
The binary is at target/release/arta. Add it to your PATH or copy it somewhere convenient.
Requirements
- macOS or Linux
- Rust 1.85+ (via rustup)
- tmux (default) or zellij
- A terminal emulator (iTerm2, Ghostty, Kitty, etc.)
- Optional: a Nerd Font for icons
- Optional: disable macOS Ctrl+Space shortcut (System Settings → Keyboard → Keyboard Shortcuts → Input Sources)
Usage
Prefix key (Ctrl+Space)
Ctrl+Space is the prefix key. Press it from any focus, then press a command. The sidebar footer shows available commands while the prefix is active.
After Ctrl+Space |
Action |
|---|---|
← / → |
Change focus (sidebar / terminal) |
n |
New session |
o |
Open IDE (runs configured open command) |
r |
Rename project or session |
a |
Add project (path → name → open command) |
c |
Configure project (rename, path, open command) |
d |
Delete selected item (project or session) |
g |
Copy GitHub link to clipboard |
q |
Quit (sessions survive) |
Q |
Clean exit (kill all sessions) |
The status bar shows interactive or run mode. When Ctrl+Space is pressed, it switches to run mode with "awaiting command..." until a key is pressed.
Sidebar-only keys
These keys work only when the sidebar is focused (no prefix needed):
| Key | Action |
|---|---|
j / k |
Navigate up/down |
J / K |
Reorder project or session |
tab |
Expand/collapse project |
enter |
Select session |
l |
Focus terminal |
You can also click on either pane to switch focus.
Note: Ctrl+Space requires disabling macOS input source switching (see Requirements).
Inside the terminal
Each session is a tmux (or zellij) session with two windows:
- agent — launches your configured coding agent (
claudeby default) automatically - terminal — a plain shell
Switch between them with your tmux prefix (e.g., Ctrl+A 1 / Ctrl+A 2) or zellij tab switching.
Input panel
When adding a project or renaming:
| Key | Action |
|---|---|
Tab |
Autocomplete path |
Up / Down |
Browse directory listing |
Enter |
Confirm / descend into directory |
Esc |
Cancel |
Left / Right |
Move cursor in text |
Configuration
ARTA stores its configuration and workspace state under ~/.arta/ by default.
Config file (~/.arta/config.yaml)
All fields are optional — ARTA uses sensible defaults if the file is missing or incomplete.
# The command launched in the agent window of new sessions (default: "claude")
coding_agent_command: claude
# Terminal multiplexer backend: "tmux" (default) or "zellij"
multiplexer: tmux
# Custom script to run instead of the default session creation.
# Receives two arguments: <session_name> <project_directory>
# When set, coding_agent_command is ignored (the script controls what runs).
# The multiplexer setting is still used for attaching to the session.
# multiplexer_init_script: /path/to/your/script.sh
Environment variables
| Variable | Default | Description |
|---|---|---|
ARTA_CONFIG_ROOT |
~/.arta/ |
Config directory. Set to a different path for separate profiles. |
ARTA_SESSION_PREFIX |
(empty) | Prefix added to session names. Prevents collisions between profiles. |
Multiple profiles
Run independent ARTA instances with separate configs and sessions:
# Work profile
ARTA_CONFIG_ROOT=/.arta-work ARTA_SESSION_PREFIX=work
# Personal profile
ARTA_CONFIG_ROOT=/.arta-personal ARTA_SESSION_PREFIX=personal
Each profile has its own config.yaml, workspace.yaml, and distinctly-named multiplexer sessions (arta_work_t_* vs arta_personal_t_*).
Migration from older versions
On first run, ARTA automatically migrates your workspace from the legacy location (~/.config/arta/data/workspace.json) to the new location (~/.arta/workspace.yaml). Existing tmux sessions are also renamed to the new naming scheme.
Architecture
ARTA (Rust binary)
├── Config (YAML, ~/.arta/config.yaml)
│ └── Coding agent command, multiplexer choice, init script
├── Sidebar (ratatui widget)
│ └── Project & session management
├── Input Panel (ratatui widget)
│ └── Full-width bottom panel for path/rename input
├── Terminal Panes (one per session, via portable-pty + tui-term)
│ ├── vt100::Parser processes PTY output on background thread
│ └── tui-term::PseudoTerminal renders to ratatui buffer
├── Multiplexer (tmux or zellij, configurable)
│ └── One session per ARTA session
│ ├── Window/tab "agent" → auto-launches coding agent
│ └── Window/tab "terminal" → plain shell
└── workspace.yaml (~/.arta/)
└── Projects, sessions, active session & per-project config
How it works
- The sidebar manages projects and sessions in
~/.arta/workspace.yaml - Each session maps to a multiplexer session named
arta_{prefix?}_{t|z}_{project}-{n}(e.g.,arta_t_myproj-1) - Each session has its own PTY (via
portable-pty) attached to its multiplexer session - A background reader thread per session feeds PTY output into a
vt100::Parser - Switching sessions just changes which parser's screen is rendered — instant, no teardown
- Bell notifications are driven by a Claude Code
Notificationhook (merged idempotently into~/.claude/settings.json) that touches a marker file under~/.local/share/arta/bells/for the current multiplexer session; ARTA polls that directory and raises attention for unfocused sessions. Raw PTY BEL is also handled as a fallback. - Key input is written directly to the active PTY's master fd — no message queue, minimal latency
- Session restore — the last active session is saved to
workspace.yamland auto-reopened on startup; falls back to the first alive session if the saved one is gone - When you quit (
q), multiplexer sessions stay alive — reopen ARTA to reattach - When you clean exit (
Q), all tracked sessions are killed
Known Issues
Ctrl+Space captured by macOS
Disable in System Settings → Keyboard → Keyboard Shortcuts → Input Sources.
Platforms
| Platform | Status |
|---|---|
| macOS | Works |
| Linux | Works |
| Windows + WSL | Works (it's Linux) |
| Windows native | Not supported (no tmux/zellij) |
License
MIT. PRs are welcome.