When a spec is written
Fires when any .md file under _shared/specs/ is created or updated.
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.
What's inside
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.
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.
Claude Code, OpenAI Codex and Gemini ship today. The contract is open — wire in another agent via the Provider guide, same UX, same permissions.
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.
Every tool call gates through the same card across providers: Deny, Allow, or Always allow pnpm test. Jack remembers and stops asking.
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 →
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.
Per-folder panel, hunk-level staging, worktree creation, three-way conflict resolver — all backed by simple-git and audited in git_ops. Hooks honored.
Pair via QR. Every agent permission card lands as a push notification — approve, deny, or always-allow inline. More on the permission inbox →
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 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.
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.
Open multi-provider contract
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.
canUseTool + cookie-tracked usage chip@openai/codex-sdkrequest_permissionDetected 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.
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
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.
├── 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
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.
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 mapOne 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.
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
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
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.
Fires when any .md file under _shared/specs/ is created or updated.
Fires when _shared/questions.md is modified.
Fires when any file under _shared/decisions/ is created or updated.
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.
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.
Define your own path pattern and optionally a text-content regex.
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.
_shared/specs/auth.md
_shared/tasks/frontend-0001-message-type-preview-rendering.md
_shared/decisions/0007-jwt-rotation.md
_shared/specs/draft.md · filter regex did not match
_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
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.
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.
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.
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.
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
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.
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.
git show :path, writes via git apply --cached. No surprises.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.
merge and diff3 styles.
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.
Common questions
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.
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.
You need at least one to actually run an agent — Jack is the shell, not the model. Jack itself is free, no account required.
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.
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/.
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.
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.
On the technical roadmap. Mac builds ship today; Windows and Linux follow as native blockers (better-sqlite3, node-pty, dockerode) clear.
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.
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.
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.
Free · forever · no account · uses your provider subscriptions
_shared/, AGENTS.md)Per-seat · early access
The team layer is built on top of the same Git, Diff, and Workspace primitives. No data leaves your box unless you choose.
Jack is free, local, and reuses the AI subscriptions you already pay for. Every keystroke stays on your machine.