Skip to main content

Running Multiple Rooms

A singleMeshCore room server canis hosta multiplesingle roomsnode (channels),that eachhosts witha independentsingle accessroom. control and settings. ThisThere is commonno formulti-room mode: one room server node = one room. To offer several separate spaces across a community networks(for that run bothexample, a public room and a private emergency operations room), you deploy multiple room-server nodes — one node per room. This page covers how a single room server works and how to run several of them as a coordinated set.

RoomHow architecturea room server works

InA MeshCore,MeshCore aroom "room"server is a messagestore-and-forward spacenode with:configured entirely over its serial/BLE CLI — there is no configuration file. A single room server has:

  • AOne advertised node name, set with set name <name> (visiblethis tois the name clients connectingsee; there is one name per node).
One admin password, changed with password <new>, used for administrative control of the node. One guest password, changed with set guest.password <password> (default: hello — change it immediately). This gates guest access to the server)room. AnOne optionalper-contact PSKaccess control list (emptyACL), =managed publicwith room;setperm set<pubkey> =<level> encryptedand privateviewed room)with get acl. Permission levels are Guest (0), Read-only (1), Read-write (2), and Admin (3). ItsA ownsingle read-only flag, set allow.read.only on|off (default: off). When on, it permits unauthenticated read-only access; by default unauthenticated read is not granted. A single persisted message history storedstore. separatelyThe Itsroom ownserver participantretains listposts and pushes the unseen backlog to a client when that client next connects (a client receives the previously unseen messages on login — documented as the previous 32). This persistence is the entire point of a room server versus an ordinary channel.

ClientsA chooseclient which rooms to join when they connectconnects to a room server.server (supplying the guest password if one is required) to access that server's single room. There is no "choose which room to join" selection, because a server hosts only one room. A client cancan, however, hold multiple room servers as contacts and interact with each separately.

Exact password defaults, ACL levels, and the unseen-message count should be inverified against your firmware version and the current MeshCore CLI reference at docs.meshcore.io/cli_commands (as of 2026-06-08).

Deploying multiple roomsroom simultaneously.servers

Because one node hosts one room, separate spaces require separate nodes. A community that wants a public room and a restricted emergency room runs two room-server nodes, each configured independently over its own CLI. Each node is a separate piece of hardware (for example a Heltec V3 or an nRF52840 board) with its own name, passwords, ACL, and history store.

Example

For multi-example, to set up three room configurationservers across a region you would, on each node in turn, connect over serial/BLE and configure it:

rooms:
 # Public--- Node 1: public regional room ---
anyoneset name RegionMesh-Public
password <newAdminPassword>
set guest.password <publicGuestPassword>   # or leave blank for open guest access
set allow.read.only on                     # optional: allow unauthenticated read-only
advert

# --- Node 2: restricted emergency room (separate hardware) ---
set name EmergencyNet
password <newAdminPassword>
set guest.password <emergencyGuestPassword>
setperm <coordinatorPubkey> 2             # grant a coordinator Read-write
advert

# --- Node 3: club room (separate hardware) ---
set name ClubNet
password <newAdminPassword>
set guest.password <clubGuestPassword>
advert

All of these nodes — like every node in the network — must share the same radio preset (frequency, bandwidth, spreading factor, coding rate) as the companions and repeaters around them; otherwise their packets and adverts cannot be received by other nodes. Use the named region preset in the app or web flasher rather than hand-entering values. Give each node a clear, distinct name so users can join, no encryption - name: "RegionMesh-Public" psk: "" description: "Public community channel fortell the region"rooms max_history:apart.

1000

Controlling # Messagesaccess to keepeach inroom

memory

Access #to Emergencya netroom -is governed by the room server's guest password and per-contact ACL, not by a per-room PSK. Anyone who has a room's guest password can join and read that room's messages, so treat it like a shared PSKsecret: withdistribute authorized operators - name: "EmergencyNet" psk: "secretkeyhere" description: "For emergency coordinators only" max_history: 500 # Local club - private to members - name: "ClubNet" psk: "clubsecretkey" description: "For club members" max_history: 200

Distributing room PSKs

PSK distribution should happenit through a separate secure channel (encrypted email, in-in person, Signal, etc.), not over the mesh networkitself, itself.and Anyonerotate it with theset PSK can read all messages in that room - treat it like a shared guest.password and change it<new> if an unauthorized personit may have obtained it.leaked.

For publicfiner control on a given node, grant individual contacts specific permission levels with setperm <pubkey> <level> (Guest/Read-only/Read-write/Admin) and review the current list with get acl. For a restricted emergency preparedness networks,room, the EmergencyNetguest PSKpassword is typically shared only with vetted local emergency emergency-management personnel, ARES/RACES members, and CERT team leads - not published publicly.publicly — and trusted operators can be given Read-write or Admin via the ACL.

Monitoring a room activityserver

TheA MeshCore room server exposeshas ano simpleHTTP status endpoint thatand canno bemanagement queriedscript for operationalit monitoring:is firmware on a microcontroller (nRF52840/ESP32). You monitor it over the serial/BLE CLI using the built-in stats commands:

# NumberSystem ofstats: connectedbattery, clientsuptime, perqueue roomlength, curldebug http://localhost:7070/statusflags
stats-core

# OrRadio-layer viastats
stats-radio

# Packet-level stats
stats-packets

These commands are issued over the roomserial console (or the companion app's CLI). To monitor several rooms, connect to each room-server CLInode (ifand availablequery init your version) python3 manage.py statusindividually.