Verification codes, invitations and password resets, with or without an email provider.
Kai sends three kinds of email: a six-digit code to confirm an address (at sign-up and when deleting an account), invitations, and password resets.
Without email (local, the default)
KAI_EMAIL_ADAPTER=local sends nothing. Each email, codes and links
included, is printed to the server log:
docker compose -f infra/docker-compose.yml logs kai | grep -A6 "verification code"What changes:
- Codes still work: read them from the log.
- Invitations show a link to copy and send yourself.
- Forgot password? is hidden on the sign-in page.
That suits a single person or a small team where the operator can read logs.
With Resend
KAI_EMAIL_ADAPTER=resend
RESEND_API_KEY=re_...
KAI_EMAIL_FROM="Kai <no-reply@kai.example.com>"The sender's domain must be verified in Resend. With a key set, Kai emails codes, invitations and password-reset links, and shows Forgot password?.
Sending failures are logged and never block sign-up; people can ask for a new code.