For developers who don't trust a black box.
Your coding agent is one. Juggler opens it: open any step of any session and see exactly what the model was sent and what came back — system prompt, tools, tokens, cache, timing. Branch, rewind, edit and undo any of it. Claude Code, Codex, Copilot, Gemini and Ollama behind one interface, direct to your provider with nothing in between.
Built by Julian Storer (JUCE, Tracktion, Cmajor): a native Go server, conversations as CRDTs synced live to every client, and no Electron in sight.
- Open source
- Free
- No account
- Vendor-neutral
- Direct to your provider
macOS 14+ on Apple Silicon · Windows x64 · Linux x64 & arm64 · headless on any Linux box
Claude Code
OpenAI · Codex
Copilot
Gemini
Mistral
DeepSeek
OpenRouter
Ollama
- + 8 more
Every step of a finished fix, down to the request the model was sent. Nothing in Juggler is sealed.
Your agent's conversation is a tree, not a log file.
Branch at any point: send a tangent, a delegated task or a competing approach into a sub-thread, and bring back only its result instead of pouring the whole excursion into your main context.
Edit anything, undo any of it
A box you can see into is only half of it; the context should be yours to change. Delete or rewind any part of the history, fork a new conversation from any point, expand a thread back into its parent — and undo any of it.
-
A desktop interface for long sessions
Using a coding agent means reading and editing substantial amounts of text. Juggler gives that work a proper interface: Miller-column navigation and focused views, built for long sessions.
-
Branching is recursive
A sub-thread can have sub-threads. Explore a tangent or a competing approach as deep as it needs to go.
-
Everything important is inspectable
Open tool arguments, approvals and results in their own views. Open any model transaction: system prompt, messages, tool definitions, output, token use, timing, stop reason.
You decide what runs
A command is judged piece by piece, and only the parts that can change something ask first. A Yes can save a rule as narrow as the command itself, and every rule is listed where it can be edited or removed.
Several agents at once
An agent can hand work to new conversations, which run side by side while you watch the one you choose. To keep them from treading on each other, each can work in its own workspace — a git worktree on another branch, a throwaway scratch copy, or one folder of a monorepo.
One session, every screen
Launch the desktop app and everything runs locally. When the project lives on a dev box or server, run Juggler there instead: the session lives with the code, and every connected client — app, browser, phone — stays in sync.
Every build reaches a session over your local network. The official binaries add Direct P2P and Cloudflare Tunnel, for reaching it from anywhere.
Any provider, and nothing in between
Bring a subscription you already pay for, an API key, or a model running on your own machine. Juggler sells no tokens, so it has no stake in which you pick — switch provider, model or thinking level mid-conversation.
- YouA prompt, in Juggler
- Your machineJuggler builds the request
- The provider you choseDirect — no Juggler server, no cloud index of your code
Your subscription
Claude Code Pro / Max, via the
claudeCLIOpenAI Codex any ChatGPT plan
GitHub Copilot free plan included
An API key
Anthropic
OpenAI
Google Gemini
Mistral
DeepSeek
Moonshot Kimi
- Z.AI GLM
OpenRouter
OpenCode Zen
Your own machine
Ollama
LM Studio
- llama.cpp
- LocalAI
Anything else
- Custom endpoints any OpenAI-compatible URL — gateways, tenants, regions
- ACP agents external agents over the Agent Client Protocol
Conversations and API keys stay on your own disk, and the source is public, so none of that has to be taken on trust.
Everything is an extension
Juggler is assembled from a small set of abstractions, and every one of them is a capability an extension can supply — even read, write and bash go through the public SDK. There is no privileged inner tier.
// A tool the model can call: a JSON schema in, an approval gate if
// it's destructive, a structured result out.
import ContextItem from 'juggler/context-item';
// The policy of the agentic loop: which tools exist this turn, what
// gets auto-approved, what guidance the model is given.
import Strategy from 'juggler/strategy-type';
// A slash command — no LLM, no approval, the simplest capability.
import Command from 'juggler/command-type';
// An environment for a conversation's tools to run in. The built-in
// git-worktree, scratch-copy and project-folder providers are three;
// an ssh host or a container could be a fourth.
import WorkspaceProvider from 'juggler/workspace-provider';
// Owns a file type end to end: how it renders for you, and what the
// model sees of it — two different jobs, in two different places.
import FileViewer from 'juggler/file-viewer';
// An ambient tile in the sidebar, alongside Tips and Git status.
import InfoCard from 'juggler/info-card-type';
// A view the user pins beside the conversation. Display only, by
// design: it has no way to feed the model.
import PinboardItem from 'juggler/pinboard-item-type';
Those imports are real. Writing an extension starts with a single scaffold command.
Under the hood
-
A native app and a matching server
The backend is Go; the interface is type-checked JavaScript served directly, with no frontend compilation step. Conversations are Yjs documents, so every connected client converges on the same live state.
-
A state machine, not a while-loop
The turn cycle — model, tools, approval, next call — advances by named state transitions in the conversation document, not by a loop holding it all in memory. An approval is a state rather than a blocked process, so a turn can be interrupted anywhere and carry on later as if nothing had happened.
-
Sessions survive quits and reconnects
A session lives on disk, not just in memory. Quit, relaunch or lose the connection and the conversation is still there, including an agent waiting for you to approve its next step.
-
Context limits are handled before they become your problem
Juggler sizes the complete request before each call, leaves room for the answer, and compacts older history when a conversation outgrows the model's window.
-
MCP tools, fully inspectable
Connect a local or remote MCP server and follow the whole handoff: schema, generated arguments, approval, result. Check server status and logs, filter individual tools, and see what a past model turn actually received.
-
AGPLv3 application, permissive extension SDK
The application is AGPLv3; the extension SDK and bundled extensions are Apache-2.0, so extensions can remain closed source. A build from source supports local and LAN access; the official binaries add WAN modes — see LICENSING.md for the boundary.
Who's building this?
I'm Julian Storer. I've been building tools for developers and musicians since the 1990s, and these days most of my own work happens through a coding agent. Juggler exists because I wanted that tool to be worth living in. And somehow I seem to have ended up writing it myself...
Active development
Frequent releases, shaped by people using it on real projects — the changelog has the details.
Constructive feedback is welcome on the Discord.
Questions people ask
What is Juggler, in one paragraph?
A coding agent with a proper desktop interface. It reads, edits and runs things in your project like any other agent, but every step of a session is something you can open, inspect, branch from, edit or undo — down to the exact request the model was sent. It runs on your machine (or your server) and talks to whichever model provider you choose.
Is it free? What's the difference between the download and building from source?
The download is free, and there's no Juggler account. The source is public under AGPLv3, and a build from it is the whole app, with local and LAN access. The official binaries add two ways of reaching a session from anywhere (Direct P2P and Cloudflare Tunnel) and in-app updates on macOS and Windows. LICENSING.md has the details.
Can I use the subscription I already pay for?
Yes, for the vendors that allow it. Claude Code: Juggler drives your own, unmodified claude
CLI with your Pro or Max plan, and never touches its login. OpenAI Codex: any ChatGPT plan, through the
Codex CLI or ChatGPT app login. GitHub Copilot: sign in with GitHub, free plan included. Everything else
uses an API key or a local model.
Gemini is API-key only, on purpose: Google's terms forbid third-party clients on its subscription logins and the penalty is a ban on your account, so Juggler doesn't offer one.
Does my code go anywhere?
Only to the model provider you pick for a request, directly from your machine — there's no Juggler server in the path and no cloud index of your repository. Conversations and API keys are files on your own disk. Beyond that, Juggler reaches the network when you ask it to (web fetch and search), when you turn on Direct P2P remote access (a rendezvous service introduces your devices to each other), and to check for new versions — Settings → Updates says exactly what that check sends.
Which platforms does it run on?
macOS 14 or later on Apple Silicon (signed and notarized; Intel Macs can build from source), Windows x64 (also
runs on ARM under emulation; the installer is not yet code-signed, so SmartScreen will warn), and Linux x64 and
arm64 (Ubuntu 24.04 or similar, with GTK 4 and WebKitGTK 6). The server also runs headless on Linux with no
display at all. On a Mac: brew install --cask juggler-ai/tap/juggler.
How is it different from Claude Code, Codex CLI or Cursor?
Claude Code and Codex are terminal agents; Juggler can use either of them as its model provider and gives the session a graphical, navigable shape — a tree you can branch, inspect and edit, rather than a scrolling transcript. Cursor is an editor with an agent in it; Juggler is an agent with no editor, built to sit beside the one you already use. And it isn't tied to any one vendor's models.
Can I run it on a server and use it from my phone?
Yes. Run the juggler binary on the machine where the code lives, and attach from the desktop app or
any browser — phone included, with a touch layout. Every connected client sees the same live session. Every
build reaches it over your local network (Settings → Connectivity shows a QR code); for anywhere else, use the
official binaries' Direct P2P or Cloudflare Tunnel, or your own tunnel such as Tailscale.
Can I use local models?
Yes: Ollama, LM Studio, llama.cpp and LocalAI are built in and need no key, and any other OpenAI-compatible server can be added as a custom endpoint.
Does it support MCP?
Yes — local (stdio) and remote (HTTP and SSE) servers, per project or for every project, with live status, logs,
and per-tool allow and deny lists. Remote servers that need an OAuth sign-in aren't supported directly yet; use
a static header, or the mcp-remote proxy.
Will it pick up my CLAUDE.md, AGENTS.md, skills and commands?
Yes. CLAUDE.md, AGENTS.md, .cursorrules and similar instruction files are
read automatically; Agent Skills load from .agents/skills as well as Juggler's own folders; and
custom slash commands are markdown files in the same format Claude Code uses.
Can I run several agents at once?
Yes. Conversations run side by side in tabs, ⌘J takes you to whichever one is waiting on you, and each can work in its own workspace — a git worktree, a throwaway copy, or one folder of a monorepo — so they don't tread on each other.
Can I write extensions, and keep them closed source?
Yes. Every built-in tool is itself an extension, written against the same SDK yours would use. The SDK is
Apache-2.0, so your extension can carry any licence you like. Writing one starts
with juggler ext init.
Where do I report a bug, or ask for something?
GitHub issues for bugs, Discord for everything else. Code contributions are welcome too; CONTRIBUTING.md explains the contributor agreement.
No terminal required
The desktop app
Download and launch it. The app starts its matching local server and opens your project.
For long-lived & remote sessions
The terminal server
Run the headless juggler binary where your code lives, then attach from a browser or the desktop app.
Or on a Mac, with Homebrew: brew install --cask juggler-ai/tap/juggler
Free to download. Open source. No Juggler account. No Electron.