Outbound email operations control plane for teams that want reliable sending without heavyweight ESP lock-in.
Sending email is easy. Operating email safely at scale is hard.
maild exists to make outbound delivery operations auditable and reliable:
- queue first, send safely
- enforce suppression and unsubscribe rules everywhere
- keep failure handling explicit (retries, replay, incident context)
- let operators see what happened and act fast
maild is intentionally focused. It is not trying to be a full CRM or marketing automation suite.
Most teams end up with ad-hoc scripts plus provider dashboards. That creates blind spots:
- retries and rate limits are inconsistent
- suppression/unsubscribe enforcement is fragile
- webhook failures are hard to recover from
- incidents are slow to triage because logs and context are fragmented
maild centralizes those concerns in one control plane.
maild is:
- outbound send orchestration (API -> queue -> worker)
- SMTP provider control with failover-aware operations
- policy and compliance safety layer
- operator console for logs, timeline, and incident workflows
maild is not:
- inbox hosting (no IMAP/POP/webmail)
- a complete ESP marketing suite (yet)
- Stable v0.x control-plane core is implemented.
- API, queue/worker, retries, safety checks, and signed webhooks are in place.
- User-facing auth and dashboard exist.
- Operator UI exists at
/ui,/ui/logs,/ui/onboarding,/ui/incidents, and/ui/policy.
- Use
.env.production.exampleas the baseline for production deployments. APP_ENV=productionnow enforces strict startup validation and fails fast when required runtime values are missing or still using development defaults.- Ownership and rotation expectations are documented in
deploy/production-config.md.
Roadmap execution is tracked in GitHub milestones/issues:
v0.6.0Production hardening baselinev0.7.0Campaign composer MVPv0.8.0Audience builder MVPv0.9.0Ops and onboarding maturityv1.0.0GA release gate- #23 full end-to-end QA matrix
- Go (
cmd/server,internal/*) - PostgreSQL
- Redis
- Server-rendered web UI (no Node build chain)
- Bootstrap development:
make setup- Run server:
make run- Health check:
curl -sS http://localhost:8080/healthz- Local SMTP inbox (Mailpit):
http://localhost:8025
POST /v1/messagesPOST /v1/messages/retryPOST /v1/webhooks/eventsGET /v1/webhooks/logsPOST /v1/webhooks/replayPOST /v1/smtp-accountsGET /v1/smtp-accounts/listPOST /v1/smtp-accounts/activateGET/POST /v1/workspaces/policyGET /v1/messages/logsGET /v1/messages/timelineGET /v1/incidents/bundle
User/auth routes:
GET /GET/POST /signupGET/POST /loginGET /dashboard
Operator routes:
GET /uiGET /ui/logsGET /ui/onboardingGET /ui/incidentsGET /ui/policy
- API key auth for
/v1/* - role separation (
adminvsoperator) - encrypted SMTP credentials at rest (AES-GCM)
- workspace/domain rate limits
- blocked-recipient domain policy
- suppression and unsubscribe enforcement
- signed webhook verification (when enabled)
Before merging:
make verifyFor a security-inclusive local pass:
make verify-fullGNU Affero General Public License v3.0 (AGPL-3.0). See LICENSE.