{# Plan 47 — first-time explainer for the invites page. Auto-shown on first visit, dismissed via localStorage (HERO_DISMISSED_KEY in invites.js). Pure presentation: state (showHero / dismissHero) lives on the Alpine root. #}

How invitations work

  1. You pick an email and role, click Create invitation.
  2. The relay returns a one-shot URL you copy and send via Slack / chat / in-person.
  3. Your teammate opens it once, sets a password, joins this fleet.
  4. You can revoke any URL until it's used.

Designed for self-hosted setups without email: no SMTP, no inbound port for the teammate, just one URL.