Get into the agentic coding flow.
A native macOS app that tracks your running coding agent sessions and cycles you to the next one that needs attention. No workflow changes. No new terminal. Just less time wasted.
Currently works with iTerm2 / Kitty / WezTerm (tmux optional) and Claude Code, OpenCode, Codex (experimental), and Pi. More integrations coming soon.
Yes, you can configure it to always use the same color or disable the tab/pane highlighting completely, but where's the fun in that?
I usually have 3-6 terminals open, each of which will have 2-6 tabs focused on various repos. I was constantly either alt tabbing around or taking my hands off the keyboard to find the next session. Then after a while I would realize that there was some session that just needed me to press enter that I completely forgot about. All the solutions I found for this force you to use their workflow, requiring worktrees or tmux, limiting to one repo, and making you use some embedded SwiftTerminal or bloated Electron app. I didn't want that. I wanted to keep my workflow and the terminal I already set up just the way I like. So I built Juggler.
- Instant switching - Press one global hotkey from anywhere and Juggler takes you straight to the next session waiting for input
- Never lose a window - Color-coded tab and pane highlighting lets you spot the active session immediately, even across monitors
- Zero workflow changes - No new terminal to learn and set up, no forced worktrees, no single-repo limit. Your existing setup stays exactly as it was
I like software that does one thing and does it well. Juggler has a few bells and whistles where it makes sense, but it's first and foremost about cycling through your sessions. It never reads your code or your conversations, it never looks at your agent's logs, and it never will. I'm adding support for more agents and terminals, and making some improvements here and there, but at its core Juggler is feature complete.
brew install --cask nielsmadan/juggler/jugglerDownload the latest DMG, open it, and drag Juggler to Applications.
- Download and open - Launch Juggler from Applications
- Walk through onboarding - Grant Accessibility permissions, set up terminal integration(s), install hooks
- Open your sessions - Start Claude Code, OpenCode, Codex, or Pi as you normally would. Juggler detects them automatically
- Hit the hotkey - Press
⇧⌘Kand you're at the next idle session
- Global hotkeys - Cycle forward, backward, backburner, reactivate, toggle UI - all from any app, all customizable
- Tab & pane highlighting - One highlight color is active at a time; it advances each cycle and always matches between the monitor and the terminal tab/pane
- Quick orientation - Briefly flash the name of the session in the middle of the screen, immediately see where you are.
- Notifications - Native macOS alerts when a session goes idle or needs permission. Click to jump there
- Menu bar & monitor - Popover for a quick glance. Full session monitor window with jugglery animations and stats
- Queue modes - Fair (round-robin), Priority (most recent first), Static (creation order), or Grouped (by window)
- Backburner - Park sessions you don't need right now. They stay tracked but won't appear in your cycle
- Idle time stats - Per-session and global idle vs. working time
- Guided setup - Onboarding walks you through permissions, terminal integration, and hook installation
| Shortcut | Action |
|---|---|
⇧⌘K |
Cycle to next idle session |
⇧⌘J |
Cycle backward |
⇧⌘L |
Backburner current session |
⇧⌘O |
Send current session to back of queue |
⇧⌘H |
Reactivate all backburnered sessions |
⇧⌘E |
Activate session from last notification |
⇧⌘; |
Toggle popover / open monitor |
All shortcuts are customizable in Settings.
Terminals: iTerm2, Kitty, WezTerm, tmux (optional multiplexer), Zellij (planned)
Coding agents: Claude Code, OpenCode, Codex (experimental - requires Codex CLI ≥ v0.114), Pi
Requires: macOS 14.0+ (Sonoma)
Juggler runs a lightweight HTTP server on port 7483 that receives state-change events from your coding agent. When a session goes idle, starts working, or needs permission, Juggler updates its tracking and can notify you or cycle you to sessions that need attention.
Terminal integration: For iTerm2, a Python daemon communicates via iTerm2's Python API over a Unix socket, providing session switching, tab highlighting, and focus tracking. For Kitty, Juggler uses kitten @ remote control commands. For WezTerm, Juggler uses the wezterm cli for session switching (WezTerm exposes no external API for tab highlighting or focus tracking).
Session states: idle, permission, working, compacting, backburner
Juggler's onboarding flow sets up agent integration automatically. You can also configure it manually:
- Claude Code - Shell hooks installed to
~/.claude/hooks/juggler/. Alternatively, run/Applications/Juggler.app/Contents/Resources/install.sh - OpenCode - TypeScript plugin installed to
~/.config/opencode/plugins/juggler-opencode.ts. Configure via Settings → Integrations - Codex (experimental - requires Codex CLI ≥ v0.114) - Three setup steps in Settings → Integrations: Install Hooks (adds
notify.sh+hooks.jsonto~/.codex/hooks/juggler/), Enable Feature Flag (features.hooks = truein~/.codex/config.toml), and Enable in Codex (writes[hooks.state]trust entries so Codex runs the hooks - this bypasses Codex's own hook review; alternatively run/hooksin Codex and trust them manually) - Pi - TypeScript extension installed to
~/.pi/agent/extensions/juggler-pi.ts. Configure via Settings → Integrations. Restart Pi or run/reloadfor it to take effect
Juggler can track agent sessions running on remote hosts. Open the SSH tab in Settings for a step-by-step setup guide.
Juggler requires terminals with a scriptable API to switch sessions and highlight tabs/panes. Support for additional terminals depends on whether they expose one.
Planned:
- Wave -
wshCLI for workspace control (macOS, Linux, Windows) - Tabby - TypeScript plugin system for tab control (macOS, Linux, Windows)
- Zellij - multiplexer with CLI session/tab control, as an alternative to tmux
Waiting on API support:
- Ghostty - no scripting API yet (discussion)
- Warp - no plugin system yet (discussion)
- Alacritty - minimal by design, no session control API
- Terminal.app - AppleScript support too limited for tab/pane management
Juggler tracks agent sessions through lifecycle hooks that fire on events like session start, tool use, and idle. Support for additional agents depends on their hook systems.
Planned:
- Gemini CLI - has comprehensive hooks (SessionStart/End, BeforeTool/AfterTool)
- GitHub Copilot CLI - has hooks (sessionStart/End, preToolUse)
Waiting on hook support:
- Aider - no lifecycle hooks
Juggler is currently macOS-only. WezTerm, Wave, and Tabby run on macOS, Linux, and Windows. Kitty and Konsole (D-Bus API) already run on Linux. If there's popular demand, I'm happy to port it.
MIT License - see LICENSE for details.
