amux

module
v0.0.20 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 17, 2026 License: MIT

README

TUI for easily running parallel coding agents

Latest release License Go version Discord

Quick start · How it works · Features · Configuration

amux TUI preview

What is amux?

amux is a terminal UI for running multiple coding agents in parallel with a workspace-first model that can import git worktrees.

Prerequisites

amux requires tmux (minimum 3.2). Each agent runs in its own tmux session for terminal isolation and persistence.

Quick start

brew tap andyrewlee/amux
brew install amux

Or via the install script:

curl -fsSL https://raw.githubusercontent.com/andyrewlee/amux/main/install.sh | sh

Or with Go (requires Go 1.26 or newer; contributors should use the patched toolchain pinned in go.mod):

go install github.com/andyrewlee/amux/cmd/amux@latest

Then run amux to open the dashboard.

How it works

Each workspace tracks a repo checkout and its metadata. For local workflows, workspaces are typically backed by git worktrees on their own branches so agents work in isolation and you can merge changes back when done.

Architecture quick tour

Start with ARCHITECTURE.md for the repo-level package map and dependency direction. Then internal/app/ARCHITECTURE.md covers lifecycle, PTY flow, tmux tagging, and persistence invariants, and internal/app/MESSAGE_FLOW.md documents message boundaries and command discipline.

External orchestration: the supported tmux-level contract is documented in docs/ORCHESTRATION.md.

Features

  • Parallel agents: Launch multiple agents within main repo and within workspaces
  • No wrappers: Works with Claude Code, Codex, Gemini, Amp, OpenCode, and Droid
  • Keyboard + mouse: Can be operated with just the keyboard or with a mouse
  • All-in-one tool: Run agents, view diffs, and access terminal

Configuration

Create .amux/workspaces.json in your project to define commands that amux runs for its workspaces:

{
  "setup-workspace": [
    "npm install",
    "cp $ROOT_WORKSPACE_PATH/.env.local .env.local"
  ],
  "run": "npm start",
  "archive": "tar -czf archive.tar.gz ."
}
  • setup-workspace — commands run once when a new workspace is created.
  • run — the command started for a workspace's run script.
  • archive — the command run when a workspace is archived.

Environment available to workspace scripts

setup-workspace, run, and archive scripts run with these variables set, in addition to your normal shell environment:

Variable Meaning
AMUX_WORKSPACE_NAME The workspace name
AMUX_WORKSPACE_ROOT The workspace worktree path
AMUX_WORKSPACE_BRANCH The workspace's git branch
ROOT_WORKSPACE_PATH The source repository root (also shown in the example above)
AMUX_PORT An allocated per-workspace port — bind dev servers here to avoid collisions across parallel workspaces
AMUX_PORT_RANGE The start-end port range allocated to this workspace

Because these commands come from the repository, amux runs them only after you trust the repo. The first time a repo's .amux/workspaces.json would run (and every time its contents change), amux records the approved content of the file; until then those project-supplied scripts are skipped and you are notified, rather than executing arbitrary commands chosen by the repo's author. Editing .amux/workspaces.json invalidates the approval, so changed commands are re-gated until you trust the file again. (Run/archive scripts you enter yourself in the amux UI are your own input and are never gated.)

Workspace metadata is stored in ~/.amux/workspaces-metadata/<workspace-id>/workspace.json, and local worktree directories live under ~/.amux/workspaces/<project>/<workspace>. Trusted-repo approvals are recorded in ~/.amux/trusted-scripts.json.

Assistants: the AI agents amux can launch are configured per-user in ~/.amux/config.json. You can add your own or override a built-in — see docs/CONFIG.md.

Platform Support

AMUX requires tmux and is supported on Linux/macOS. Windows is not supported.

Development

git clone https://github.com/andyrewlee/amux.git
cd amux
./scripts/install-hooks.sh   # one-time: enables the pre-commit + pre-push git hooks
make lint-tools              # one-time: builds the pinned golangci-lint into ./.cache/bin
make run

Run ./scripts/install-hooks.sh once after cloning. It points core.hooksPath at .githooks, enabling the pre-commit fmt/lint/file-length checks and the pre-push lint-parity gate the project relies on for quality.

Run make lint-tools once before your first make devcheck or git commit. It builds the linter pinned in .golangci-version into the gitignored ./.cache/bin; a stock golangci-lint from PATH may be a different version from CI and produce different diagnostics. See LINTING.md and CONTRIBUTING.md for details.

Operations

  • Logs are written to ~/.amux/logs/amux-YYYY-MM-DD.log (default retention 14 days). Override retention with AMUX_LOG_RETENTION_DAYS.
  • Log verbosity: set AMUX_LOG_LEVEL=debug (accepts debug/info/warn/error; default info) to change what gets written to the log — debug is the first thing to try when reporting or diagnosing a problem.
  • Attached-tab limit: set AMUX_MAX_ATTACHED_AGENT_TABS (default 6; 0 disables the limit) to change how many agent tabs keep live PTYs attached concurrently.
  • Terminal-tab limit: set AMUX_MAX_ATTACHED_TERMINAL_TABS (default 6; 0 disables the limit) to change how many sidebar terminals keep live PTYs attached; least-recently-used background terminals detach automatically, stay alive in tmux, and re-attach when their workspace is selected.
  • Git hooks: amux runs git with repo hooks and core.fsmonitor disabled so a checked-out repository cannot execute code just because amux touched it; set AMUX_ALLOW_GIT_HOOKS=1 if your workflow needs repo hooks (e.g. git-lfs).
  • OSC 52 clipboard: set AMUX_ENABLE_OSC52_CLIPBOARD=1 to let agent terminal output copy to your clipboard via OSC 52 (off by default because terminal output is untrusted; payloads over 64 KiB are ignored).
  • Perf profiling: set AMUX_PROFILE=1 to emit periodic timing/counter snapshots; adjust cadence with AMUX_PROFILE_INTERVAL_MS (default 5000).
  • pprof: set AMUX_PPROF=1 (or a port like 6061) to expose net/http/pprof on 127.0.0.1.
  • Debug signals: set AMUX_DEBUG_SIGNALS=1 and send SIGUSR1 to dump goroutines into the log.
  • PTY tracing: set AMUX_PTY_TRACE=1 or a comma-separated assistant list; traces write to the log dir (or OS temp dir if logging is disabled). The trace captures both directions of the pipeline — agent→amux output is tagged RECV and amux→agent input (keystrokes, pastes, the delayed Enter/CR) is tagged SEND — so send-path issues like a dropped Enter can be debugged at the byte level.

Directories

Path Synopsis
cmd
amux command
amux-harness command
Command amux-harness is a headless render/perf harness for amux.
Command amux-harness is a headless render/perf harness for amux.
internal
app
app/activity
Package activity implements tmux session activity detection using screen-delta hysteresis and tag-based output timestamps.
Package activity implements tmux session activity detection using screen-delta hysteresis and tag-based output timestamps.
config
Package config loads and represents amux configuration: assistant definitions, UI settings, and resolved on-disk paths.
Package config loads and represents amux configuration: assistant definitions, UI settings, and resolved on-disk paths.
data
Package data persists workspace records to disk via WorkspaceStore, using atomic JSON reads/writes keyed by workspace ID plus per-repo lookup.
Package data persists workspace records to disk via WorkspaceStore, using atomic JSON reads/writes keyed by workspace ID plus per-repo lookup.
e2e
e2e/fakeagent command
Command fakeagent is a deterministic stand-in for a real raw-mode coding agent (Claude Code / Codex / Cline) for amux end-to-end tests.
Command fakeagent is a deterministic stand-in for a real raw-mode coding agent (Claude Code / Codex / Cline) for amux end-to-end tests.
fsatomic
Package fsatomic provides crash-safe single-file persistence: data is written to a temp file in the target directory, synced to disk, and then atomically moved over the target.
Package fsatomic provides crash-safe single-file persistence: data is written to a temp file in the target directory, synced to disk, and then atomically moved over the target.
git
Package git wraps the git CLI for amux's worktree-per-workspace model: creating and removing worktrees and branches, computing diffs, and watching the working tree for changes.
Package git wraps the git CLI for amux's worktree-per-workspace model: creating and removing worktrees and branches, computing diffs, and watching the working tree for changes.
logging
Package logging is amux's file-based logger.
Package logging is amux's file-based logger.
messages
Package messages defines the shared Bubble Tea message vocabulary exchanged between the app message pump and the UI panes: user intents, lifecycle events, and cross-pane notifications.
Package messages defines the shared Bubble Tea message vocabulary exchanged between the app message pump and the UI panes: user intents, lifecycle events, and cross-pane notifications.
perf
Package perf is lightweight, opt-in instrumentation: named counters (Count) and timers (Record/Time) that flush to a log for the headless harness and the perf baselines.
Package perf is lightweight, opt-in instrumentation: named counters (Count) and timers (Record/Time) that flush to a log for the headless harness and the perf baselines.
pprofhttp
Package pprofhttp builds the opt-in pprof server used by amux binaries.
Package pprofhttp builds the opt-in pprof server used by amux binaries.
process
Package process provides cross-platform process-group teardown: it kills a process together with its descendants (KillProcessGroup) so agent process trees do not survive the tmux session that launched them.
Package process provides cross-platform process-group teardown: it kills a process together with its descendants (KillProcessGroup) so agent process trees do not survive the tmux session that launched them.
pty
Package pty manages the pseudo-terminals that back hosted agents: it spawns agent processes (Agent) attached to a PTY (Terminal), sizes them, and streams their byte output to the UI for parsing by internal/vterm.
Package pty manages the pseudo-terminals that back hosted agents: it spawns agent processes (Agent) attached to a PTY (Terminal), sizes them, and streams their byte output to the UI for parsing by internal/vterm.
safego
Package safego provides panic-safe goroutine helpers (Go, Run) with a pluggable PanicHandler, so background work can never crash the TUI on an otherwise-unrecovered panic.
Package safego provides panic-safe goroutine helpers (Go, Run) with a pluggable PanicHandler, so background work can never crash the TUI on an otherwise-unrecovered panic.
shellutil
Package shellutil holds small, security-sensitive shell helpers shared across packages so their behavior can't drift between copies.
Package shellutil holds small, security-sensitive shell helpers shared across packages so their behavior can't drift between copies.
supervisor
Package supervisor runs named background workers under a restart/backoff policy and surfaces fatal worker errors through a pluggable error handler instead of letting an unrecovered failure take down the app.
Package supervisor runs named background workers under a restart/backoff policy and surfaces fatal worker errors through a pluggable error handler instead of letting an unrecovered failure take down the app.
testutil
Package testutil provides small polling helpers shared across test packages, so individual tests don't re-derive deadline/poll loops (which tend to drift in interval and failure messaging).
Package testutil provides small polling helpers shared across test packages, so individual tests don't re-derive deadline/poll loops (which tend to drift in interval and failure messaging).
tmux
Package tmux is a thin wrapper over the tmux CLI used to host agent sessions: it creates and kills sessions, captures pane contents and scrollback, resizes windows, and reads/writes the @amux_* activity tags that coordinate detection and reattach across amux instances.
Package tmux is a thin wrapper over the tmux CLI used to host agent sessions: it creates and kills sessions, captures pane contents and scrollback, resizes windows, and reads/writes the @amux_* activity tags that coordinate detection and reattach across amux instances.
ui/center
Package center implements the center-pane Bubble Tea model: the agent tab strip, per-tab PTY I/O and flushing, the diff viewer, and mouse/keyboard text selection.
Package center implements the center-pane Bubble Tea model: the agent tab strip, per-tab PTY I/O and flushing, the diff viewer, and mouse/keyboard text selection.
ui/common
Package common holds UI building blocks shared across panes: theming (colors, styles, icons), widgets (dialogs, file picker, toasts), text selection, and the low-level PTY/tmux plumbing used by the center and sidebar terminals.
Package common holds UI building blocks shared across panes: theming (colors, styles, icons), widgets (dialogs, file picker, toasts), text selection, and the low-level PTY/tmux plumbing used by the center and sidebar terminals.
ui/compositor
Package compositor composes vterm snapshots and UI layers into a single rendered frame.
Package compositor composes vterm snapshots and UI layers into a single rendered frame.
ui/dashboard
Package dashboard implements the dashboard pane: the project and workspace tree with keyboard and mouse navigation plus a toolbar for workspace actions.
Package dashboard implements the dashboard pane: the project and workspace tree with keyboard and mouse navigation plus a toolbar for workspace actions.
ui/diff
Package diff implements the diff viewer shown in a center tab, rendering a git change as scrollable, syntax-aware output.
Package diff implements the diff viewer shown in a center tab, rendering a git change as scrollable, syntax-aware output.
ui/layout
Package layout computes pane geometry: it tracks the layout mode and divides the terminal into the dashboard, center, and sidebar regions (Manager).
Package layout computes pane geometry: it tracks the layout mode and divides the terminal into the dashboard, center, and sidebar regions (Manager).
ui/ptyio
Package ptyio holds the low-level PTY/tmux plumbing shared by the center and sidebar terminals: the PTY read loop and output forwarding/merging, PTY-noise filtering and overflow trimming, and tmux session bootstrap/restore (capture, snapshot, scrollback).
Package ptyio holds the low-level PTY/tmux plumbing shared by the center and sidebar terminals: the PTY read loop and output forwarding/merging, PTY-noise filtering and overflow trimming, and tmux session bootstrap/restore (capture, snapshot, scrollback).
ui/sidebar
Package sidebar implements the sidebar pane: the workspace file tree plus an embedded tmux-backed terminal with its own PTY I/O and text selection.
Package sidebar implements the sidebar pane: the workspace file tree plus an embedded tmux-backed terminal with its own PTY I/O and text selection.
update
Package update implements self-update: it compares the running version against GitHub releases and downloads, checksum-verifies, and installs a newer binary, skipping Homebrew and go-install builds.
Package update implements self-update: it compares the running version against GitHub releases and downloads, checksum-verifies, and installs a newer binary, skipping Homebrew and go-install builds.
validation
Package validation guards untrusted input before it reaches git or the filesystem: it sanitizes strings and validates assistant names, base refs, project paths, and workspace names.
Package validation guards untrusted input before it reaches git or the filesystem: it sanitizes strings and validates assistant names, base refs, project paths, and workspace names.
vterm
Package vterm is a terminal emulator: it parses a stream of ANSI/VT escape sequences into a cell grid plus scrollback and renders that state back to ANSI.
Package vterm is a terminal emulator: it parses a stream of ANSI/VT escape sequences into a cell grid plus scrollback and renders that state back to ANSI.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL