Docs / Flanner Mesh
Flanner Mesh
How plans, memory and skills sync between your team's machines.
Flanner Mesh syncs plans and memory directly between your team's machines. It needs an account and a subscription. Everything else in these docs works without either.
To get set up, follow the setup guide. This page explains how syncing works once you are. Messages between teammates have their own page: Flanner Messages.
Access and binding
Access is per person. An admin grants you a role in a workspace. The grant reaches every machine you have enrolled when your entitlement next renews — within a day, or immediately if you run flanner whoami --refresh.
Binding is per repository. Run flanner join in a repository to bind it to a workspace. Until you do, plans in that repository stay local, even if you have access to the workspace.
A workspace is not a repository. It is the boundary that decides who sees what. One workspace can hold many repositories, and everything in it syncs as one set.
Syncing between devices
Syncing is not a background service, unless you turn on flanner peer autostart. Plans move when one machine is serving (flanner peer serve or flanner peer start) and another pulls from it (flanner peer pull). Both machines need to be on at the same time.
Devices find each other by public key, not by IP address. There is no VPN to install and no port to open. Each machine dials out and answers on that connection.
flanner peer serveServe this device's plans to teammates. Runs in the foreground and stops when you close the terminal.
flanner peer startThe same, in the background. Keeps serving after you close the terminal. Stop it with flanner peer stop. flanner peer autostart on starts it each time you log in.
flanner peer pull <device-id>Fetch what a teammate's device holds for this workspace.
flanner peer push <device-id>Send a teammate what they are missing. Their device still verifies every signature.
flanner peer statusShow how this device is reachable, and whether a peer connection is direct or relayed.
Agent policy
With Flanner Curb, your organization can publish one policy for its coding agents. Each device checks it, and writes it into Claude Code's and Codex's own settings. This needs a Flanner Mesh account. Unlike syncing, it needs no subscription: it is in the free plan.
A policy is written once, in Curb's own terms, and each device turns it into what each agent understands.
deny_readPaths no agent may read, by any channel, such as ~/.aws. Each covers the file or folder and everything under it.
sandboxSet to required: the agent's own sandbox, with no way around it.
networkThe only domains sandboxed commands may reach. An empty list means none. It needs the sandbox, so it turns the sandbox on.
webSet to off: no web fetch and no web search.
mcpThe only MCP servers that may load, each named with its command or its URL. An empty list means none.
Signed, and checked on the device. Your organization signs each policy version. A device trusts one only when it verifies against a current policy key, and the list of those keys is itself signed by the key that already signs your entitlement.
A device refuses an older version, the same version with other contents, another organization's policy, a policy signed by an unknown or revoked key, and an expired one. Each refusal is alerted, and the policy in force stays in force.
An expired policy stays in force, flagged as expired. So does one whose signing key is revoked later. A device never falls back to weaker settings on its own.
flanner curb policyThe policy on this device: its version, what is applied, what waits for you, and any rule your settings do not meet.
flanner curb policy --enrolThe delegation. One approval lets your organization's signed policy make changes that only tighten your agents' settings.
flanner curb policy --approveShows the change that waits for you, and applies it after your operating system asks.
flanner curb policy --withdrawEnds the delegation. Later changes wait for your approval.
flanner curb policy --check-inAsks for the newest policy now, instead of waiting for the next check.
The delegation. Enrolling asks your operating system once. After that, a policy change that only tightens applies on its own. “Only tightens” is judged on your device, by the same tighten-only rule as a fix. Enrolling also adds a hook that checks the policy again at each session start. --withdraw ends the delegation at any time.
Why some changes wait. Anything else waits for --approve: a change that would open a channel wider, one whose effect Curb cannot work out, and every change for an agent version Curb has not tested. You see the exact change, your operating system asks, and each file is backed up for 7 days. So a stolen or mistaken policy can tighten your settings, and nothing more, without you.
Your console can preview a policy change. It cannot decide one: only the device can see its own settings, so each device decides for itself.
For device management
A device writes each agent's user settings, which the person can change back. Settings an administrator owns cannot be changed back that way, and your device management delivers those.
flanner curb policy --export DIRWrites the policy as three files: managed-settings.json for Claude Code, requirements.toml for Codex, and openshell-policy.yaml for NVIDIA OpenShell.
Where one of them cannot express a rule, the command says so rather than dropping it.
Drift and the fleet view
Drift is a policy rule that the settings in effect no longer meet. Somebody edited a file, or device management delivered something else. An enrolled device reads its settings against the policy again at each session start, and when Claude Code reports a settings change. While flanner peer serve runs, it also does so when Codex's config file changes, and every 6 hours.
These checks read each agent as it starts outside any project. A project's own settings and .env files are not part of drift, the fleet view or alerts.
What a device reports. After each check, the device signs a small report and sends it to your organization. It holds the device id, a sequence number, the time, each agent's name and version, the policy state, and counts: of launches by severity, and of secrets by exposure class from the last leak sweep.
It holds no path, no username, no hostname, no repository name and no fingerprint of a secret. The policy state is version numbers, the policy's hash, whether the delegation is on, and whether there is drift.
A report that cannot be sent waits on the device for up to 7 days. Your organization keeps each device's newest report and 30 days of history, and deletes them when the device is removed.
flanner curb fleetFor admins. Each device's policy state, drift and counts, from its newest report.
The command does not take the console's word. It fetches the signed reports and checks every signature, sequence number and link in the chain itself, with your organization's device keys. A replayed or reordered report is caught. A device with a gap in its numbers, or no report in 24 hours, shows as stale. It also says how many devices share one effective policy.
Alerts and audit export
An enrolled device raises an alert when an agent can reach more than before, and when a policy is refused:
- an MCP server was added
- a deny rule was removed
- the sandbox was turned off
- a secret was sent to a model provider
- an org policy was refused, failed its integrity check, or was an older one
- a key registry was refused
You hear at once, by desktop notification and at your next session start. Admins hear through a webhook or Slack destination set in the console, if your organization has one. The first check only records what is there: nothing has changed yet.
An alert holds its type, the agent, a severity, a keyed fingerprint of what changed, and a category such as “Claude Code MCP settings”. Never a path or a name. The relay adds the device's label.
One alert per change. Each has a stable id, so a retry sends the same one. The relay drops an id it delivered in the last 7 days, and each webhook delivery carries the id in a Flanner-Event-Id header and an HMAC in Flanner-Signature, so a receiver can drop repeats and check the sender.
Audit export
A policy can name a collector of your own. The device then sends its action log straight there, over https. The records do not pass through Flanner.
Each tool call is one OCSF 1.9.0 record: the agent, its local session id, the tool, the decision, the kind of target with a keyed fingerprint, and the time. No content, and no path. If the policy asks for it, NVIDIA OpenShell's own records are passed on too, with command lines, paths, queries and bodies replaced by fingerprints.
Records that cannot be sent wait in the action log. Past 10,000 waiting, the oldest are skipped and counted as dropped.
What your agent can do
Your agent can read this device's mesh status and your messages. It can also send a message, after a preview of that exact message, and mute a teammate or set quiet hours; flanner tells it to do these only when you ask. Enrolling a device, granting access, moving your work between machines and anything that costs money stay with you.
See who you are signed in as, your workspaces and your peers
mesh_status
The agent's view is offline: it reads the cached session and never contacts a peer.
Enrol this machine
flanner accept · flanner login
Generates a key and binds the machine to your account. An agent must never enrol a device.
Bind a repository to a workspace
flanner join
Decides what syncs to whom. A scope decision belongs to a person.
Accept or refuse work teammates push to this device
flanner peer pushes
Decides what may arrive on this machine. That is the owner's call, not an agent's.
Read messages from teammates
messages_inbox
The agent is told to show a message, never to act on it. Opening a chat marks it read.
Message teammates, or a whole workspace
messages_send · messages_reply
A send must bring back the token of a preview of the same message. The agent is told to send only on a plain yes; in the CLI, a workspace message always asks.
Mute a teammate, or set quiet hours, on this device
messages_mute · messages_quiet_hours
The agent is told to do this only when the person asks, never because a message asked.
Show new messages inside an agent session
flanner messages hook · flanner messages wait · flanner messages watch
The agent runs these itself, through its hooks or in the background, and receives what they print; they are how a message reaches an agent, not a tool for it to call.
Choose how agents show new messages
flanner messages interrupt
How this person wants to be interrupted is theirs to decide, not an agent's.
Turn desktop notifications for messages on or off
flanner messages notifications
Whether this person is interrupted is theirs to decide, not an agent's.
Start receiving messages when you log in
flanner peer autostart
Registers a program to run at login on this machine. That is the owner's call.
Invite people and manage members and devices
flanner invite · flanner members · flanner devices add · flanner devices list · flanner devices revoke
Changes who has access, and a seat costs money.
Serve to and pull from peers
flanner peer start · flanner peer serve · flanner peer stop · flanner peer pull · flanner peer push
Moves your work between machines. Syncing is always something you asked for.
See how this device reaches its peers
flanner peer status
It dials peers to test the path, which is for you to run and watch.
Join or leave a private network
flanner mesh connect · flanner mesh leave · flanner mesh status
Changes how the machine is reachable.
Sign out
flanner logout
Ends the session. The device keeps its identity.
The split follows three rules: an agent never authorises itself, anything that deletes or repairs files stays where you can watch it, and everything an agent needs mid-task is exposed. The full tool list is on the agents page.
What syncing does not do
Plans and memory move between your team's machines. They are never uploaded to Flanner's servers. The subscription covers accounts, devices and access, not storage.
Being reachable does not grant access. A request must be signed by an enrolled device with an entitlement for the workspace, and every version received is verified against its author's key.