# Circles and membership

A Circle is the unit of trust, the unit of reach, and the thing you actually join. This
page covers who ends up in one, what that lets them do, and how to leave.

## What a Circle controls

Membership decides routing. A Host can only serve members of a Circle it belongs to, and
your requests can only reach Hosts in Circles you belong to. There is no path from a
stranger's machine to yours or back.

## How people get in

A Circle has two independent settings, and together they decide who can join.

| Setting | Values you can choose today | Default when you create one |
|---|---|---|
| Visibility | `unlisted`, `private` | `unlisted` |
| Admission policy | `invite-only`, `open-join` | `invite-only` |

Those defaults are deliberate: a Circle you create is neither publicly listed nor open to
join until you say so.

There is a third visibility, `public`, which puts a Circle in the browsable directory.
Creating one is not available yet while we validate that directory, so
`saylek circles create --visibility public` tells you it is coming soon rather than
making one. Public Circles that already exist stay browsable and joinable.

**Who can admit people:** minting invites is restricted to the Circle's owner (and, for a
Circle owned by an organization, its owner or admins). An ordinary member cannot bring
someone in. So on an invite-only Circle, everyone present was admitted by whoever runs it.

The consequence worth understanding:

- On an **invite-only** Circle, admission is controlled by the owner. If you trust the
  owner's judgement, you are trusting everyone in the Circle.
- On an **open-join** Circle, anyone who can reach it joins without an invite. If it is
  also `public` it appears in `saylek circles browse` and is joinable by anyone browsing.
  Since new Circles cannot be `public` yet, an open-join Circle you create today is
  reachable only by someone you hand its invite or circle id to.

"Everyone here was vouched for" is a property of an invite-only Circle, not of Circles in
general. Check which kind you are joining.

## Joining

For an invite-only Circle, redeem the invite you were given:

```bash
saylek circles join --invite https://saylek.com/c/<circle-id>/<token>
```

The bare composite form works too:

```bash
saylek circles join --invite <circle-id>:<token>
```

Both forms parse into identical requests before anything touches the network, so a
malformed invite fails locally rather than on the wire.

For an open-join Circle there is no token, so join by id:

```bash
saylek circles join --circle-id <circle-id>
```

**Joining is the consent.** Once you are in, requests your own machine cannot serve may run
on a Circle-mate's GPU by default. Read [Privacy and egress](/docs/privacy-and-egress)
before you join with a machine that handles sensitive work.

To find public Circles:

```bash
saylek circles browse
```

Only `public` Circles are listed. Unlisted and private ones are reached directly with a
join link.

## Creating and running one

```bash
saylek circles create --name "<name>" --slug <url-safe-slug>
```

`--slug` is optional at the command line but required by the server, so pass it or the
create fails. Add `--visibility` and `--admission-policy` only if you want something other
than the safe defaults above.

Then mint a link to bring people in:

```bash
saylek circles invites-mint --circle-id <circle-id>
```

Links are single-use and expire in 24 hours by default. `--uses N` (1 to 100) lets one link
admit up to N people, and `--expires` takes a duration such as `7d`, `24h`, or `1h`.

As written above it only prints the link, and delivering it is your choice. Add `--email`
and Saylek sends it for you:

```bash
saylek circles invites-mint --circle-id <circle-id> --email them@example.com
```

An emailed invite defaults to a 7-day expiry rather than 24 hours. See
[Invite flow](/docs/invite-flow) for the whole picture.

If a reusable link has spread further than you intended:

```bash
saylek circles invites-reset --circle-id <circle-id>
```

That revokes every active link you issued for the Circle, so previously shared links stop
admitting anyone. It is idempotent: resetting when nothing is active still succeeds. Mint a
fresh link afterwards.

## Seeing who is in

```bash
saylek circles members --circle-id <circle-id>
```

The roster shows each member's display name, role, join date, and user id. It shows a
placeholder where a display name is unset, because the roster is **email-blind by design**:
members do not see each other's email addresses.

Note the difference from:

```bash
saylek circles list
```

That one is **offline and device-local**. It reports the Circle credentials *this machine*
holds, not every Circle you belong to. It is honest about that limit in its own output.

## Removing someone

```bash
saylek circles kick --circle-id <circle-id> --user-id <user-id>
```

Find the user id with `saylek circles members`. Add `--yes` to skip the confirmation when
scripting. Kicking is reversible: they can rejoin with a fresh invite.

On an invite-only Circle, kick plus `invites-reset` is the complete removal, because only
an owner or admin can mint a way back in.

There is deliberately **no ban verb**. It would only add reach on an open-join Circle, where
a removed member could rejoin unaided, and the production posture is invite-only.

## Other owner commands

| Command | What it does |
|---|---|
| `saylek circles transfer` | Hand ownership of a Circle to another member. |
| `saylek circles archive` | Retire a Circle you own. |
| `saylek circles revoke` | Revoke this device's Circle credential, so it stops drawing on the pool. |

Run any of them with `--help` for the exact flags.

## Leaving

```bash
saylek circles leave <circle-id>
```

Note that `leave` takes the id **positionally**, unlike the owner commands above, which take
`--circle-id`. When in doubt, `saylek circles <command> --help` is authoritative.

Leaving is reversible: rejoin later with a new invite. It drops that Circle's models from
your reach within seconds, and your other Circles are unaffected.

Leaving your **last** Circle also withdraws the egress default: with no live membership,
Saylek stops routing your requests to anyone. Two caveats worth knowing, both covered on
[Privacy and egress](/docs/privacy-and-egress): your machine caches membership for a few
minutes, so the change is not instantaneous, and none of this touches a proxy upstream you
configured yourself.

For pausing or deleting your whole account instead, see
[Common commands](/docs/cli-reference).

## Next steps

- [Privacy and egress](/docs/privacy-and-egress): what a Circle-mate can see.
- [Invite flow](/docs/invite-flow): emailing an invite to one person.
- [Hosting your GPU](/docs/hosting): contributing capacity to a Circle.
