viterm — Run AI coding agents in parallel

Swift · AppKit · libghostty

Run AI coding agents
in parallel.

Claude Code, Codex, as many as you want — one per git worktree. A native macOS terminal that never garbles on resize and never leaves you waiting.

↓ See the features
1 worktree : N sessions Not Electron native rendering macOS 15+ Apple Silicon

Not just tabs

Tabs don't run in parallel.
They just switch.

Ten tabs open, and you still can't tell which agent is waiting on you, which is working, and which just finished — not without opening each one. viterm's tabs carry their state, and the sidebar shows all of it at once.

Terminal tabs
  • You see one active pane. The rest are hidden
  • No way to tell which tab is waiting until you open it
  • Worktrees are your job: cd, create, name
  • More tabs, more state to hold in your head
viterm
  • Every session's busy / waiting / idle, rolled up on its worktree row
  • State dots on the tabs too — you know before you switch
  • Waiting fires a notification; ⌘⇧U jumps you there
  • Spin a worktree off a branch and launch an agent in it

Features

Four foundations for working in parallel.

1 worktree : N sessions

As many sessions as you want, per worktree.

Have Claude implement on a branch while Codex writes the tests right next to it — and a plain shell alongside. ⌘T lines sessions up as tabs; ⌘1–9 moves between them. Leave the worktree and come back — you land on the tab you left open.

claude #1⌘1
codex #1⌘2
zsh⌘3
feat/palette — 3 sessions
Native rendering

Never garbles. Because it's native.

The terminal is drawn by the same engine as Ghostty (libghostty), natively. Resize the window however you like — vim and Claude Code stay intact. That's the payoff of dropping the TUI-in-TUI. It launches instantly, and it isn't Electron.

↔ resize
┌─ NORMAL ──────────────┐
│  1  import AppKit      │
│  2  final class View { │
│  3    override func    │
│  4      layout() { ... │
└───────────────────────┘
✓ Lines stay put on resize
Worktree lifecycle

Put worktrees wherever you like.

A template decides where worktrees land. ~/worktrees/{project}/{branch}, or ../{branch} next to the repo — your call. Launch an agent the moment it's created, then merge or rebase into main and fold it away from the sidebar when you're done.

⌘N
Path template
~/worktrees/{project}/{branch}
→ ~/worktrees/viterm/feat-palette
◉ Launch claude after creating
Status & notifications

Never miss a prompt for input.

Each session shows busy / waiting / idle as a dot on its tab and its worktree row. Worktrees you're not looking at stay visible too, rolled up in the sidebar. When an agent asks for confirmation, a macOS notification fires, and ⌘⇧U jumps to the latest one waiting.

busyworking
waitingnotify + badge
idle1.5s debounce

Keyboard-first

Keep your hands on the home row.

Worktrees, sessions, notifications — all reachable from the ⌘K command palette. No mouse required.

⌘KCommand palette
⌘NNew worktree
⌘TNew session (tab)
⌘1–9Switch tab (in worktree)
⌘⇧UJump to waiting
⌘⌥↑↓Switch worktree
⌘,Settings
⌘BToggle sidebar

Free & open source

Ready to run them in parallel.

viterm is free, MIT-licensed open source. Install it right now with Homebrew.

View source on GitHub