Skip to content

nielsmadan/juggler

Repository files navigation

Juggler

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.

macOS 14+ MIT License Claude Code OpenCode Codex Pi iTerm2 Kitty WezTerm

Juggler demo

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?

Why Juggler

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.

What sets it apart:

  • 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.

Installation

Homebrew (recommended)

brew install --cask nielsmadan/juggler/juggler

Manual download

Download the latest DMG, open it, and drag Juggler to Applications.

Getting Started

  1. Download and open - Launch Juggler from Applications
  2. Walk through onboarding - Grant Accessibility permissions, set up terminal integration(s), install hooks
  3. Open your sessions - Start Claude Code, OpenCode, Codex, or Pi as you normally would. Juggler detects them automatically
  4. Hit the hotkey - Press ⇧⌘K and you're at the next idle session

Features

  • 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

Keyboard Shortcuts

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.

Compatibility

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)

How It Works

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

Agent Integration

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.json to ~/.codex/hooks/juggler/), Enable Feature Flag (features.hooks = true in ~/.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 /hooks in Codex and trust them manually)
  • Pi - TypeScript extension installed to ~/.pi/agent/extensions/juggler-pi.ts. Configure via Settings → Integrations. Restart Pi or run /reload for it to take effect

Running over SSH

Juggler can track agent sessions running on remote hosts. Open the SSH tab in Settings for a step-by-step setup guide.

Future

Terminals

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 - wsh CLI 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

Coding Agents

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

Linux & Windows

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.

License

MIT License - see LICENSE for details.

About

Native macOS app to cycle through idle agentic coding sessions with global hotkeys. Works with iTerm2 and Kitty.

Topics

Resources

Security policy

Stars

Watchers

Forks

Releases

Contributors

Languages