This is the live roadmap for mailing-list-cli. Comment with feedback, vote with reactions, or open a Discussion to shape a section.
Status legend: ⬜ todo · 🟦 in progress · ✅ done
Architecture (locked)
mailing-list-cli shells out to email-cli for every send, audience operation, and webhook event. It does not talk to Resend directly. email-cli is a hard dependency.
Phase 0 — Spec & research
- ✅ Research swarm: five dossiers on competitors, Resend native capabilities, deliverability, and email templates (/research)
- ✅ Architecture decision: independent CLI on top of
email-cli, follows agent-cli-framework patterns
- ✅ Public repo + README + LICENSE + AGENTS.md
- 🟦 Design spec →
docs/specs/2026-04-07-mailing-list-cli-design.md
- ⬜ Implementation plan →
docs/plans/
Phase 1 — Foundations (v0.0.x)
- ⬜ Cargo project scaffold
- ⬜ Config (
~/.config/mailing-list-cli/config.toml)
- ⬜ Local SQLite store with migrations
- ⬜ JSON envelope output + TTY auto-detection
- ⬜ Semantic exit codes (0/1/2/3/4)
- ⬜ Self-describing
agent-info command
- ⬜ Dependency check on first run:
email-cli must be on \$PATH and email-cli agent-info must succeed
- ⬜
update self-update from GitHub Releases
- ⬜
skill install to drop the embedded skill into Claude / Codex / Gemini paths
- ⬜ CI: build, test, clippy, release-binary on tag
Phase 2 — Lists, contacts, segments (v0.1.0)
- ⬜
list create → wraps email-cli audience create
- ⬜
list ls → wraps email-cli audience list
- ⬜
contact add, contact tag, contact ls --filter, contact erase → all via email-cli contact …
- ⬜
contact import <file.csv> with rate-limit-aware chunking via email-cli contact create loops
- ⬜
segment create --filter, segment ls, segment members (segments are local — resolved at send time by querying email-cli)
- ⬜ Filter expression parser (
tag:vip AND opened_last:30d AND NOT bounced)
Phase 3 — Templates (v0.2.0)
- ⬜ Local template SQLite store (own to mailing-list-cli)
- ⬜ MJML compilation in-process via
mrml — no Node dependency
- ⬜ Handlebars merge tags
{{ snake_case }} rendered locally
- ⬜
template create, template ls, template show, template lint
- ⬜
template guidelines — embedded agent authoring guide
- ⬜ Auto plain-text alternative via
html2text
Phase 4 — Broadcasts & A/B testing (v0.3.0)
- ⬜
broadcast create — stages campaign metadata locally
- ⬜
broadcast preview — sends a single test via email-cli send
- ⬜
broadcast send — resolves segment → filters suppression → renders template per recipient → writes batch JSON → calls email-cli batch send --file …
- ⬜
broadcast schedule — local cron-style scheduler that triggers broadcast send at the right time
- ⬜
broadcast cancel — only works on scheduled broadcasts
- ⬜
broadcast ab — subject A/B with sample percentage and winner promotion
- ⬜ Pre-send invariant checks: suppression filter, RFC 8058 headers, physical address footer, complaint rate kill switch
Phase 5 — Webhooks, analytics, deliverability (v0.4.0)
- ⬜
event poll — pull recent events from email-cli events ls --json --since … and mirror into local DB
- ⬜
event listen — long-running daemon that polls on an interval
- ⬜
report show, report links, report engagement, report deliverability
- ⬜ Engagement scoring + auto-segments (engaged vs sunset)
Phase 6 — Compliance & opt-in (v0.5.0)
- ⬜
optin start / optin verify (double opt-in, signed HMAC tokens, 7-day expiry; optin start shells out to email-cli send for the confirmation email)
- ⬜ Global suppression list with typed reasons (
unsubscribed, hard_bounced, soft_bounced_repeat, complained, manually_blocked, spam_trap_hit, gdpr_erasure)
- ⬜
suppression ls, suppression import
- ⬜
dnscheck — SPF / DKIM / DMARC / FCrDNS validation
- ⬜ GDPR
contact erase, DSAR export
- ⬜ Per-jurisdiction consent tracking (CAN-SPAM, GDPR, CASL, PECR)
- ⬜ Warmup mode for new domains/IPs
Phase 7 — Polish (v1.0.0)
- ⬜ Homebrew tap entry
- ⬜ Pre-built binaries for macOS (arm64 / x86_64) and Linux
- ⬜ Shell completions (bash, zsh, fish)
- ⬜ End-to-end fixture tests with a stub
email-cli binary
- ⬜ Full agent-info contract test
Star the repo if you want this to exist. Open a Discussion if you want to shape it.
This is the live roadmap for
mailing-list-cli. Comment with feedback, vote with reactions, or open a Discussion to shape a section.Status legend: ⬜ todo · 🟦 in progress · ✅ done
Architecture (locked)
mailing-list-clishells out toemail-clifor every send, audience operation, and webhook event. It does not talk to Resend directly.email-cliis a hard dependency.Phase 0 — Spec & research
email-cli, follows agent-cli-framework patternsdocs/specs/2026-04-07-mailing-list-cli-design.mddocs/plans/Phase 1 — Foundations (v0.0.x)
~/.config/mailing-list-cli/config.toml)agent-infocommandemail-climust be on\$PATHandemail-cli agent-infomust succeedupdateself-update from GitHub Releasesskill installto drop the embedded skill into Claude / Codex / Gemini pathsPhase 2 — Lists, contacts, segments (v0.1.0)
list create→ wrapsemail-cli audience createlist ls→ wrapsemail-cli audience listcontact add,contact tag,contact ls --filter,contact erase→ all viaemail-cli contact …contact import <file.csv>with rate-limit-aware chunking viaemail-cli contact createloopssegment create --filter,segment ls,segment members(segments are local — resolved at send time by queryingemail-cli)tag:vip AND opened_last:30d AND NOT bounced)Phase 3 — Templates (v0.2.0)
mrml— no Node dependency{{ snake_case }}rendered locallytemplate create,template ls,template show,template linttemplate guidelines— embedded agent authoring guidehtml2textPhase 4 — Broadcasts & A/B testing (v0.3.0)
broadcast create— stages campaign metadata locallybroadcast preview— sends a single test viaemail-cli sendbroadcast send— resolves segment → filters suppression → renders template per recipient → writes batch JSON → callsemail-cli batch send --file …broadcast schedule— local cron-style scheduler that triggersbroadcast sendat the right timebroadcast cancel— only works on scheduled broadcastsbroadcast ab— subject A/B with sample percentage and winner promotionPhase 5 — Webhooks, analytics, deliverability (v0.4.0)
event poll— pull recent events fromemail-cli events ls --json --since …and mirror into local DBevent listen— long-running daemon that polls on an intervalreport show,report links,report engagement,report deliverabilityPhase 6 — Compliance & opt-in (v0.5.0)
optin start/optin verify(double opt-in, signed HMAC tokens, 7-day expiry;optin startshells out toemail-cli sendfor the confirmation email)unsubscribed,hard_bounced,soft_bounced_repeat,complained,manually_blocked,spam_trap_hit,gdpr_erasure)suppression ls,suppression importdnscheck— SPF / DKIM / DMARC / FCrDNS validationcontact erase, DSAR exportPhase 7 — Polish (v1.0.0)
email-clibinaryStar the repo if you want this to exist. Open a Discussion if you want to shape it.