Six tenants, one lease

One identity.
Every lab.

Work, personal, client — each profile holds its own Claude, Codex, Grok, Gemini, Cursor and opencode login. Switch them together, or pin one at a time. A macOS menu bar app and a small CLI.

MIT · Apple silicon + Intel · Sparkle self-updates

Profile Switch context. Isolate. Share. Go further.

One profile
Many labs
Your environment

Work ~/.n2-agents/Work
Claude CodeCLAUDE_CONFIG_DIR~/.n2-agents/Work/claudeConnected
CodexCODEX_HOME~/.n2-agents/Work/codexConnected
GrokGROK_HOME~/.n2-agents/Work/grokConnected
Geminino variable · swap~/.gemini → WorkPinned here
CursorCURSOR_CONFIG_DIR~/.n2-agents/Work/cursorConnected
opencodeXDG_CONFIG_HOMEno slot in this profileAvailable
Connected
Shared
Available
Not installed

Shared environment

Gemini is pinned to Work right now — every other profile sees this one.

Why Gemini is different →

$ agents use Work

Work active / 5 labs wired / v0.3.0

01 — The model

A profile is an identity,
not a login.

agents use Work moves Claude, Codex and Grok in one step — instead of switching each tool by hand and hoping you got them all.

~/.n2-agents/
  Work/
    claude/        → CLAUDE_CONFIG_DIR
    codex/         → CODEX_HOME
    grok/          → GROK_HOME
  Personal/
    claude/
    codex/
  Client/
    claude/
    codex/
    grok/
01

Separate logins, side by side

Each slot is a real config directory, so two profiles can be signed in to the same lab at once.

02

Real commands on your PATH

claude-work, codex-personal and grok-client are executables, not shell functions — editors, GUI apps and scripts get them too.

03

Adopt what you already have

agents adopt symlinks existing claudes profiles in rather than copying them, so nothing has to re-login.

02 — Isolation

Two tiers.
The lab picks, not you.

Which tier a lab gets isn't a preference. It's whatever that CLI actually supports — verified against the shipped binary rather than taken from its documentation.

ENV5 of 6 labs

Pinned per process

The CLI reads a config-dir environment variable, so two profiles run side by side — and a running session keeps its profile no matter what you switch to later.

claude-workrunning
claude-personalrunning
Claude Codex Grok Cursor opencode
SWAP1 of 6 labs

One at a time, and global

No such variable exists, so the only lever is swapping the dot-dir symlink. agents run refuses to start a swap lab as a non-active profile unless you pass --switch — because that's a side effect you should see coming.

Gemini

Gemini's GEMINI_DIR looks like an environment variable, but in the shipped source it's a constant equal to ".gemini". That one line is the whole reason it's the only swap lab — and why agents vendors prints the live table instead of a hard-coded one.

04 — The CLI

The whole app,
minus the menu.

agents is the authoritative implementation — the menu bar is a reader of it. Tab completion ships for zsh, bash and fish.

agents listProfiles × labs, and which is active
agents use Work [--vendor codex]Switch every lab at once — or just one
agents run --best [--vendor claude]Open whichever profile has the most quota left
agents bestPer-profile usage across the 5h and 7d windows
agents vendorsLabs found on this machine, and how each isolates
agents new Client --vendors codex,grokCreate a profile, or add labs to one
agents sessions Work --vendor codexList Claude and Codex transcripts
agents transfer <id> --to PersonalMove a session to another identity
agents adoptImport existing claudes profiles by symlink
agents shimsSync the <lab>-<profile> commands on your PATH

Adding a lab means adding one case arm to each accessor in vendors.sh. Nothing in agents or the menu bar app has to change.

05 — Supported labs

Six today.
The table is the interface.

LabCLIConfig homeIsolationDesktop appUsage APISessions
Claudeclaude~/.claudeENVcloned per profileYESYES
Codexcodex~/.codexENVcodex appYES
Grokgrok~/.grokENV
Cursorcursor-agent~/.cursorENV
opencodeopencode~/.config/opencodeENV
Geminigemini~/.geminiSWAP

Only Claude exposes a server-side quota endpoint today, so agents best ranks Claude and tells you plainly that the others have nothing to rank.

06 — Move in

Stop switching
six things by hand.

curl -fsSL https://raw.githubusercontent.com/noisyneighborstudio/n2-agents/main/install.sh | zsh

The installer prefers the signed release and falls back to building from source. It puts agents and the per-profile commands on your PATH, and adds tab completion for whichever shells you have.

Download the latest release