Fenzi
use cases

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 mission
Missions
BriefingThe failures you have seenPlayer The agent
anti-doom

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.

the mcp setup

Every tool, wide open.

The server's token sits in a config file the agent can read, and every tool it offers is allowed.

Mission 1-1

the queue

One agent at a time.

Nothing keeps two agents apart on one laptop, so the second task waits.

Mission 1-2

the rebuild

Set it all up again.

A new agent means new MCP servers, new keys and new rules, typed in from memory.

Mission 1-4

the shortcut

Allow everything.

The prompts got in the way, so the agent got full access. Nobody can say what that covers.

Mission 1-6

the new laptop

Day one starts from zero.

Each developer wires up servers, hosts and rules by hand, and no two laptops match.

Mission 2-2

the security lead

An advisory names a host.

Nobody can say which laptops reached it, or when.

Mission 2-4

Start world 1 Start world 2

World 1One playerPlan Free
world 1, one player

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.

Mission 1-1 mcp, per tool

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 token

MCP servers What the sandbox checks

fenzi.yaml
mcp: deepwiki: url: https://mcp.deepwiki.com/mcp tools: allow: [read_wiki_structure] linear: url: https://mcp.linear.app/mcp token: true tools: allow: [list_issues, get_issue, create_comment] deny: [delete_issue]
fenzi log, excerpt
allowed POST mcp.deepwiki.com/mcp tools/list allowed POST mcp.deepwiki.com/mcp tools/call read_wiki_structure denied POST mcp.deepwiki.com/mcp tools/call read_wiki_contents
claude's connectors

Your 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_issue

Claude's account connectors

Mission 1-2Several projects at oncePlan Free
one sandbox per project

An 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.

Sandboxes Several runs

fenzi ps --json, example
[ { "name": "fenzi-web-4f2a", "agent": "claude", "folder": "/Users/dana/code/web", "running": true }, { "name": "fenzi-api-90cc", "agent": "codex", "folder": "/Users/dana/code/api", "running": true } ]
Mission 1-3Any agentPlan Free
same walls, any agent

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.

Agents Subscription sign-in

Player select
  • fenzi run claudeClaude Code
  • fenzi run codexCodex
  • fenzi run opencodeOpenCode
  • fenzi run grokGrok
  • fenzi run --sign-in claudeYour Claude subscription
Mission 1-4One setupPlan Free
set it up once

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.

For every project, or one Model keys

Set once, used by every agent
WhatSet withLives in
MCP servers for every projectfenzi mcp add --machine~/.config/fenzi/mcp.yaml
MCP tokens and secretsfenzi mcp tokenThe sandbox runtime on this machine
Model keysfenzi key setThe sandbox runtime on this machine
The project's rulesfenzi initfenzi.yaml, committed
Mission 1-5Scripts and orchestratorsPlan Free
drive it from code

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.

Output for scripts Exit codes

Exit codes
CodeMeaning
0Success.
1Error. The message says what failed.
2The policy check failed. Nothing started or loaded.
3The 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.

Mission 1-6Room to workPlan Free
auto mode

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 auto

Default access Decision log

fenzi log, example
time action process destination rule 10:42:05 allowed claude POST api.anthropic.com/v1/messages _provider_fenzi_claude 10:42:07 denied curl paste.example.net:443 - 10:42:31 allowed python3 GET pypi.org/simple/requests/ pypi_org
Mission 1-7Credentials outsidePlan Free
nothing to leak

The 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.

What goes in Placeholders

What the agent finds
Inside the sandboxWhat is there
Your home folderNothing. It was never copied.
A secret file in the projectOnly if you said yes when fenzi run named it.
The model keyA placeholder. The proxy adds the real key on model calls.
An MCP tokenA placeholder. The real one goes only to that server.
Mission 1-8Review the diffPlan Free
diff and apply

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 connect

Workspace and changes

When the agent exits, example
■ 3 files changed from the agent not applied yet edited src/api/client.ts +14 −3 new src/api/schema.json +40 deleted src/api/legacy.ts −22 ? What should happen to these changes? ❯ Show the changes Apply them to ~/code/web Keep them for later
Mission 1-9New accessPlan Free
requests

New 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 and approvals Policy apply

fenzi requests, example
■ 1 request from the agent fenzi-web-4f2a 7f3a91c2 crates.io:443 /usr/bin/curl “User asked for the newest serde version from the crates.io API.” $ fenzi approve 7f3a --save
Mission 1-10The Mac appPlan Free
the second door

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.

The Mac app

Install it then fenzi run claude

World 2Co-opPlan Team
world 2, co-op

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.

Mission 2-1 signed revisions

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

Publish and revisions

What a revision changes
You changedRunning sandboxes
HostsLoad the new hosts on the machine's next sync or forwarder pass.
Paths, workspace access, agentsKeep the old revision. The next fenzi run creates a new sandbox.

Walls before move-in. Doors while it runs.

Mission 2-2A new laptopPlan Team
onboarding

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.

Enroll machines Many machines

fenzi login, example
open https://fenzi.dev/device code KQXT-MRWD signed in dana@acme.dev, team acme machine dana-mbp, enrolled policy acme r1, verified and cached
Mission 2-3One logPlan Team
the record

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.

Decisions Forwarding

Console decision log, example
time machine action destination process 10:42:07 dana-mbp deny paste.example.net:443 curl 10:42:31 dana-mbp allow GET pypi.org/simple/... python3.12 10:44:02 li-x1 deny POST api.github.com/... gh
Mission 2-4Exposure searchPlan Team
the incident question

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.

Exposure search

Exposure, example
Search: paste.example.net
MachineSandboxProgramAction
dana-mbpfenzi-web-4f2acurldeny
The policy in force does not list it.
Mission 2-5One yes for the teamPlan Team
ask once, for everyone

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 and add to policy

Two ways to say yes
ApproveApprove and add to policy
Who canAn admin or a reviewerAn admin
The sandbox that askedGets the host at its next forwarder passThe same
Every other laptopNo changeGets the host once the draft is published
Mission 2-6The team boundaryPlan Team
the outer fence

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.

Team boundary

Mission 2-7OfflinePlan Team
fails closed

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.

When something is down

If this is unavailable
DownNew sandboxes
Our control planeStart from the last signed policy the machine verified.
A machine that never got a policyRefused. An enrolled machine does not fall back to the Free default.
The policy proverRefused. fenzi run exits with code 2.
The sandbox runtimeRefused. fenzi run exits with code 3 and fenzi doctor says what is missing.
Mission 2-8DriftPlan Team
the honest part

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.

Drift

Mission 2-9RolesPlan Team
who holds the button

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.

Team roles

Who can do what
RightAdminReviewerDeveloperAuditor
Read the console, export decisionsyesyesyesyes
Sign in their own machineyesyesyesno
Answer a requestyesyesnono
Publish, set the boundaryyesnonono
Invite members, change rolesyesnonono

Request access to open a Team. Move list

Move listEvery featurePlan Free and 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

Workspace and changes

Free

Policy and network

Free

New hosts, asked once

Free

Keys, MCP and connectors

Free

Log and tooling

Free
  • Decision logfenzi logEvery network allow and deny, with process, host and rule.
  • Why a call was refusedfenzi log --denyEach reason, and what to change.
  • Doctorfenzi doctorRuntime, gateway, prover, builder and a DNS check.
  • Output for scripts--jsonOne JSON document, and stable exit codes.
  • The Mac appFenzi.dmgmacOS 14 or later; agents run on Apple Silicon.

Team

Team
  • Enroll a machinefenzi loginApproved in the browser by a member.
  • Signed revisionsfenzi policy publishProved, numbered and signed; older ones are ignored.
  • Team MCP serversteam policyA signed-in machine gets its servers from the team.
  • Syncfenzi syncTakes the next revision; hosts load on running sandboxes.
  • Team boundaryconsole, PolicyPublishes and approvals outside it are refused.
  • Rolesconsole, MembersAdmin, reviewer, developer and auditor.
  • Approve and add to policyconsole, RequestsApproves, then drafts the next revision.
  • Forwarderfenzi forwardAlways outbound, and a lost stretch shows as a gap.
  • One decision logconsole, DecisionsEvery machine, filtered by sandbox, host or action.
  • ExportJSONLThe same decision records, for your own tools.
  • Exposure searchconsole, ExposureWho reached a host in the last 90 days.
  • Driftconsole, DriftSandboxes and approvals outside the published policy.
  • When something is downfails closedThe last signed policy holds.

Known limits lists what the sandbox does not stop. CLI reference

PlansFree and TeamSandbox hours Not billed
price

You pay for the fleet, not for sandbox hours.

Free

$0 Per machine. No account.

Fine at work: World 1, on each developer's own laptop.

Install it

Team

$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.

Request access

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.