Solo or co-op.Same walls.
What your agent can do on one laptop, and across a team. Every feature is listed at the end.
curl -fsSL https://fenzi.dev/install.sh | sh
Linux, Apple Silicon, WSL 2. Free at work too.
Pick a missionMissions19
Pick a mission.
Each tile jumps to one problem and how Fenzi solves it. The Missions button keeps the list one tap away.
AI will not end the world.
It will keep asking until you allow everything.
Ordinary problems, with engineering answers. Each card opens the mission that answers it.
Every tool, wide open.
The server's token sits in a config file the agent can read, and every tool it offers is allowed.
One agent at a time.
Nothing keeps two agents apart on one laptop, so the second task waits.
Set it all up again.
A new agent means new MCP servers, new keys and new rules, typed in from memory.
Allow everything.
The prompts got in the way, so the agent got full access. Nobody can say what that covers.
Day one starts from zero.
Each developer wires up servers, hosts and rules by hand, and no two laptops match.
An advisory names a host.
Nobody can say which laptops reached it, or when.
Your agent. Your laptop. Your call.
Fenzi starts your agent inside a sandbox on your own machine.
A prompt is a wish. A sandbox is a rule.
Connect every MCP server you use. Allow only the tools you mean.
List each server once in fenzi.yaml, with the tools the agent may call. Fenzi writes it into each agent's own config format, and the sandbox checks every remote call against that list.
A server's token is stored with fenzi mcp token, outside the sandbox. The agent holds a placeholder, and the real token goes only to that server. fenzi mcp import starts you from the .mcp.json you already have.
fenzi mcp importfenzi mcp addfenzi mcp tokenYour claude.ai connectors, one tool at a time.
The connectors you added on claude.ai come with your Claude sign-in and share one Anthropic host. Without an entry the sandbox refuses that host. With one, it checks every call against the tool names you list.
fenzi mcp add claude-ai --claude-account --tool list_issues --tool get_issueAn agent per project, all working at once.
Start an agent in each project folder. Each one runs in its own sandbox, with that project's policy, its own log and its own staged changes, so no agent sees another project's files.
fenzi ps lists every sandbox on the machine. fenzi connect takes you back into any of them, and fenzi diff in a folder shows that project's changes.
Pick the agent per task. The rules stay the same.
The rules bind the process, whichever model drives it, so trying another agent does not mean writing new rules. Claude Code, Codex, OpenCode and Grok today. Cursor CLI and Muse are next.
Agents run with an API key. Claude Code can also sign in with your Claude subscription. ChatGPT and Grok sign-ins are not supported yet.
Fenzi starts command-line agents. A desktop editor that opens its own terminal on the host is not inside the sandbox.
fenzi run claudeClaude Codefenzi run codexCodexfenzi run opencodeOpenCodefenzi run grokGrokfenzi run --sign-in claudeYour Claude subscription
Your MCP servers, keys and rules outlive the agent you picked.
Servers you use everywhere go in one file on the machine. Keys and tokens are stored once, outside every sandbox. The project's rules live in fenzi.yaml, committed, so everyone on the project runs with them.
Switch from one agent to another and all of it comes along. Nothing is configured twice.
Claude's account connectors go to Claude Code only. A local server's secret reaches Claude Code and Codex today; OpenCode and Grok refuse it until it is tested.
| What | Set with | Lives in |
|---|---|---|
| MCP servers for every project | fenzi mcp add --machine | ~/.config/fenzi/mcp.yaml |
| MCP tokens and secrets | fenzi mcp token | The sandbox runtime on this machine |
| Model keys | fenzi key set | The sandbox runtime on this machine |
| The project's rules | fenzi init | fenzi.yaml, committed |
Let your scripts start the agents.
Most commands take --json and print one JSON document, with errors kept apart on standard error. Exit codes are fixed, so a script, a scheduler or an orchestrator of your own can tell a policy failure from a missing runtime without parsing text.
fenzi run and fenzi connect return the agent's own exit code.
| Code | Meaning |
|---|---|
0 | Success. |
1 | Error. The message says what failed. |
2 | The policy check failed. Nothing started or loaded. |
3 | The sandbox runtime is missing, outside the pinned range, or not connected. |
--json on doctor, ps, requests, approve, deny, log, mcp list, status, policy check and more.
Give it room to work. Know exactly how much.
The project copy is writable and the package indexes in the default policy are open, so edits, installs and test runs go through without you. Everything else stays shut until a line in fenzi.yaml opens it.
Claude Code starts in its manual mode and asks before each command. In auto mode it stops asking, and the policy still holds.
fenzi run claude --permission-mode autoThe agent uses your API keys. It never holds them.
Your home folder is never copied in. A project file that looks like a secret is named before anything starts, and it goes in only if you say yes.
The agent sees a placeholder. The real key is added only to requests for the endpoints that key is bound to in the policy. A Claude subscription sign-in is the exception: that token sits inside the sandbox.
Your code and your keys never reach our cloud. The model vendor still receives what the agent sends it: the files it read, command output and your instructions, as it does without Fenzi.
| Inside the sandbox | What is there |
|---|---|
| Your home folder | Nothing. It was never copied. |
| A secret file in the project | Only if you said yes when fenzi run named it. |
| The model key | A placeholder. The proxy adds the real key on model calls. |
| An MCP token | A placeholder. The real one goes only to that server. |
Let it rewrite the module. You decide what lands.
The agent works on a copy of the project. Your folder changes only when you apply, and apply refuses a file you edited in the meantime, so your own work is never overwritten.
The sandbox stays up after the agent exits. fenzi connect picks the session up where it stopped.
fenzi difffenzi applyfenzi connectNew access: asked once, saved for good.
A host not in the policy is refused, and fenzi log says why. The agent files a request with its reason, and a person answers it.
Approve with --save and the host goes into fenzi.yaml after the policy check, so the next run never asks. A host you add by hand loads onto the running sandbox with fenzi policy apply.
Requests, approvals and the log in one window.
Approve and add to fenzi.yaml shows the change and its policy check before it writes the host into the project's file.
On a machine signed in to a team, it forwards decisions and sends requests to the console. Every screen runs a fenzi command and shows the line it ran, so install the CLI first.
Install it then fenzi run claude
Same rules on every laptop.
Two seats, one log. The developer runs the agent, the security lead reads the log, and the team's servers and hosts are there from the first run.
Publish once. Every laptop takes it.
An admin publishes one policy for the team: hosts, paths, MCP servers, and the agents it covers. Each revision is checked by the prover, numbered and signed, and a machine ignores a bundle that fails the signature or is older than the one it holds.
fenzi policy publish team.yamlfenzi sync| You changed | Running sandboxes |
|---|---|
| Hosts | Load the new hosts on the machine's next sync or forwarder pass. |
| Paths, workspace access, agents | Keep the old revision. The next fenzi run creates a new sandbox. |
Walls before move-in. Doors while it runs.
A new teammate is set up after one sign-in.
fenzi login signs the machine in, and the next fenzi run uses the team's policy, MCP servers included, with any agent the policy covers. Nobody copies a config by hand, and every laptop starts from the same revision.
Each developer stores their own model key on their own machine. It never reaches our cloud.
Every allow and deny, from every laptop, in one place.
Each machine forwards its decisions, always outbound. The console filters them by machine, sandbox, destination or action, keeps them for 90 days by default, and marks a gap where part of a stream was lost.
The same records export as JSONL for your own tools.
Which laptops reached that host?
When an advisory names a host, URL or package path, paste it into Exposure. It shows which machines, sandboxes and programs reached it in the last 90 days, allowed or denied, and whether the policy in force still lists it. Nothing you paste is stored.
If the policy lists it, an admin drafts the policy without it, checks it with the prover and publishes. Running sandboxes drop the host at their next pass.
| Search: paste.example.net | |||
|---|---|---|---|
| Machine | Sandbox | Program | Action |
| dana-mbp | fenzi-web-4f2a | curl | deny |
| The policy in force does not list it. | |||
One developer asks. The whole team stops asking.
A request travels out from the machine to the console; nothing in our cloud connects in. The reviewer sees the machine, the host, the program and the agent's reason, never the code or the conversation.
Approve and add to policy opens the host for that sandbox within seconds and drafts the next revision with it, so once an admin publishes it, every laptop has the host.
| Approve | Approve and add to policy | |
|---|---|---|
| Who can | An admin or a reviewer | An admin |
| The sandbox that asked | Gets the host at its next forwarder pass | The same |
| Every other laptop | No change | Gets the host once the draft is published |
One fence around every policy.
An admin saves a team boundary, written like a policy file: the most any policy of the team may allow. A publish outside it is refused with the prover's example. An approval for a host and port it does not hold is refused too, in the console and on the machine.
Our cloud goes down. The last policy holds.
Sandboxes keep enforcing the policy they loaded, and new ones start from the last signed revision the machine verified. The agent keeps working on what the policy already allows. Requests wait, and decision records wait on the machine.
| Down | New sandboxes |
|---|---|
| Our control plane | Start from the last signed policy the machine verified. |
| A machine that never got a policy | Refused. An enrolled machine does not fall back to the Free default. |
| The policy prover | Refused. fenzi run exits with code 2. |
| The sandbox runtime | Refused. fenzi run exits with code 3 and fenzi doctor says what is missing. |
A laptop drifts. Team writes it down.
A developer owns their laptop. For sandboxes Fenzi started, Team records one started without the team policy, a gateway that approves on its own, an approval made on the machine with no console review, and a machine that stopped reporting.
A record, not a lock.
Enforcement the laptop's owner cannot change is the License plan, on your cluster. It is planned and not built yet.
Four roles. Only admins change the rules.
Every member has exactly one role. Developers run agents, reviewers also answer requests, admins also publish and manage members, and auditors read and export without ever enrolling a machine.
An admin or reviewer can approve a request their own agent filed, and the console records who approved it. Members sign in with email and password; MFA and SSO are not on Team yet.
| Right | Admin | Reviewer | Developer | Auditor |
|---|---|---|---|---|
| Read the console, export decisions | yes | yes | yes | yes |
| Sign in their own machine | yes | yes | yes | no |
| Answer a request | yes | yes | no | no |
| Publish, set the boundary | yes | no | no | no |
| Invite members, change roles | yes | no | no | no |
Request access to open a Team. Move list
Every move, and the page that explains it.
Everything above the Team group works on Free, on one machine. The sandbox under all of it is OpenShell, at a pinned version.
Run an agent
Free- Guided setup
fenzi setupChecks the machine, stores the key, builds the agent image. - Run an agent in a sandbox
fenzi run claudeClaude Code, Codex, OpenCode or Grok, in the folder you are in. - Auto mode
--permission-mode autoClaude Code without a prompt per command. - Resume a session
fenzi connectBack into the agent where it stopped, or a shell in the sandbox. - List and stop sandboxes
fenzi psRunning and stopped ones; stop brings newer changes back. - Images built on your machine
fenzi agents buildFrom a pinned, published Dockerfile. - Pinned versions
fenzi updateThe sandbox runtime and every agent version.
Workspace and changes
Free- Works on a copy
fenzi run.gitignore respected; .git and your home folder left out. - Secret files named first
--allow-secretsFiles that look like secrets stop the copy until you say yes. - Diff
fenzi diffEvery changed file and line, before anything lands. - Apply
fenzi applyStops on a file you edited meanwhile. - Several runs on one project
--sandboxPick an earlier run by name.
Policy and network
Free- Default access
developer-defaultProject writable, four hosts read-only, the rest refused. - Project policy file
fenzi initfenzi.yaml adds hosts and access for one project. - Read-only and read-write hosts
access: read-onlyWrites only for the methods and paths you list. - The check before start
fenzi policy checkThe prover checks the policy before a sandbox starts. - Host changes while it runs
fenzi policy applyHosts load on running sandboxes; paths need a new one.
New hosts, asked once
Free- Approve and save
fenzi approve --saveKeeps the host for every next run. - Requests with a reason
fenzi requestsWhat the agent asked for, and drafts from refused calls. - Approve or deny
fenzi approve 7f3aA deny carries a reason the agent sees. - Never automatic
fenzi doctor --fixTurns off automatic approval on the gateway.
Keys, MCP and connectors
Free- Model keys outside the sandbox
fenzi key set claudeThe agent holds a placeholder. - Claude subscription sign-in
fenzi run --sign-in claudeClaude Code only. - MCP servers, per tool
fenzi mcp addOne list for every agent, each tool allowed or denied. - MCP servers for every project
fenzi mcp add --machineA project can narrow them, never widen them. - MCP tokens
fenzi mcp tokenStored on your machine, sent only to that server. - Local servers and their secrets
--secretThe value goes only to the hosts listed with it. - Claude's account connectors
--claude-accountYour claude.ai connectors, allowed by tool name. - Import from .mcp.json
fenzi mcp import--dry-run shows what it would add and leave out.
Log and tooling
Free- Decision log
fenzi logEvery network allow and deny, with process, host and rule. - Why a call was refused
fenzi log --denyEach reason, and what to change. - Doctor
fenzi doctorRuntime, gateway, prover, builder and a DNS check. - Output for scripts
--jsonOne JSON document, and stable exit codes. - The Mac app
Fenzi.dmgmacOS 14 or later; agents run on Apple Silicon.
Team
Team- Enroll a machine
fenzi loginApproved in the browser by a member. - Signed revisions
fenzi policy publishProved, numbered and signed; older ones are ignored. - Team MCP servers
team policyA signed-in machine gets its servers from the team. - Sync
fenzi syncTakes the next revision; hosts load on running sandboxes. - Team boundary
console, PolicyPublishes and approvals outside it are refused. - Roles
console, MembersAdmin, reviewer, developer and auditor. - Approve and add to policy
console, RequestsApproves, then drafts the next revision. - Forwarder
fenzi forwardAlways outbound, and a lost stretch shows as a gap. - One decision log
console, DecisionsEvery machine, filtered by sandbox, host or action. - Export
JSONLThe same decision records, for your own tools. - Exposure search
console, ExposureWho reached a host in the last 90 days. - Drift
console, DriftSandboxes and approvals outside the published policy. - When something is down
fails closedThe last signed policy holds.
Known limits lists what the sandbox does not stop. CLI reference
You pay for the fleet, not for sandbox hours.
$0 Per machine. No account.
Fine at work: World 1, on each developer's own laptop.
$20 Per developer a month, billed yearly.
$25 billed monthly, two developers at least. World 2, across every laptop. Machines and sandbox hours are not counted.
Price has every plan side by side.
One line to install. One command to run.
curl -fsSL https://fenzi.dev/install.sh | sh
Free per machine. No account. The model does not get a vote on its own limits.