By the end of this tutorial you’ll have your existing Claude, Codex, Cursor-agent, and other coding agents registered into Maxxwell, all visible in one pane.
By the end of this tutorial you’ll have your existing Claude, Codex, Cursor-agent, and other coding agents registered into Maxxwell, all visible in one pane, tagged by repo/feature, and marked when they’re stalled or quietly building the wrong thing.
You keep your agents and terminal workflow. Maxxwell just becomes the place you look first.
Before step 1, make sure you have:
If you’re also comparing other orchestration tools (Herd, Helmor, ctx, etc.), the related deep-dive is here: Maxxwell workflow comparison: herding coding agents without adding more noise.
You start by getting Maxxwell running locally with no agents attached yet.
On macOS / Windows / mainstream Linux distros:
maxxwell.dev.If you prefer the terminal, install the CLI (macOS / Linux):
# macOS (homebrew)
brew tap rindler/maxxwell
brew install maxxwell
# Linux (example for Debian/Ubuntu via curl script)
curl -sSL https://maxxwell.dev/install.sh | bash
# Verify
maxxwell --help
Run the CLI once to create the local config:
maxxwell pane
Common failure:
$PATH (or reload shell), then rerun maxxwell pane.At this point Maxxwell is running and showing a blank fleet. No agents yet.
Maxxwell doesn’t replace Claude, Codex, or Cursor; it talks to them using your existing credentials.
You configure this once.
If you use Claude Code or Claude API:
# Set Claude API key in Maxxwell config
maxxwell config set claude.api_key YOUR_CLAUDE_KEY
# Optional: set default model
maxxwell config set claude.model claude-3-5-sonnet
For OpenAI-based agents or Codex:
# Set OpenAI key
maxxwell config set openai.api_key YOUR_OPENAI_KEY
# Example: default code model
maxxwell config set openai.model gpt-4.1
In the desktop app this is the same, just via the Settings panel: paste keys, pick defaults.
Common failure:
needs sign-in in the pane.maxxwell config set …, and restart the pane. Maxxwell will flip the state to not started once the key is valid.Maxxwell now can start agent workers using the same models you already use elsewhere.
To keep the pane readable, start by teaching Maxxwell about your repos and how you want to group agents.
From your terminal, in each repo root:
cd ~/work/service-a
maxxwell repo register . --name service-a
cd ~/work/frontend-app
maxxwell repo register . --name frontend-app
Each repo register call adds a local record Maxxwell uses when you tag sessions.
Next, create tags for features or workstreams:
maxxwell tag create service-a:auth
maxxwell tag create service-a:billing
maxxwell tag create frontend-app:dashboard
maxxwell tag create frontend-app:design-system
You’ll see these appear in the desktop app as filters and tag options when you create or edit a lane.
Common failure:
unknown in the pane.maxxwell repo register from that repo’s root, not a subdirectory, and give it a stable --name. Maxxwell keys lanes off that mapping.Now you’ve got the scaffolding to categorize your agents by repo and feature.
With repos and tags in place, you start moving your agent herd into Maxxwell. The key point: these are still real terminal sessions you can attach to.
In the service-a repo:
cd ~/work/service-a
# Start a Claude Code worker for auth
maxxwell worker start \
--name service-a-auth-claude \
--model claude-3-5-sonnet \
--tag service-a:auth
This does three things:
not startedservice-a:auth so you can filter by featureWorkers are your own unmodified tools — claude, codex, cursor-agent — running in real terminal sessions. Attach to one directly if you want to see the raw terminal:
maxxwell worker attach service-a-auth-claude
cd ~/work/frontend-app
maxxwell worker start \
--name frontend-dashboard-codex \
--model gpt-4.1 \
--tag frontend-app:dashboard
Open the desktop app: you should now see two lanes, each with its repo, current model, tag, and a state like not started or working once you give them a brief.
Common failure:
dead.maxxwell worker attach … and scroll the logs. It’s almost always a missing dependency (e.g. your local Claude runtime not installed) or an invalid model name.At this point, some of your “herd” is under Maxxwell’s control pane instead of scattered across tabs and terminals.
You probably have Claude Code or Cursor-agent running in a browser or IDE. Maxxwell doesn’t own those processes, but it can still track them as lanes with states.
The pattern is: you create a “manual” lane that represents that external agent, and keep its state in sync by talking to the orchestrator.
In Maxxwell’s desktop app:
service-a-auth-claude-browserservice-aservice-a:authexternal (browser)working if it’s already mid-task.Alternatively via CLI:
maxxwell lane add \
--name service-a-auth-claude-browser \
--repo service-a \
--tag service-a:auth \
--source external \
--state working
Whenever you pause or resume that browser session, you tell the orchestrator to update the lane state. Example:
“Set
service-a-auth-claude-browserto idle, I’m not answering it for the next hour.”
The orchestrator drafts the state change and you confirm it; you always press enter.
Common failure:
Now both local workers and external agents are visible in one pane.
The orchestrator seat is just another coding-agent session, briefed to manage the others. You talk to it instead of juggling individual terminals.
From any repo (or a neutral workspace):
maxxwell orchestrator start \
--name main-orchestrator \
--model claude-3-5-sonnet
Give it a written brief that matches how you think about your fleet. Example:
You are the orchestrator for my agent fleet.
Sessions represent feature work across these repos:
- service-a: auth, billing
- frontend-app: dashboard, design-system
Your job:
- Track which lanes are working, idle, waiting-on-me, blocked, done, or dead.
- Ask for my decision when multiple sessions conflict.
- Draft, but never send, commands or messages that would change the fleet.
- Always separate:
- What has landed in git
- What is still drafts / unmerged
- What is waiting on my input
Once this lands, you can say things like:
“Summarize service-a:auth work across all lanes and tell me which ones are waiting on me.”
The orchestrator replies with a clear report: which lanes are working, which are waiting on you, which are blocked, and what they’ve done so far.
Common failure:
This is where you start feeling the attention relief: one seat that knows the state of the herd.
Now that everything is visible, you need to see at a glance which agents are productive, idle, or going off-track.
Maxxwell exposes lane states like:
workingidlewaiting on youblockedneeds sign-innot starteddonedeadnot heard fromIn the desktop pane:
blocked or waiting on you lanes to the top.CLI example:
maxxwell fleet list --repo service-a --tag service-a:auth --sort state
Maxxwell’s context-pressure readout shows how full a session’s context is, with tiered warnings. When you see warnings:
service-a-auth-claude and restate its goal in one paragraph.”Common failure:
working but hasn’t produced anything useful.dead and spin up a fresh worker with a clearer goal.At this point you can answer “which of these is stuck and which is just slow?” by glancing at one pane.
The silent failure mode is the agent confidently implementing the wrong requirement. Maxxwell doesn’t auto-correct drift, but it gives you enough visibility to catch it early.
For each lane, record the goal in a short, explicit note. Example via CLI:
maxxwell lane note set service-a-auth-claude \
"Goal: add MFA to login flow using TOTP, no changes to signup."
In the app, that note sits at the top of the lane.
When reviewing a session, ask the orchestrator:
“Compare the last 10 messages in
service-a-auth-claudewith its goal note. Is it still building MFA for login only?”
The orchestrator will:
Remember: it does not automatically re-aim the session. It only surfaces the mismatch so you decide.
Common failure:
service-a-auth-claude vs its goal note.”This is where Maxxwell earns its “agent-of-agents” posture: it doesn’t try to be smarter than you; it just keeps the work visible and comparable to stated goals.
One last operational detail: Maxxwell doesn’t kill sessions when you quit.
When you reopen the app or pane later:
not heard from instead of pretending it’s workingCommon failure:
maxxwell fleet list If a lane is still working, attach instead of spawning a new one.
With that, you’ve effectively turned a chaotic herd of agent tabs, browser windows, and terminals into a single Maxxwell control pane, with repo/feature categorization and legible states.
You don’t modify the agents at all. For local ones, start them via maxxwell worker start so Maxxwell owns the session lifecycle and repo attachment. For browser/IDE agents, create manual lanes that represent them and keep their state updated via the orchestrator. All workers remain your existing tools: Claude, Codex, Cursor-agent, or your custom scripts.
No. Maxxwell does not automatically detect drift, re-aim sessions, recycle context, or restart stopped work. What it does is:
working, blocked, waiting on you, etc.)You can ask the orchestrator to compare recent work to the goal and tell you if it looks wrong, but you choose how to correct it.
Use maxxwell repo register in each repo root to give Maxxwell a stable name for that codebase. Then create tags with maxxwell tag create repo:feature, and apply them when starting workers (--tag) or adding lanes. In the pane, filter by repo and tag to see all agents touching a single feature across multiple tools.
Watch these first:
waiting on you - agents blocked on answers you haven’t givenblocked - agents stuck on missing deps or failing testsnot heard from - agents that looked working but whose state Maxxwell can no longer confirmDeal with these before spinning up new sessions. That alone drops the “I have eight sessions open and I am the slowest part of this” feeling.
Tools like Herd, Helmor, and ctx wrap agents inside their own IDE-style workspace and often introduce hosted control planes or opinionated landing flows. Maxxwell takes a different stance:
If you care about keeping your existing agent setup and just want to stop being the bottleneck, Maxxwell sits above your tools instead of replacing them.