Repository navigation
Roadmap: from spec to v0.1 #1
Copy link
Copy link
Open
Description
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-infocommand - ⬜ Dependency check on first run:
email-climust be on\$PATHandemail-cli agent-infomust succeed - ⬜
updateself-update from GitHub Releases - ⬜
skill installto 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→ wrapsemail-cli audience create - ⬜
list ls→ wrapsemail-cli audience list - ⬜
contact add,contact tag,contact ls --filter,contact erase→ all viaemail-cli contact … - ⬜
contact import <file.csv>with rate-limit-aware chunking viaemail-cli contact createloops - ⬜
segment create --filter,segment ls,segment members(segments are local — resolved at send time by queryingemail-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 viaemail-cli send - ⬜
broadcast 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 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 fromemail-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 startshells out toemail-cli sendfor 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-clibinary - ⬜ Full agent-info contract test
Star the repo if you want this to exist. Open a Discussion if you want to shape it.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
Pivot architecture: shell out to email-cli, not Resend directly
chore(template): v0.1.3 — Codex-reviewed lint fixes
docs: session 5 planning handoff — post-v0.3.0 research + v0.4 scope
feat(broadcast): atomic lock CAS prevents concurrent send race