# Users and what they may do Who the users are, and what each may do, is the swarm's: a registry in the document, the same on every node. How a user proves who it is stays each node's: its `--htpasswd`, or a reverse proxy naming the user (`--user-header`, [`trust.md`](trust.md)). ## The registry `_continuum/users/`, one entry per user. It is protocol data: every member holds it, a remake's snapshot carries it into the next epoch, and it holds no secrets (no password hashes: every member reads the document). ```json { "since": 1762400000000, "by": "continuum:3f…", "caps": { "8c41e2…": { "path": [], "rights": ["read", "write"], "by": "continuum:3f…", "since": 1762400000000 } }, "disabled": false } ``` * **Names** are what `--htpasswd` and the proxy give: 1 to 64 of `A-Z a-z 0-9 . _ @ -`. * **Capabilities** (`caps`): each a path, as segments as the store's API takes them, and the rights it gives there and below: `read`, `write`. A capability covers its path segment by segment (`servers/eu` covers `servers/eu/0`, not `servers/europe`). One outside protocol data never covers protocol data: `[]` is all of the swarm's data, `["_continuum"]` protocol data, managing users included (`_continuum/users`). They are kept by a random ID, so two capabilities granted at once both hold, and revoking one removes it alone. Each names who granted it (`by`: a user as `user:`, or the node that recorded it) and when (`since`). * **`disabled`**: the entry stays (who wrote what stays readable), and gives nothing. An entry that doesn't read as above gives less, never more: a capability that doesn't read is left out, and anything but `false` disables. ## A new swarm Its genesis node records the first users, with the swarm ID, in its first change: * those of `--bootstrap-users`, each with everything (`[]` and `["_continuum"]`); * unset: the users of its `--htpasswd` with `[]`, and those of them, or of the proxy's, in `--protocol-writers` with `["_continuum"]` too. A swarm nobody could manage doesn't start: with none of them with `["_continuum"]`, `--genesis` is refused, naming both options.