Docs menuFlanner Mesh

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 serve

Serve this device's plans to teammates. Runs in the foreground and stops when you close the terminal.

flanner peer start

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

Show how this device is reachable, and whether a peer connection is direct or relayed.

Sharing memory

Memory does not sync automatically. To share one, run flanner mem share ID. Joining a workspace does not share any existing memories, and personal memory cannot be shared.

A shared memory is signed by the machine that wrote it. The receiving device verifies the signature, runs the same secret check it runs on local memories, and stores it as a workspace memory marked as received.

flanner mem withdraw ID asks every device to stop recalling a shared memory. It does not delete the file from a device that already has it.

Sharing skills

flanner skills share HASH signs a package for your workspace. What travels is the package files and nothing else: no record of who used it, no evidence it was written from, no session references.

Receiving is not installing. A package arrives as a transfer, is checked against the hash its sender claimed, and waits. flanner skills import ID is a separate decision by the person whose machine it landed on.

A package built for another agent is refused rather than written into a layout it was not made for, and a directory you edited by hand is never silently replaced. Following a skill with flanner skills channel subscribe tells you about a new version; it never installs one. See Flanner Skills.

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_read

Paths no agent may read, by any channel, such as ~/.aws. Each covers the file or folder and everything under it.

sandbox

Set to required: the agent's own sandbox, with no way around it.

network

The only domains sandboxed commands may reach. An empty list means none. It needs the sandbox, so it turns the sandbox on.

web

Set to off: no web fetch and no web search.

mcp

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

The policy on this device: its version, what is applied, what waits for you, and any rule your settings do not meet.

flanner curb policy --enrol

The delegation. One approval lets your organization's signed policy make changes that only tighten your agents' settings.

flanner curb policy --approve

Shows the change that waits for you, and applies it after your operating system asks.

flanner curb policy --withdraw

Ends the delegation. Later changes wait for your approval.

flanner curb policy --check-in

Asks 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 DIR

Writes 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 fleet

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

ActionAgent

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.

MCP

Enrol this machine

flanner accept · flanner login

Generates a key and binds the machine to your account. An agent must never enrol a device.

You

Bind a repository to a workspace

flanner join

Decides what syncs to whom. A scope decision belongs to a person.

You

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.

You

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.

MCP

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.

MCP

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.

MCP

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.

You

Choose how agents show new messages

flanner messages interrupt

How this person wants to be interrupted is theirs to decide, not an agent's.

You

Turn desktop notifications for messages on or off

flanner messages notifications

Whether this person is interrupted is theirs to decide, not an agent's.

You

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.

You

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.

You

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.

You

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.

You

Join or leave a private network

flanner mesh connect · flanner mesh leave · flanner mesh status

Changes how the machine is reachable.

You

Sign out

flanner logout

Ends the session. The device keeps its identity.

You

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.