Reading the docs…
Stopped.
Tack sends one kind of email: weekly digests, and the confirmation that comes first. It’s off until you set it up, and everything else works without it: boards can still post their digests as GitHub Discussions.
Email goes out through Cloudflare Email Service, from a domain on your Cloudflare account.
In the Cloudflare dashboard, open Email Service and onboard a domain for sending, on the same account as Tack. Cloudflare adds the DNS records sending needs (SPF and DKIM). Use a subdomain, like mail.example.com, if your main domain already sends mail from elsewhere.
In your copy of Tack, set EMAIL_FROM at the top of cloudflare.config.ts to the address digests come from, on that domain:
const EMAIL_FROM = "Tack <tack@mail.example.com>";This also adds the send_email binding (TACK_EMAIL) that sends it.
Run pnpm run wrangler-config, commit, and deploy.
Then Weekly digest… on a board offers Email people who ask for it. Until then, it says “This Tack can’t send email yet”.
List-Unsubscribe headers mail apps use for their own unsubscribe button.Only people allowed on the instance can ask, and only for boards they can open. An address that bounced or complained before (suppressed by Email Service) is unsubscribed.
Recent digests in the board’s dialog, and the logs (digest.email.failed, with Email Service’s code), say why:
| Code | What to do |
|---|---|
E_SENDER_NOT_VERIFIED |
EMAIL_FROM isn’t on the domain you onboarded |
E_SENDER_DOMAIN_NOT_AVAILABLE |
The domain isn’t onboarded for sending yet, or its DNS records aren’t in place |
E_RATE_LIMIT_EXCEEDED |
Sending too fast: Tack tries again in 15 minutes |
E_DAILY_LIMIT_EXCEEDED |
The account’s daily limit is used up: Tack tries again later |
E_RECIPIENT_SUPPRESSED |
The address bounced or complained before: they’re unsubscribed, and can ask again |
The dev server always has email on, from tack@example.com. Nothing leaves your machine.