OpenClaw 2.0 · Multiuser mode

One gateway.
A chamber for every user.

Multiuser mode turns a single OpenClaw gateway into a service that many people can use at once. Each person gets their own agent, their own conversation, their own memory — while the operator keeps the keys.

  • ModesSingle-user → shared service
  • IdentityPer channel contact
  • MemoryNamespaced per user
  • AccessDefault-deny, role-granted

The idea

From a single assistant to a shared one

By default, OpenClaw runs one agent for one operator. You connect your channels, talk to the agent, and it holds your continuity: your conversation history, your notes, your memory snapshots.

Multiuser mode relaxes that single-identity assumption. A single running gateway accepts messages from many people, and each person is treated as a separate principal with their own agent instance, their own thread, their own memory, and their own permissions and budget. The gateway becomes a shared service — the operator becomes an administrator of a fleet rather than the only pilot.

Architecture

The parts that make multiuser work

Channel adapters

One connector per service (WhatsApp, Telegram, Discord, Signal, Slack, the terminal REPL, and others). Each adapter turns a raw inbound event into a normalized message and, crucially, stamps it with a stable sender identity — usually a phone number or platform user id.

The gateway

A single always-on process that binds every adapter together. It resolves senders to users, enforces access and quotas, manages concurrency, routes outbound replies, and writes the audit log. Multiuser mode lives here.

User resolver

A mapping from channel contact → internal user key. First contact triggers provisioning: the user is created, assigned a role, and asked to be granted access before they can drive an agent.

Per-user agent instances

A user's agent is created on demand from their own context and torn down when idle. Each turn is scoped to that instance, so one user's running task never bleeds into another's.

Namespaced memory

Histories, notes, and memory snapshots are stored under a per-user key (for example memory/u/<user>). What one user teaches the agent is invisible to every other user.

Skills, tools & MCP

Capabilities are attached per user, filtered by role. A user whose role allows it may invoke skills and Model Context Protocol tools; a restricted user sees only the safe subset.

Message flow

The journey of one message

  1. A user sends a message

    A person writes to one of the connected channels — a WhatsApp text, a Telegram DM, a chat message, or a line in the terminal.

  2. The adapter captures identity

    The channel adapter receives the event and attaches the sender and chat identifiers. These are the only thing the rest of the system trusts as "who is this?"

  3. The gateway resolves the user

    The gateway normalizes the identifiers into a stable user key and looks it up in its user table. If this is a first contact, it is provisioned on the spot.

  4. Access and quota checks

    The gateway confirms the user's role allows the request and that they are under their token and concurrency budget. If not, the turn is refused with a clear reason.

  5. The user's context is loaded

    The agent instance is revived (or created) and given this user's conversation history, memory notes, snapshots, and permitted tools and skills.

  6. The agent works the turn

    The model reasons, then may call skills, tools, or MCP servers and read memory. Tool results feed back into the loop until the agent settles on an answer.

  7. The reply streams back

    The agent's output is routed by the gateway back onto the same channel, addressed to the same user — never broadcast to other users.

  8. State is committed

    The conversation is appended, memory snapshots are updated, and token usage is recorded against that user's budget. The audit log captures what happened.

Isolation

Same process, separate rooms

Users share the runtime but never the state. Everything that could leak one person's data is partitioned behind the user key.

User alice

  • Histories: memory/u/alice/history
  • Notes & snapshots: memory/u/alice/notes
  • Role: user · read-only tools
  • Budget: 20k tokens / day
  • Role of agent; reply on Alice's thread

User bob

  • Histories: memory/u/bob/history
  • Notes & snapshots: memory/u/bob/notes
  • Role: operator · write & exec tools
  • Budget: 100k tokens / day
  • Role of agent; reply on Bob's thread

What they cannot see: Alice cannot read Bob's notes, history, or running tasks — and Bob cannot read Alice's. Only the operator (the superuser) has visibility across every user's namespace, because the operator owns the underlying data.

Access control

Roles decide what a user may do

The three default access roles in OpenClaw multiuser mode and what each allows.
Role Typical person What they can do Tools / skills
user A guest or team member Chat with their own agent, use their own memory Safe subset only
operator A trusted collaborator The above, plus write and execution tools Write, execute, browse
superuser You, the operator of the instance Manage users, roles, quotas, and the whole gateway Everything, including admin

Multiuser mode is designed around default-deny: new contacts are blocked until an operator grants them a role. This is the single most important setting to get right.

Configure

Turning the mode on

Multiuser mode is enabled in your OpenClaw configuration. You switch it on, choose a default policy for unknown senders, and then grant roles to the people you know.

Preferred flow in practice:

  1. Start the gateway with multiuser enabled.
  2. Leave the default at deny so strangers cannot use your agent.
  3. Message the agent the first time from each new account you trust.
  4. Assign a role to each confirmed user through your control interface.
  5. Set per-user quotas so one person cannot drain your model budget.
  6. Watch the audit log while you validate, then tighten permissions.

Illustrative excerpt — schema is defined by your OpenClaw version.

{
  "multiuser": {
    "enabled": true,
    "defaultAccess": "deny",
    "users": {
      "telegram:123456789": {
        "role": "user",
        "model": "openclaw",
        "quota": { "tokensPerDay": 20000 }
      },
      "whatsapp:+15550001234": {
        "role": "operator",
        "quota": { "tokensPerDay": 100000 }
      }
    }
  },
  "channels": { "whatsapp": true, "telegram": true }
}

Security & operations

What shared use demands of you

  • Default-deny, always

    Only grant access to people you trust. A stranger using your agent spends your tokens and, with the right tools, reaches your machine.

  • Cap the budget

    Set token and concurrency quotas per user. Every concurrent agent consumes model calls and compute; unbounded sharing is how a gateway gets burned.

  • Scope the tools

    Execution and write tools are effectively privileges. Give read-only users read-only capabilities; reserve execution for operators you trust.

  • You still own the data

    Per-user namespace isolates users from each other, but not from the operator. Treat the instance as storing the personal data of everyone using it.

  • Keep secrets out

    API keys, session tokens, and credentials belong in a private env file, never in the repo or in a channel message. Rotate channel sessions regularly.

  • Audit and observe

    Keep the audit log on. It is how you learn who used the agent, for what, and at what cost — and it is your first stop when something looks wrong.

Honest limits

When multiuser mode is the wrong tool

Sharing an agent is not always an improvement. If the work is just for you, single-user mode keeps things simpler and more private by construction.

Multiuser mode pays off when you genuinely want many independent principals on one managed runtime — a small team, a shared concierge, a community agent. It costs you operator overhead: granting roles, sizing quotas, watching logs, and sometimes queueing when several agents want the model at once.