The safe, dependable coding agent for enterprises.
Give developers an agent that can get to work. Keep model access, network permissions, and changes to your files under your control.
John is the coding agent your security organization has been waiting for.
╭─────────────╮ │ >_ john. │ ╰─────────────╯ signed in as dana@example.com · single sign-on workspace protection: 2 path rule(s) · protected paths are not the agent's to change ● sandbox ready ❯ the retry in billing/client.go gives up on 429s. fix it and prove it. ● read billing/client.go, client_test.go, go.mod └ 3 files · 412 lines → Found it: the 429 branch returns the response instead of retrying. I'll honour Retry-After , cap the backoff at 30s, and add a test that proves it. ● edit billing/client.go +34 −6 ✗ run go test ./billing/... FAIL · 1 test ├ --- FAIL: TestRetry429 (0.02s) └ client_test.go:88: gave up after 1 attempt, want 4 ● proxy GET proxy.golang.org/golang.org/x/time/@v/list allowed ✗ proxy POST https://telemetry.vendor.io/v1/events reject ● edit billing/client_test.go +21 −0 ● run go test ./billing/... ok · 12 passed └ ok payments/billing 0.31s → 429 is now retryable with Retry-After honoured, capped at 30s. • billing/client.go — retry loop handles 429 and 503, with jittered backoff • billing/client_test.go — TestRetry429 asserts four attempts and the cap A dependency tried to post build telemetry. You rejected it and I did not retry. Nothing has reached your working directory yet — run /diff to review. ❯ /diff ● apply billing/client.go, billing/client_test.go 2 files → ~/src/payments ❯ /quit
Developers get the agent. Security keeps control.
John gives engineering teams a capable coding agent, and gives the organization the controls to decide what it can see, where it can reach and which models it uses.
Agent works in a sandbox
Each project gets its own Linux VM, keeping the developer's machine fully out of the agent's reach.
Protect your IP
Centrally route sensitive work to internally hosted models, and redact secrets and internal names from anything sent to external ones.
Centrally control what the agent can reach
No network access by default. Managed policies decide which outbound requests are allowed.
The agent loop runs on your backend
Every model call is made by your server. Developer machines hold no model credentials, so there's no way around your controls.
Fits the enterprise stack
Self-hosted, SSO via your identity provider, centrally stored encrypted session logs, and open source under MIT.
Central control over everything.
The web console is built into the backend. Administrators set the rules, choose the models, answer access requests and track spend, all in one place.
Set the rules once
Bundle policies into groups, attach them to teams, and mark one as the baseline that no team can weaken.
- Protect paths like
.envand.git - Redact secrets and internal names
- Route sensitive work to internal models
Models and routing
Add the external and self-hosted models the backend can use. A model is only available to the teams a routing policy assigns it to.
- External and self-hosted models side by side
- Cost per million tokens, in and out
- See which routing policies use each one
Exceptions without the Slack thread
When the agent hits something blocked, a developer can ask for access right from the prompt. Administrators see exactly what was blocked, and approving it creates the policy.
- The real blocked request, not a description
- The decision applies to the next attempt
Know what AI costs
Tokens, sessions and spend across the organization, by day, by model, by team and by person.
- Spend per model, per team and per person
- 7, 30 or 60 days
An awesome developer experience.
If you've used Claude Code, Codex or OpenCode, you already know how to use John. Type john in a project, sign in once with SSO, and start working.
No approval fatigue
Commands run in the sandbox without asking, on an overlay filesystem. You choose when changes reach your machine.
A real Linux machine
Install compilers, packages and system libraries, and run the full test suite. Not a restricted shell.
Review the diff, apply what you want
The agent's changes collect in the sandbox. Pick files or apply everything in one go.
The project defines its toolchain
A .john/Dockerfile gives every developer the same ready-to-go environment.
Same paths as your machine
Your project has the same path inside the sandbox, so stack traces and build caches line up.
Blocked isn't a dead end
When a request isn't covered by policy, request access right from the prompt.
The agent runs in your network, under your rules.
Developers get a client that carries out commands in a sandbox on their machine. The agent itself runs on a backend you host, and every AI request passes through it, checked against your policies and routed to an internal or external model.
Run john in a project and describe the task. Nothing has left your machine yet.
- You write a prompt. Run john in a project and describe the task. Nothing has left your machine yet.
- The prompt goes to your backend. The CLI sends it up, signed in with SSO. The agent itself doesn't run on the laptop.
- Your policies apply. Your team's policies are looked up, and secrets and internal names are redacted.
- The backend picks the model. It chooses from the models your team is allowed to use. Sensitive work is routed to an internal one.
- Internal model: nothing leaves. A model you host yourself. The request never leaves your network.
- External model, only if allowed. A provider on the internet, reached only when your policies allow it.
- The model asks for a tool call. An edit to a file, say. The backend sends it down to the CLI.
- The sandbox runs it. Commands are run inside the Linux VM.
- Changes go to an overlay. The sandbox reads your real files, but every change lands in a layer inside the VM.
- Network access goes through the proxy. Every outbound request is checked against policy. Anything not allowed is blocked.
- The result goes back up. The output returns to the backend, and the loop continues.
- You review and apply. john apply shows the changes and writes the ones you pick to your project. Nothing else touches your files.
Break the lethal trifecta.
An AI agent with private data, untrusted content and a way to send data out can be tricked into leaking it. In a coding agent the first two come with the job: your repository is both. John lets you close the third.
Turn network access off, or limit it to an allow-list, and route sensitive teams to internally hosted models. Model calls only ever leave through your backend, so there is no other way out.
Injected instructions can still try to change your code. That arrives as a diff for you to review, not as a file already changed.
All the little details.
The full list for developers, security, audit and IT.
For developers
14- Reads, edits, runs and testsChange files, run the build and the tests, and iterate, all inside a real Linux machine.
- A full Linux machine per projectNot a restricted shell: install compilers, package managers and system libraries the way the project needs them.
- Toolchain from the project's Dockerfile
.john/Dockerfiledefines the sandbox, so everything is installed before the agent starts. - Warm sandboxesTools, dependencies and build caches survive between sessions, until the sandbox is reset.
- Same paths as the hostThe project has the same path inside the sandbox, so stack traces and build caches line up.
- Review the diff, apply what's picked
john applywrites all of the changes, or just the paths selected. - No approval promptsReading, editing and running commands never stop to ask.
- Mention files, images and PDFsPoint the agent at a file with
@, or attach a screenshot or document to the prompt. - Resume earlier conversations
/resumelists earlier sessions in the project and picks one back up. - Ask for access on the spotWhen a request is blocked, file an access request from the prompt and follow it in the console.
- More CPU or memory when needed
/resources cpu=8 memory=16for the project that needs it, with no administrator involved. - Choice of approved modelsSwitch between the internal and external models the team is allowed, with
/model. - A console for developers tooPersonal usage and spend, team memberships, and exactly which policies apply.
- One CLI on every platformmacOS, Windows and Linux, signed in once with
john login.
For security teams
19- A virtual machine per projectHardware-level isolation, one VM per working directory, with no sharing between them.
- Only the working directory is mountedNo home folder, no other repositories, no keychain.
- Protected pathsExclude paths, mount them read-only, or block deletion:
.env,.git, CI workflows. - No host credentialsNo SSH agent, environment variables, Docker socket or devices inside the sandbox.
- Proxy-only networkHTTP and HTTPS through the proxy. Every other protocol and direct connection is blocked.
- Checks the request, not the hostnameTLS is terminated on the developer's machine, with a per-sandbox certificate authority that never leaves it.
- Request-level rulesMatch method, host, port, path, selected headers and query parameters, and cap body sizes.
- Unknown means blockedAllow, deny, or ask the developer. Anything no policy covers is blocked.
- Approve one request, not a hostAn ask-developer match shows the whole buffered request, and approves only that one.
- Redaction and aliasingRegex replacements run on everything bound for a model, before routing.
- Keyword routingA listed keyword in a prompt, file or command output moves the session to internal models.
- Policy groupsControls bundled once and attached to teams, instead of copied per team.
- A baseline no team can weakenAttached to every team. Where policies conflict, the most restrictive one wins.
- The agent runs on the backendClients hold no model credentials, so there is no second path to a model.
- Governed image buildsOptionally send build traffic through the proxy, to record it or apply the same policies.
- Attachment controlsBy default, images and PDFs are refused in sessions under redaction or routing rules, since text rules can't read them.
- No plugins or MCP serversRead, edit and run is the whole surface. The agent can't extend its own reach.
- Signed policy snapshotsClients enforce a signed copy of their policies, visible with
/policies. - Fails closedNo policy decision, no operation. A short cache rides out brief outages.
For audit and compliance
8- Encrypted session tracesA complete record of every session, each encrypted with its own key.
- A read key the backend never holdsTraces decrypt in the browser. A stolen database or backup reveals nothing.
- Change historyWho changed which policy, group, request or setting, and when, readable without unlocking any trace.
- Every network decision recordedIncluding the requests a developer approved by hand.
- Separation of dutiesDevelopers request access, administrators decide. Nobody approves their own exception.
- Attachments on the recordName, type, size and SHA-256 of every file sent to a model.
- Developers can read their own sessionsWith a key kept on their own machine.
- Kept until deliberately deletedTraces never expire on their own.
For IT operations
12- One binary, one SQLite databaseNo cluster, no queue, no second service. Scale it vertically.
- Browser-based setupFirst run prints a one-time setup URL. Everything else lives in the database, with no config files.
- SSO with any OIDC providerSign-in, teams and roles through the organization's own identity provider.
- Behind the existing reverse proxyListens on localhost; put any HTTPS reverse proxy in front of it.
- Clients served by the backendDevelopers download the right build for macOS, Windows or Linux from the console.
- Clients stay in stepA client that doesn't match the backend's version is offered the matching build before a session starts.
- Credentials in the OS keychainLogin tokens and registry passwords go to Keychain, Credential Manager or the desktop keyring.
- Private registriesUses existing Docker credential helpers, or
john registry login. Credentials stay on the host. - Usage and spendPer team, model and person, over 7, 30 or 60 days.
- Simple backupsThe database and the trace directory are the whole state.
- Built-in hypervisorsVirtualization.framework on macOS, Hyper-V on Windows, KVM with libkrun on Linux.
- Standalone modeTry it on one laptop with an Anthropic, OpenAI or Gemini API key.
Before you ask.
We already run a coding agent in a Docker container. Why John?
A container limits what the agent can damage on the laptop. It does not control what leaves it.
Network: by default a container can reach the whole internet, and nothing inspects what it sends. Model access: the agent calls the provider directly, on a developer's key, with no redaction, routing or central record. Mounts: the usual conveniences (~/.ssh, cloud credentials, the Docker socket) hand the boundary back, and a bind mount lets the agent edit real files as it goes.
John also isolates each project in a full virtual machine, a hardware boundary, rather than a container that shares the host's kernel.
All of this can be built by hand: a hardened image, an inspecting proxy, a model gateway, central policy, and a way to keep every laptop up to date. John is that work, done once.
What is John?
A coding agent, like Claude Code or Codex, plus the controls around it. The agent runs on a backend the organization hosts; the client on each developer's machine carries out its commands inside a sandbox. Administrators decide which models it uses: internally hosted, external, or both.
How is this different from an enterprise plan of Claude Code, Copilot or Codex?
Enterprise plans add SSO, seat management, an admin console and retention terms. The agent still runs on the laptop with the developer's files and credentials, its network traffic is not inspected, and the records live with the vendor. John runs the agent on the organization's own backend, sandboxes every command, checks every outbound request against policy, and keeps the records in-house.
Does it slow developers down?
It is designed not to. Reading, editing and running commands never ask for approval. A developer is interrupted only when a policy says to ask about a specific request. Blocked requests can be turned into an access request on the spot. Each project keeps its sandbox, with tools, dependencies and build caches intact, between sessions.
How is the sandbox set up?
From a .john/Dockerfile in the project, or a built-in default image. Compilers, test runners and internal packages are installed before the agent starts, so the agent can work with the network off.
Image builds can reach the network by default, so they can install tooling. Administrators can instead send build traffic through the proxy, to record it or to apply the same policies as the agent.
Each sandbox has default CPU, memory, disk and process limits. A developer can raise them for a project with /resources.
How do the agent's changes reach my files, and can it delete my work?
The project is mounted copy-on-write. Every edit and deletion lands in the sandbox, not on disk. john apply (or /apply) shows the diff and writes the changes the developer picks, all of them or by path.
So the agent cannot touch uncommitted work. Unapplied changes stay in the sandbox between sessions, and are discarded if the sandbox is reset.
How does the network proxy work, and can it be bypassed?
The sandbox has no direct network access. Its only way out is a proxy that runs outside the VM, on the developer's machine. Protocols other than HTTP and HTTPS are blocked.
The proxy terminates TLS so it can check the whole request, not just the hostname. The certificate authority for this is created on the developer's machine for each sandbox and never leaves it.
Every request is checked on its own and gets one of four outcomes: allowed, denied, held for the developer to approve, or, if no policy covers it, blocked. Each decision is recorded in the session trace.
What can a policy express?
Policies match the details of a request or a path, so they can be precise. For example:
“Install packages, but never publish them.” Allow GET on the registry. The publish endpoint matches nothing, so it is blocked.
“The payments code stays on internal models.” A routing keyword moves any session that mentions it to internally hosted models.
“Nothing touches .git or CI.” Those paths are excluded from the sandbox or mounted read-only.
“Contractors get less than staff.” Their team carries fewer policy groups, on top of a baseline no team can weaken.
Does our source code go to a model provider?
Only where policy allows. Every model call is made by the backend, which first applies replacements (redacting secrets, aliasing company names) and then checks routing keywords. A keyword match moves the rest of the session to the models its policy allows, usually internal ones, and it never moves back. Replacements cannot catch every sensitive value, so restricted projects should use internal models only.
Can John be prompt-injected? What are the known risks?
Yes. John assumes injected instructions will reach the model, from files, dependencies, command output or web content. The defence is that the model cannot decide anything that matters: the sandbox, the proxy and the backend do.
The main remaining risks: sensitive data reaching a provider (high), since redaction is not perfect; prompt injection itself (high), which is contained, not prevented; changes applied without real review (medium); and abuse of an allowed destination (medium), which is why policies should default to read-only methods and narrow paths.
The full list and threat model are in the readme's security section.
Why doesn't John support MCP servers or plugins?
On purpose. The agent can read files, edit files and run commands in the sandbox, and nothing else. If it could load tools, it could reach past the sandbox and the policies. Anything a project needs can be installed in the sandbox image instead.
Who can read the session traces?
Every session is recorded and encrypted. Administrators read traces with the organization's private key, which is kept outside the backend; decryption happens in the browser. Developers can read their own sessions with a key kept on their machine.
The backend can only append to a session while it is running. To resume a conversation, the client hands back the key, never the conversation itself. Traces are kept until someone deletes them.
Does John help with compliance?
John is not a certification, but it turns audit questions into records: who used the agent, what they were allowed to do, what left the machine, where code was sent, and who changed the controls.
Every policy and setting change is versioned in a change history showing who did what and when, readable without unlocking any session. Developers can request access, but only administrators can grant it, and the baseline cannot be weakened by any team.
What happens if the backend goes down?
John fails closed. Prompts stop at once, because the agent runs on the backend. Network policies are cached for a few minutes so a running command can finish; after that, anything that needs a policy decision is blocked until the backend is back.
What does it take to run?
The backend is one Linux service with a SQLite database. No cluster, no managed database, and no vendor cloud in the path: the only outside party is whichever model provider the policies allow.
The client runs on macOS (Apple Silicon and Intel), Windows (x86-64) and Linux (x86-64 and arm64), using the built-in hypervisor on each to run the sandboxes.
Get started.
Free and open source under MIT. One binary, no cluster.
Try it on your laptop
Standalone mode runs the whole thing on your machine, with your own Anthropic, OpenAI or Gemini API key. No server needed.
On your machineRoll it out to your team
One backend on a Linux host, signed in with your SSO. Policies, models and teams are set up in its web console.
On your server