Summary
Add an email delivery sink so users can receive their daily digest directly in their inbox.
Why
Email is the most universally available notification channel. Many users don't have a Slack workspace or ServerChan account, but everyone has email. This is the highest-impact missing sink.
What to implement
A new sink at sinks/email/ that:
- Sends the daily digest as an email with both plain-text and HTML parts
- Supports two backends (contributor chooses one or both):
- SMTP — works with Gmail, Outlook, Fastmail, self-hosted, etc.
- SendGrid — simpler API, generous free tier
- Reads credentials from environment variables:
- SMTP:
SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD
- SendGrid:
SENDGRID_API_KEY
- Config options:
to_address, from_address, subject_prefix, max_papers, max_hn, max_github
Config shape
sinks:
email:
enabled: false
backend: smtp # or "sendgrid"
to: "you@example.com"
from: "digest@example.com"
subject_prefix: "[MyDailyUpdater]"
max_papers: 5
max_hn: 3
max_github: 3
How to get started
- Copy
sinks/_template/ to sinks/email/
- Look at
sinks/slack/ as a reference for the delivery pattern
- Register in
sinks/__init__.py
- Wire secrets into
.github/workflows/daily.yml
- Write tests — mock the SMTP connection or SendGrid client
- Add
sinks/email/README.md with setup instructions for both backends
Acceptance criteria
Summary
Add an email delivery sink so users can receive their daily digest directly in their inbox.
Why
Email is the most universally available notification channel. Many users don't have a Slack workspace or ServerChan account, but everyone has email. This is the highest-impact missing sink.
What to implement
A new sink at
sinks/email/that:SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORDSENDGRID_API_KEYto_address,from_address,subject_prefix,max_papers,max_hn,max_githubConfig shape
How to get started
sinks/_template/tosinks/email/sinks/slack/as a reference for the delivery patternsinks/__init__.py.github/workflows/daily.ymlsinks/email/README.mdwith setup instructions for both backendsAcceptance criteria
sinks/email/__init__.pywithEmailSinkclasssinks/email/README.mdwith setup instructionssinks/__init__.pyconfig/sources.yaml(commented out)daily.ymlpytest tests/ -qpasses