> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mobster.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Console and control plane

> How a team's Macs, phones and Profiles are listed in one place: what the registry holds, what Mobster sees, and how to read it from a script. Part of the Team plan, off until its release.

The console is where a team sees its Macs and phones together. Each Mac keeps its own connection to Mobster's relay and tells the team what it has: which phones are plugged in, which Profile is signed in on which phone, and what state each phone is in. The control plane is the part that keeps that list, so a teammate or a script can read it without asking each Mac.

The control plane is part of the [Team plan](/team) and is off until the Team plan release. It decides nothing for a Mac. A Mac still checks every request itself ([Who decides what](/team#who-decides-what)).

## Confirm or remove a Mac

Open **Macs** in the team console. **Waiting for an Admin** lists Macs that joined from Settings › Team but are not yet on the signed member list. **Confirmed** lists the Macs that member list names.

An Owner or Admin chooses **Confirm** and compares the displayed key fingerprint with the one on the Mac. Choose **It matches: confirm** only when they match. One passkey prompt signs the next member list. Operators and Viewers can read the page.

**Remove** first signs a member list without the Mac, then removes the Mac from the team. If the second step fails, the signed removal stays. Retry finishes the removal without signing it again.

## Watch a phone

A console session receives a phone’s screen only when your signed member list grants screen access, the phone is in your groups, and the Mac’s policy allows watching. The Mac checks those permissions when subscriptions change and every 5 seconds.

The Mac seals each frame before sending it. The relay forwards ciphertext and never receives the screen key in the clear. Keys rotate when a viewer leaves, when the member list changes, and every 10 minutes. A stream stops 10 seconds after its last viewer leaves.

## The registry

The registry lists three things for an organization.

| List | Each entry |
| - | - |
| Macs | Name, online or not, when it was last seen, the Mobster version, and its alert codes |
| Phones | Name, iOS version, battery, the groups it belongs to, the Mac it is on, whether a task is running on it, and its state with any alert codes |
| Profiles | The handle (such as `@acme`), the app, the phone it is signed in on, and the Mac that holds it |

A phone's state is one of `ready`, `busy`, `locked`, `unplugged`, `needs_setup` or `starting`. Alert codes are the ones Mobster shows on a phone, such as `unplugged`, `locked`, `signed_out`, `challenge`, `region_mismatch` and `owner_active` ([Keep the Mac and the iPhone ready](/remote#keep-the-mac-and-the-iphone-ready)).

A Mac sends its list when it connects, when a phone changes (at most every 2 seconds) and every 5 minutes. A Mac that goes offline keeps its phones in the list with the state it last reported, and `online: false` on the Mac says how old to treat them.

### What the registry never holds

The registry has ids, names, states and times. A Mac has no field to send a screen, a task's words, a Profile's notes, signature, links or variables, so none can be stored. A phone's id and a Profile's id are hashes made on your Mac from a salt only your team's Macs share, never a UDID or the id the Mac uses locally.

### Read it from a script

A signed-in member reads the registry with their account's access token:

```bash theme={"theme":"css-variables"}
curl -s "https://api.mobster.dev/api/orgs/$ORG/registry" -H "Authorization: Bearer $ACCESS_TOKEN"
```

It prints:

```json theme={"theme":"css-variables"}
{
  "at": 1760000000000,
  "macs": [{"id": "…", "name": "Rack 2 mini", "online": true, "last_seen": 1760000000000, "app_version": "0.4.0", "health": {"codes": [], "wda_expires_at": null}}],
  "phones": [{"id": "…", "mac": "…", "label": "iPhone 7", "ios": "26.1", "battery": 81, "groups": ["rack_2"], "run": null, "busy": false, "health": {"state": "ready", "codes": []}}],
  "profiles": [{"id": "…", "label": "@acme", "app": "Instagram", "phone": "…", "mac": "…"}]
}
```

A member sees the phones in their groups and the Profiles on those phones, as in the console. A person outside the organization gets `404`, and a request without a token gets `401`. While the control plane is off, every route here answers `404`.

| Status | `error` | Why |
| - | - | - |
| `401` | `unauthorized` | No token, or one that has expired |
| `404` | `org_not_found`, `not_found` | You are not in the organization, or the control plane is off |
| `429` | `rate_limited` | Too many requests |
| `503` | `control_plane_unavailable` | Mobster Remote didn't answer. The registry is not empty, it is unread: try again |

## Turn it on for a Mac

A Mac sends its Profiles to the registry only when the control plane is on for it. Set `MOBSTER_CONTROL_PLANE=1` in the Mac's environment. Without it, the Mac sends its phones as before and nothing more.

## Next

* [Team plan](/team)
* [Mobster Remote](/remote)
* [Enterprise](/enterprise)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.