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

# Team

> Invite and remove developers, manage pending invitations, and understand the single-permission access model of an Open Wearables deployment from Settings → Team in the developer portal.

**Settings → Team** manages the developer accounts that can sign in to the developer portal.

## Inviting a developer

Click **Invite Member** and enter an email address. Open Wearables creates the invitation and queues an email with a link to create the account.

Invitation links expire after the number of days set in `INVITATION_EXPIRE_DAYS` (default 7).

## Email delivery

Invitation emails are sent either through any SMTP server or through [Resend](https://resend.com). Without one of them, invitations are still created but no email goes out. If `SMTP_HOST` is set, SMTP is used; otherwise Resend.

These variables apply to both:

```bash theme={null}
EMAIL_FROM_ADDRESS=invites@yourdomain.com
EMAIL_FROM_NAME="Open Wearables"
FRONTEND_URL=https://portal.yourdomain.com
```

* `EMAIL_FROM_ADDRESS` - sender address. Your email provider has to accept it as a sender (for Resend, it must belong to a verified domain).
* `EMAIL_FROM_NAME` - display name of the sender.
* `FRONTEND_URL` - public URL of the developer portal. It is used to build the acceptance link inside the email, so with the default `http://localhost:3000` the link only works on your machine.

### SMTP

Works with any provider that offers SMTP: Google Workspace, Microsoft 365, Amazon SES, Mailgun, Postmark, SendGrid, your own relay, and so on.

```bash theme={null}
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=invites@yourdomain.com
SMTP_PASSWORD=...
SMTP_SECURITY=starttls
```

* `SMTP_HOST` - SMTP server hostname. Setting it switches delivery to SMTP.
* `SMTP_PORT` - default `587`.
* `SMTP_USERNAME`, `SMTP_PASSWORD` - credentials. Leave both empty for a server that doesn't require authentication, e.g. a relay that allows your server by IP address (a Postfix container next to the backend, a Microsoft 365 connector, Google Workspace SMTP relay).
* `SMTP_SECURITY` - `starttls` (default, usually port 587), `ssl` for implicit TLS (usually port 465), or `none` for an unencrypted connection, e.g. a local [Mailpit](https://mailpit.axllent.org) on port 1025. With `none`, `SMTP_USERNAME` and `SMTP_PASSWORD` must be empty: Open Wearables won't send credentials over an unencrypted connection and skips sending with a warning instead. With `starttls` and `ssl`, the server certificate is verified.

Cloud email services:

| Service | `SMTP_HOST` | Credentials |
| - | - | - |
| [Amazon SES](https://docs.aws.amazon.com/ses/latest/dg/send-email-smtp.html) | `email-smtp.<region>.amazonaws.com` | SMTP credentials created in the SES console. They are not your IAM access keys. |
| [Azure Communication Services](https://learn.microsoft.com/en-us/azure/communication-services/quickstarts/email/send-email-smtp/smtp-authentication) | `smtp.azurecomm.net` | Username `<ACS resource name>.<Entra app ID>.<Entra tenant ID>`, password is the Entra app client secret. |
| Google Cloud | - | Google Cloud has no email sending service. Use [Google Workspace SMTP relay](https://support.google.com/a/answer/2956491) or a third-party provider. |

<Warning>
  Some hosting platforms block outbound SMTP ports, for example Railway on Free, Trial and Hobby plans and DigitalOcean Droplets by default. There, use Resend, which sends over HTTPS.
</Warning>

### Resend

```bash theme={null}
RESEND_API_KEY=re_...
```

* `RESEND_API_KEY` - API key from the Resend dashboard. For local testing you can set `EMAIL_FROM_ADDRESS=onboarding@resend.dev`, which Resend allows only for sending to your own account email.

### Delivery and retries

Delivery is handled by a Celery task, so the worker must be running. Failed sends are retried up to `EMAIL_MAX_RETRIES` times (default 5), after which the invitation is marked **failed** and can be re-sent from the developer portal.

<Note>
  If neither `SMTP_HOST` nor `RESEND_API_KEY` is set, or `EMAIL_FROM_ADDRESS` or `EMAIL_FROM_NAME` is missing, the invitation stays **pending** and the backend logs a warning instead of sending. `EMAIL_FROM_NAME` defaults to "Open Wearables". Use **Copy invite link** on the pending invitation and share the link manually.
</Note>

## Pending Invitations

Invitations that have not been accepted yet appear in a table with the email, sent date, expiry date, and delivery status. For each one you can:

* **Copy invite link** - copy the acceptance URL to share it manually.
* **Resend invitation** - generates a new link, extends the expiry, and sends the email again. The previous link stops working.
* **Revoke invitation** - invalidate the link. The invitee can no longer join with it.

## Developers

The **Developers** table lists every account with access to the deployment, with name, email, ID, and creation date. **Copy ID** copies the developer UUID, which is useful when reading audit fields such as the creator of an API key. **Remove team member** deletes the account. This cannot be undone.

## Access model

Open Wearables has a single permission level for developer accounts.

* **Every developer account is an administrator** of the deployment. There are no roles. All developers see the same settings and can perform the same actions.
* **There is no self-registration.** The first account is seeded from `ADMIN_EMAIL` and `ADMIN_PASSWORD` on first startup. Every further account can only be created through an invitation sent by an existing developer.
* Any developer can invite new team members, revoke pending invitations, and remove other developers.
* API keys and SDK application credentials belong to the deployment, not to the developer who created them. See [Credentials](/docs/developer-portal/settings/credentials#keys-are-shared-across-the-deployment).

<Note>
  One developer managing keys, invitations, or team members created by another developer is the intended behavior of this model, not a vulnerability.
</Note>


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