DarDev Ops orchestrates company mail—it never owns SMTP truth. The console at ops.dardev.net links to Stalwart admin, Listmonk, Zoho mail settings, and GoDaddy DNS; it shows drift, queue depth, and campaign status. It does not store SMTP passwords, edit MX records, set From or Reply-To headers, or replace the native admin UIs. That boundary keeps deliverability authority where SPF, DKIM, and DMARC actually live, as documented in inside-unified-mailer-stack and crm-orchestrates-bus-executes.
The policy in one sentence
Ops links and validates; Stalwart, Listmonk, Zoho, and GoDaddy configure. Capability actions may peek queues or verify DKIM via bus APIs—they do not expose mailbox password forms or DNS record editors in Ops.
Why we locked this rule
Early Ops prototypes duplicated Listmonk SMTP fields and GoDaddy TXT editors. Two sources of truth caused incidents: Ops showed one SPF string, live DNS another, campaigns sent from wrong identity. Consolidating config in authoritative systems plus read-only drift in Ops eliminated a class of bugs. deployed-realities-explained: we document the policy publicly so contractors do not build forbidden UI.
Two mail domains
- @dardev.net — Zoho MX inbound; staff 1:1, forms, Twenty human workflows (contact@dardev.net)
- @send.dardev.net — Stalwart outbound; Listmonk campaigns, sync-worker automation (news@send.dardev.net)
- @sales.dardev.net — Stalwart sales outreach (20.tn, Services tracked mail)
- @agents.dardev.net — programmatic bot SMTP only—not webmail
What Ops does for mail
- smtp-stalwart capabilities: peek-queue, verify-dkim (read/check via bus)
- list-listmonk capabilities: list-subscribers, draft-campaign, sync-templates (orchestrated actions, editor in Listmonk)
- DNS connectors: check-drift, verify-spf-dkim (compare expected vs live; link to GoDaddy/OVH)
- Deep links to mta.dardev.net Stalwart admin, mail.dardev.net Listmonk, webmail.dardev.net Roundcube
- Daily digest trigger with confirm—bus executes direct SMTP, Ops does not hold credentials in SQLite
Explicit non-goals in UX
OPS-UX-DELIVERABLES-BRIEF section 12 lists forbidden designs: SMTP or mailbox config forms, DNS record editor, full Listmonk campaign scheduler, embedded CRM iframe. WhatsApp and Slack API notification settings are out—team alerts stay in-app plus optional staff email.
Where configuration actually happens
- Stalwart WebAdmin on mta.dardev.net — identities, DKIM keys, accounts for send/sales/agents domains
- Listmonk admin — messenger SMTP pointing at Stalwart, templates, lists, campaign scheduling
- Zoho Mail — @dardev.net mailboxes, inbound routing
- GoDaddy DNS — SPF, DKIM TXT, DMARC, BIMI prerequisites per docs/DNS-GODADDY.md
- Repo .env on dardev-vps — LISTMONK_SMTP_PASSWORD and bus secrets; never in Ops database
Runbooks under scripts/mail/ and docs/STALWART-MTA.md are canonical for engineers. Ops runbooks link there—not inline secret fields.
Orchestration vs execution
When an operator clicks Draft campaign in Hesabi workspace, Ops calls a list-listmonk capability that hits the bus—Listmonk UI still owns schedule and content review. When Twenty workflow fires 20.tn send-one, CRM orchestrates timing; bus POST executes Stalwart SMTP. Ops might show outreach dry-run status via connector—it does not open port 587 from the Next.js container.
Warm-up and rate limits
MAIL_SEND_PROFILE=warmup and DAILY_SEND_MODE=direct live in platform bus env on VPS. Ops displays send profile status; changing limits is deploy and env change, not a slider in Settings. Large lists run at queue pace—Ops warns in copy, does not fake instant blast.
Per-product SMTP (M20 direction)
Hesabi send.hesabi.tn identity appears as smtp-stalwart connector config in Hesabi manifest—still edited in Stalwart admin, referenced by manifest for Ops labels and verify-dkim scope. smtp-external provider adds verify-auth for non-Stalwart APIs without moving credentials into Ops.
Maturity roadmap alignment
OPS-MATURITY-V1-ROADMAP verdict six: Ops orchestrates only. M20 multi mail provider adds external SMTP connector capabilities—not Ops-owned password vaults. Security gate M17 keeps bus auth fail-closed; Ops never bypasses with ad-hoc SMTP from browser.
DNS drift without DNS editor
Ops dns-godaddy and dns-ovh connectors run check-drift and verify-spf-dkim capabilities—comparing expected records from docs/DNS-GODADDY.md templates against live API reads. Results render as ok, warn, or err chips with links to registrar consoles. Operators copy corrected TXT values manually in GoDaddy or OVH; Ops never POSTs DNS mutations. BIMI and DMARC quarantine prerequisites follow the same pattern: read and link, edit elsewhere.
Listmonk and campaign boundaries
Ops may draft campaigns via bus API—creating draft rows operators finish in Listmonk UI. Scheduling, A/B tests, and messenger SMTP host fields stay in Listmonk admin. Known Listmonk v6.1.0 SMTP load bug is pinned in runbooks; Ops does not patch messenger settings inline. Template sync capabilities pull repo HTML into Listmonk; authoritative template edit may still happen in git plus merge workflow.
Staff training snippet
If mail breaks, triage in order: Stalwart queue and auth, Listmonk messenger SMTP test, DNS drift panel in Ops (read-only), Zoho only if inbound @dardev.net affected. Do not create shadow SMTP settings in Ops notes or SQLite—the next engineer will trust the wrong screen.
Can Ops fix SPF drift?
Ops shows expected vs live via check-drift and links to GoDaddy. Humans edit DNS in registrar UI—not from Ops forms.
Why show Listmonk actions if Ops does not own SMTP?
Actions orchestrate API calls with existing Listmonk SMTP config. Listmonk remains editor for messenger credentials.
Does Ops configure Roundcube?
No. webmail.dardev.net is Stalwart login plus plugins—deploy via scripts/deploy-webmail.sh, not Ops Settings.
Where is this policy written for designers?
docs/ops/OPS-UX-DELIVERABLES-BRIEF.md business rules and non-goals tables; AGENTS.md learned preferences for agents.
How does this relate to CRM orchestration?
Twenty decides who receives outreach; bus and Stalwart send. Ops triggers approved capabilities but never replaces mail stack config—crm-orchestrates-bus-executes.



