---
title: "Team management"
description: "Invite colleagues to sign in and work on the same rooms."
---

# Team management

Teams let colleagues sign in and work on the same rooms. This is different from
[share links](share-links.md): a share link needs no account and gives one narrow
screen, whereas a team member signs in and gets the full
[Controller](controller.md).

Find it at **Team** in the dashboard header, or `/settings/team`.

> **Read [Roles do not restrict much yet](#roles-do-not-restrict-much-yet) before you
> invite anyone.** Role names in this app do not currently limit what someone can do to
> your rooms, so who you invite matters more than which role you pick.

## Members

The **Members** list shows each person's name (falling back to their email), their role,
and the date they joined.

## Roles

There are three roles: **Owner**, **Editor**, and **Viewer**. Whoever created the team is
the Owner. When inviting, you can choose **Editor** or **Viewer** — you cannot grant
Owner.

### Roles do not restrict much yet

The invite form says _"Editors can manage timers and messages; viewers can only
observe."_ **That is not what the app currently enforces.** Almost every permission is
granted to any team member regardless of role.

In practice, today:

| Action                                           | Owner | Editor | Viewer  |
| ------------------------------------------------ | ----- | ------ | ------- |
| Invite people, cancel invites                    | Yes   | Yes    | **No**  |
| Create, edit, delete rooms                       | Yes   | Yes    | **Yes** |
| Add, edit, reorder, delete sessions              | Yes   | Yes    | **Yes** |
| Run the transport (start / pause / reset / skip) | Yes   | Yes    | **Yes** |
| Post and delete messages                         | Yes   | Yes    | **Yes** |
| Create and remove share links                    | Yes   | Yes    | **Yes** |

**The only thing a Viewer genuinely cannot do is invite people.**

So do not use **Viewer** as a way to give someone safe, look-only access — they can
delete your rundown and stop your show. If you want genuinely read-only access, send
an [Agenda share link](agenda.md) instead; if you want message-only access, send a
[Moderator link](moderator.md). Those are enforced.

Only invite people to the team if you would be comfortable with them driving the
Controller.

## Sending an invite

Owners and Editors see an **Invite someone** form. Enter an email, choose **Editor** or
**Viewer**, and click **Send invite**. The invite then appears under **Pending invites**
with its role and expiry date, and a **Cancel** button.

> **No email is actually sent, and the app does not show you the link.**
>
> The screen confirms "Invite sent to …", but nothing is delivered. The invite is
> created in the database and its URL is only written to the **server log** — it is never
> returned to the browser, so there is nothing on the page to copy either.
>
> **As shipped, an invite cannot be delivered from the app.** Whoever administers the
> deployment has to read the URL out of the server logs (it is logged as
> `[INVITE] To: … | URL: …`) and pass it on by hand.
>
> Custom SMTP (Brevo) is now configured — see
> [docs/setup/resend-email-setup.md](../setup/resend-email-setup.md) — but only signup
> confirmation and password recovery use it. The invite flow was never wired to send through
> it; sending an invite email is still unbuilt. Plan on either adding people out-of-band or
> having them sign up and be added another way.

Invites are valid for **7 days**. You will see an error if you try to invite an email
that already has an active invite.

## Accepting an invite

The recipient opens the `/invite/…` link and sees which team they have been invited to
and as what role.

- **Already signed in** — one button: _Join [team]_.
- **Not signed in** — tabs for **Create account** (default) and **Log in**, with the
  email prefilled. Passwords must be at least 8 characters.

Either way they land on the dashboard as a member.

> **The link is a bearer token — anyone holding it can join.** Nothing checks that the
> person accepting owns the email you invited. Whoever opens that URL joins your team
> with the role you set. Do not post invite links anywhere shared.

## What you cannot do yet

These are hard limitations, not settings you have missed:

- **You cannot change someone's role after they join.** There is no control for it.
- **You cannot remove a member.** There is no control for it, and the database does not
  permit it either.

**Team membership is effectively permanent.** Combined with the role situation above,
that means adding someone to a team is not currently a reversible action from within the
app — treat every invite as permanent full access, and prefer share links whenever they
will do.

## Related

- [Share links](share-links.md) — no-login access for people who do not need an account
- [Agenda](agenda.md) — genuinely read-only, unlike the Viewer _role_
- [Moderator](moderator.md) — message-only access, properly scoped
