Project: Postmark Email
Vision
Reliable transactional email for all pal-e platform apps via Postmark SaaS. Keycloak password resets and email verification flows work out of the box for any onboarded domain. Infrastructure fully managed via Terraform.
User Stories
| Key | Story Note | Role | Success Metric |
|---|---|---|---|
| iac-email | <a href="story-postmark-email-iac-email">story-postmark-email-iac-email</a> | Platform operator | terraform plan shows no drift; new domain = one tfvars block |
| transactional-email | <a href="story-postmark-email-transactional-email">story-postmark-email-transactional-email</a> | App user | Password reset email arrives within 30s with working link |
| inbound | <a href="story-postmark-email-inbound">story-postmark-email-inbound</a> | Platform operator | Test emails queryable via MCP within 60s of sending |
Architecture
Architecture notes pending. Key decisions:
- Postmark SaaS over self-hosted (Hetzner blocks port 25)
marcus-carey/postmarkTerraform provider v1.0.0 (source:registry.terraform.io/marcus-carey/postmark— not on OpenTofu registry)- DNS via existing GoDaddy provider
- Keycloak
dynamic "smtp_server"block in keycloak.tf consumes Postmark config prevent_destroyon server resources (Postmark API blocks server deletion)- Dedicated SMTP tokens (
PM-T-outbound-*) for Keycloak SMTP auth — server tokens reserved for API only - Shared inbound webhook endpoint via Tailscale funnel — one nginx:alpine pod serves all Postmark servers, HTTP Basic Auth, auto-generated creds in k8s Secret
Board
Status
- Postmark account created and verified
- intelligentstaffingsystems.ai domain verified (DKIM + Return-Path)
- Server API token and Account API token stored in ~/secrets/postmark/
- API CRUD validated (create/read/update work; delete blocked by Postmark)
- PR #518 merged (2026-07-05) — Postmark provider, module, DNS records for ISS
- PR #175 merged (2026-07-05) — Keycloak SMTP config for password reset + email verification
- PR #186 merged (2026-07-17) — Postmark email integration guide + Keycloak SMTP docs cross-reference
- SMTP token migration (2026-07-17) — ISS realm switched from server token to dedicated SMTP token, applied via tofu
- Postmark account submitted for approval (2026-07-17) — external delivery blocked until approved (ErrorCode 412)
- Same-domain test email delivered successfully
- Both infra items in validation — remaining: Postmark account approval, E2E password reset test, mail-tester check
- PR #582 merged (2026-08-03) — MX record for intelligentstaffingsystems.ai inbound email
- Inbound email confirmed working (2026-08-03) — emails queryable via search_inbound_messages MCP tool
- PR #584 merged (2026-08-04) — Shared inbound webhook endpoint via Tailscale funnel with HTTP Basic Auth
- PR #586 merged (2026-08-05) — Fixed godaddy-tofu CI checksum mismatch (pre-built release binary)
- Webhook deployed and e2e tested (2026-08-05) — full chain verified: send email → webhook → inbound stream → queryable via MCP
- Bug #587 discovered — tofu apply clears InboundDomain (not managed by postmark module); restored manually, fix pending
Milestones
- 2026-07-05: Terraform provider and module merged (PR #518)
- 2026-07-05: Keycloak SMTP config merged (PR #175)
- 2026-07-17: SMTP token migration — Keycloak ISS realm switched to dedicated SMTP token
- 2026-07-17: Postmark integration docs merged (PR #186)
- 2026-07-17: Postmark account submitted for approval
- 2026-08-03: MX record and inbound email setup (PR #582)
- 2026-08-05: Shared inbound webhook endpoint deployed and e2e tested (PRs #584, #586)
Repos
| Repo | Platform | Role | Status |
|---|---|---|---|
| ldraney/pal-e-platform | Forgejo | Postmark provider + module + DNS + inbound webhook | Merged |
| ldraney/pal-e-services | Forgejo | Keycloak SMTP config + email docs | Merged |