Jack Jack agents that cooperate via files
macOS Download
Claude Code, OpenAI Codex, Gemini ship today

The macOS GUI for Claude Code, OpenAI Codex & Gemini CLI.

Jack is a free macOS desktop app that runs Claude Code, OpenAI Codex and Google Gemini side by side. Three terminals down to one app — workspaces, sandboxed runs, real git tooling, and a permission inbox you can answer from your phone, for every agent CLI you already pay for. Coding agents that cooperate through your filesystem, not a proprietary engine.

Apple Silicon & Intel

Wire any CLIOpen Provider SDK on npm
0 €Free for individuals, forever
100% localNo account, no cloud, no telemetry by default
Jack chat surface — sidebar, AgentChat with edit tool, permission card

What's inside

An IDE-grade shell around the agent CLIs you already use.

The agent CLIs already exist. Jack is what wraps them: workspaces that map agents to folders, multi-provider sessions in the same project, real git tooling, sandboxed runs, and a phone in your pocket that pings when an agent needs you.

Workspace-primary

The unit of work is a project — folders, agents, shared docs — not a single chat. Pick from 15 icons × 10 accents per workspace; no two of your projects look alike.

Pluggable providers

Claude Code, OpenAI Codex and Gemini ship today. The contract is open — wire in another agent via the Provider guide, same UX, same permissions.

Cooperation, not orchestration

Agents read and write to _shared/ like a human team would. Roles stay portable agent.md files. No DAGs, no proprietary protocol, no lock-in.

Permissions, in one place

Every tool call gates through the same card across providers: Deny, Allow, or Always allow pnpm test. Jack remembers and stops asking.

Docker sandbox

One toggle and the agent runs inside a container. Workspace mounted read-write, your auth read-only, hooks & MCP stay on the host. Sandbox or don't — it's per session. More on the Docker sandbox →

Side-by-side diff & merge

CodeMirror Merge inside the file viewer. Compare to HEAD, the index, or any branch. Stage hunks. Resolve conflicts visually. Never alt-tab to your IDE again.

Real git, not a button

Per-folder panel, hunk-level staging, worktree creation, three-way conflict resolver — all backed by simple-git and audited in git_ops. Hooks honored.

Permission inbox on your phone

Pair via QR. Every agent permission card lands as a push notification — approve, deny, or always-allow inline. More on the permission inbox →

Provider-aware usage chip

Claude Pro/Max sees the 5h and 7-day rolling bars. Codex sees per-session context tokens. Gemini sees what its ACP exposes. Each session gets the right meter.

Workspaces, not chats

A project lives longer than any single chat.

A workspace is a project + the agents that work on it. Folders (multi-root), agents bound to folders, shared docs (AGENTS.md, _shared/specs/, _shared/api/), worktrees, and the live session pool — all behind one sidebar entry, one icon, one accent colour.

Workspace board — agent strip, shared structure, triggers, activity drawer
Workspace agent canvas — React Flow node graph with trigger edges

Agents are slots, not pinned sessions.

The same backend-dev slot can host one Claude session implementing a feature and one Codex session reviewing it, side by side. Per-session provider, last-used default, click-once spawn. Triggers are optional file-watcher rules — opt in per pattern, off by default.

  • Drag-positioned agent nodes, persisted per-workspace.
  • Same workspace can mix Claude, Codex and Gemini sessions at once.
  • Dashed edges for inactive triggers, glowing edges for live ones.
  • System nodes for sourceless rules ("every spec write notifies Porter").

Open multi-provider contract

Three providers ship today. The list isn't closed.

Jack runs Claude Code, OpenAI Codex and Google Gemini side by side out of the box. The provider is a per-session choice — and the contract that lets these three plug in is the same contract a fourth provider would use. Anything that implements the SDK is a first-class citizen.

Provider
Backend
Account & usage
Permissions
Cl
Claude Code
Anthropic
SDK + CLI
Pro / Max — 5h and 7-day rolling quotas
Per-call canUseTool + cookie-tracked usage chip
Cx
OpenAI Codex
OpenAI
@openai/codex-sdk
API key — per-session token counts
Sandbox + approval policy
Gm
Google Gemini
Google
gemini-cli ACP / JSON-RPC
OAuth — token counts
Per-call request_permission

Detected on your machine

When a provider's CLI ships a breaking change, Jack flags it instead of failing silently. The chip below is what Jack will show you in-app — green when wired, amber when a feature regressed, grey when not detected.

Cl
Claude Code ✓ supported
SDK 1.4.x · CLI 0.x · usage chip live
Cx
OpenAI Codex ◐ partial
SDK 0.5.x · sandbox wired · per-session token counts pending
Gm
Google Gemini ✗ not detected
Run npm i -g @google/gemini-cli and Jack will pick it up on next launch.

Build your own provider.

The Provider guide and the contract types are public on npm and GitHub: @ottimis/jack-provider-sdk and @ottimis/jack-chat-core. Implement the interface, declare a capability matrix, plug in. The Jack runtime is closed; the contracts that let third parties plug in are not.

Cooperation, not orchestration

Two agents. One feature. Zero coordination layer.

A backend-dev on Claude implements an endpoint and writes the contract to _shared/api/auth.md. A reviewer on Codex reads the same file, opens the diff, and leaves notes. They never call each other. They never share a runtime. The "protocol" is your repo.

your-repo/ version-controlled · portable · git-tracked
├── AGENTS.md                      # who owns what — read by every agent
├── _shared/
│   ├── specs/
│   │   └── magic-link-login.md    # product → backend-dev
│   ├── api/
│   │   └── auth.md                # backend-dev → frontend-dev, reviewer
│   ├── decisions/
│   │   └── 0007-jwt-rotation.md   # sticky ADRs
│   └── questions.md               # cross-agent open questions
├── apps/
│   ├── api/                       # backend-dev's folder
│   └── web/                       # frontend-dev's folder
└── .jack/
    └── agents/                    # role overrides — committed if you want

Portable role files

Roles are plain agent.md files. Drop them in your agents folder, in your repo, or in your home dir — same format Claude Code, Codex and Gemini already understand. They work outside Jack, too.

File-mediated coordination

Cross-agent boundaries pass through _shared/api/, _shared/specs/ and _shared/decisions/. Diff it, blame it, revert it — it's just your repo.

AGENTS.md as ownership map

One file at the repo root says who owns what — which agent writes to which folder, which boundaries are read-only, who reviews whose work. Every agent reads it before touching the tree. Conflicts you'd otherwise resolve in PR get caught at write-time.

Survives outside Jack

Open the same repo in plain Claude Code, in Codex CLI, in someone's vim plugin — the roles and the shared docs still make sense. Jack adds the UX, not the dependency.

And when one agent's done, the next one starts — see Handoffs below. Team review delegation across machines is on the roadmap, not in v1: the hard part is keeping coordination file-mediated even across machines. We're not shipping that until it's right.

Deep dive: how AI coding agents cooperate without an orchestrator →

Handoffs

When one agent finishes, the next one starts — no orchestrator, no DAG, no proprietary protocol.

Your backend-dev on Claude finishes and drops the spec in _shared/specs/auth.md. A watch on that path fires the prompt for your reviewer on Codex, with the file already loaded as context. You were on the couch. By the time you're back at the desk, the handoff has already happened — and the Activity log shows you exactly what fired, line by line.

backend-dev (Claude)
      │
      └── writes ──▶  _shared/specs/auth.md
                              │
                              ▼
                        trigger
                              │
                              ▼
                      reviewer (Codex)
                      # prompted, with the file as context

Six handoff patterns ship by default.

They're the workflow primitives a human team would already use — specs land, reviewer reads. Question gets posted, expert answers. Decision is recorded, everyone gets the ADR. Task is done, opener gets pinged.

When a spec is written

Fires when any .md file under _shared/specs/ is created or updated.

When a question is posted

Fires when _shared/questions.md is modified.

When an ADR is added

Fires when any file under _shared/decisions/ is created or updated.

Assigned

When a task is assigned to me

Fires when a new file appears in _shared/tasks/ whose name starts with this agent's slug. The agent gets pinged so it picks up the assignment without polling the folder.

Dynamic routing

When a task I opened is completed

Fires when any task file under _shared/tasks/ flips to status: done. The notification is routed back to whoever opened the task — resolved dynamically at fire time, no per-pair configuration needed.

Custom (advanced)

Define your own path pattern and optionally a text-content regex.

Auditable, line by line.

Every file event, every fire, every skip lands in the Activity panel with a timestamp. Filter by Fired, Observed, Skipped, or Errors. When a handoff doesn't happen, you see why — not "task complete" on a task that silently failed.

Activity
All Fired Observed Skipped Errors
12:51:10 FIRE reviewer (Codex)_shared/specs/auth.md
12:51:10 OBS system → _shared/tasks/frontend-0001-message-type-preview-rendering.md
12:50:42 FIRE porter (Claude)_shared/decisions/0007-jwt-rotation.md
12:48:15 SKIP _shared/specs/draft.md · filter regex did not match
12:45:01 OBS system → _shared/questions.md

This isn't an orchestrator. There's no DAG editor, no graph runtime, no "manager agent" deciding who runs next. A trigger is a path pattern, an optional filter, an action — three things you could write in a shell script, surfaced in the workspace and auditable in the UI. After watching three orchestrators deprecate in a year, we picked the primitive that doesn't break: files watching files.

Deep dive: how AI coding agents hand off work to each other →

Permission inbox

Approve, deny, or "always allow pnpm test" — from the desk or the bus.

When an agent asks for a tool call, the same request lands in three places at once: the chat where it was raised, a global inbox across all your sessions, and a push notification on your paired phone. You answer from any of them. The agent gets the response through the same channel. No timeout, no silent abort, no "task complete" on a task that was actually waiting for you.

Permission inbox — desktop card, global inbox, mobile push card on phone

Discoverable, never silent

When a Claude or Codex session needs you, the chat, the inbox and your phone all light up. No more "task complete" on a task that was actually blocked on a permission three hours ago.

Always-allow with scope

Approve pnpm test for this session, this workspace, or globally. Jack remembers across providers — the rule applies whether the next request comes from Claude, Codex or Gemini.

Mobile cards, not just notifications

Pair via QR. Push lands on your phone with the full request — tool name, target file, payload preview. Approve or deny inline, in one tap. SSE fallback keeps the channel alive when push doesn't reach.

No silent timeouts

Permission requests don't auto-expire after 30 seconds. The agent waits, you decide when you're back. Configure a global TTL — or disable it entirely and never lose work to a missed notification again.

Deep dive: how to approve AI coding agent permissions from your phone →

Git that doesn't fight you

A real diff editor and a real conflict resolver — built in.

Stop alt-tabbing to your IDE just to read a hunk or pick a side. Jack ships a CodeMirror Merge view with stage-per-hunk, a 3-way conflict resolver, and worktree management.

File viewer in Diff mode — CodeMirror Merge with hunk staging panel

Side-by-side diff with hunk-level staging.

Compare the working tree to HEAD, the index, or any branch — the picker is one click away. Stage individual hunks straight from the diff. The same view also powers "show me what the agent is about to write" before you allow.

  • CodeMirror Merge under the hood, collapsed unchanged regions.
  • Hunk IDs stable — the foundation for inline review comments.
  • Reads via git show :path, writes via git apply --cached. No surprises.

Resolve conflicts without leaving Jack.

When a merge hits conflicts, Jack drops a banner, lists the offending files, and the file viewer auto-routes to a per-chunk resolver. Pick ours, theirs, both, or hand-edit. No re-learning a 1990s 3-pane UI.

  • Parser handles both merge and diff3 styles.
  • "Mark resolved" stays disabled until every chunk is resolved.
  • "Open in IDE" is one click away for the rare exotic case.
  • Same primitives will power delegated review for teams.
Conflict resolver — per-chunk Take ours / Take theirs / Both / Edit
Workspace git panel — staged / unstaged / commit composer / recent commits

Stage, commit, push, worktree — auditable.

Every write op goes through a per-repo lock and lands in git_ops. Pre-commit hooks honored. Pushes use --force-with-lease only — never naked force.

  • Per-folder staged / unstaged / conflicts breakdown.
  • One-click worktree add → automatically tagged as Jack-owned.
  • Click any dirty file → opens in the diff editor.

Common questions

Frequently asked questions about Jack

Honest about scope: macOS-first today, single-user today, free today. The roadmap is interesting because it's clear what we don't ship yet.

What is Jack?

Jack is a free macOS desktop app that runs Claude Code, OpenAI Codex and Google Gemini side by side in workspace-primary projects. Agents cooperate through plain files in your repo (no proprietary protocol), runs are sandboxable in Docker, every tool call is gated by a permission inbox that reaches your phone, and the entire app stays local — no account required, telemetry off by default.

Do I need a Claude, OpenAI or Google subscription?

You need at least one to actually run an agent — Jack is the shell, not the model. Jack itself is free, no account required.

Can I use just one provider?

Yes. Detect probes find what you have installed; missing providers are hidden. Three-provider workflows are powerful, but Jack works just as well with only Claude, only Codex, or only Gemini.

Where does my code go?

Nowhere we control. Sessions run on your machine, talking to the provider you chose. Jack stores its own metadata locally in SQLite under ~/Library/Application Support/jack/.

Is Jack open-source?

The Jack runtime is closed today. The contracts that let providers plug in are open: @ottimis/jack-provider-sdk and @ottimis/jack-chat-core are public on npm, and the Provider guide lives at github.com/ottimis/JACK-provider-sdk. Anyone can write a third-party provider package — the same contract Claude, Codex and Gemini use today.

Can I add a provider that isn't Claude, Codex or Gemini?

Yes — that's the point of the open contract. Implement JackProvider, declare a capability matrix, ship a tool catalog and a translator. The Provider guide walks through both architectural patterns (agent-as-runtime and agent-as-reasoning-layer with the client executing tools via JSON-RPC). Your provider gets the same UX, permissions, sandbox and usage chip as the bundled three.

Windows or Linux builds?

On the technical roadmap. Mac builds ship today; Windows and Linux follow as native blockers (better-sqlite3, node-pty, dockerode) clear.

Is there a mobile app?

A companion app for receiving notifications and approving permission requests when you're away from the desk. Not a full mobile IDE — pair via QR, get pushed permission cards on your phone, approve or deny remotely.

Telemetry?

Opt-in only. Sentry for crashes, PostHog for product analytics, both gated by a consent dialog at first boot. Anonymous device ID, no user identity, no project paths, no prompt content. Whitelisted event names, off by default.

Free for solo. Team layer for teams.

Everything that runs on a single machine is free, forever.

The split is clean: anything that runs on one developer's machine stays free. Anything that involves more than one person is the future paid layer — built on the same primitives, opt-in.

Local

Free · forever · no account · uses your provider subscriptions

  • Unlimited parallel sessions across Claude, Codex and Gemini
  • Workspace-primary structure with multi-folder agents
  • File-mediated agent cooperation (_shared/, AGENTS.md)
  • Sandboxed Docker runs, per session
  • In-app side-by-side diff, hunk staging, conflict resolver
  • Worktree management with full audit log
  • Mobile companion (your devices only)
  • Provider-aware usage chip per session
  • Telemetry off by default
Coming soon

Team

Per-seat · early access

  • The same handoff primitives, networked. When your reviewer agent finishes, it pings a teammate's agent on a different machine. The dynamic routing of "whoever opened the task gets the ping" works across machines the same way it works locally. No new mental model — just a transport swap.
  • Live chat sharing between team members
  • Shared audit log and workspace-level access controls
  • Centralized billing for team plans

The team layer is built on top of the same Git, Diff, and Workspace primitives. No data leaves your box unless you choose.

Three terminals down to one app.

Jack is free, local, and reuses the AI subscriptions you already pay for. Every keystroke stays on your machine.

Download for macOS Read the feature tour
Or pick the build manually: Apple Silicon · Intel