email-digest

Configure, test, and troubleshoot the reading-list daily email digest delivered via nodemailer.

7 stars

Best use case

email-digest is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Configure, test, and troubleshoot the reading-list daily email digest delivered via nodemailer.

Teams using email-digest should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/email-digest/SKILL.md --create-dirs "https://raw.githubusercontent.com/heldernoid/agentic-build-templates/main/projects/web-applications/reading-list/skills/email-digest/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/email-digest/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How email-digest Compares

Feature / Agentemail-digestStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Configure, test, and troubleshoot the reading-list daily email digest delivered via nodemailer.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# email-digest skill

The reading-list digest sends a daily email summarizing unread articles. It is delivered via nodemailer using SMTP credentials. The digest is scheduled by a `setInterval` loop that runs every minute and checks whether the configured delivery time has been reached.

## SMTP configuration

Set these environment variables before starting the server:

```bash
DIGEST_SMTP_HOST=smtp.gmail.com
DIGEST_SMTP_PORT=587
DIGEST_SMTP_USER=you@gmail.com
DIGEST_SMTP_PASS=<app-specific-password>
DIGEST_FROM="Reading List <you@gmail.com>"
```

### Gmail setup

Gmail requires an App Password when 2FA is enabled:

1. Go to https://myaccount.google.com/security
2. Under "How you sign in to Google", open "2-Step Verification"
3. Scroll to "App passwords" and generate one for "Mail"
4. Use the generated 16-character password as `DIGEST_SMTP_PASS`

### Self-hosted SMTP (Postfix / local)

```bash
DIGEST_SMTP_HOST=localhost
DIGEST_SMTP_PORT=25
DIGEST_SMTP_USER=
DIGEST_SMTP_PASS=
```

Leave `USER` and `PASS` empty if your local MTA does not require auth.

### Mailhog (development testing)

Run Mailhog locally to catch emails without sending them:

```bash
docker run -d -p 1025:1025 -p 8025:8025 mailhog/mailhog
```

Then set:

```bash
DIGEST_SMTP_HOST=localhost
DIGEST_SMTP_PORT=1025
DIGEST_SMTP_USER=
DIGEST_SMTP_PASS=
```

Open http://localhost:8025 to view captured emails.

## Digest API

### Get configuration

```bash
curl http://localhost:3000/api/digest/config
```

Response:

```json
{
  "enabled": true,
  "deliveryTime": "08:00",
  "email": "you@example.com",
  "minWordCount": 0,
  "maxArticles": 10
}
```

### Update configuration

```bash
curl -X PATCH http://localhost:3000/api/digest/config \
  -H 'Content-Type: application/json' \
  -d '{
    "enabled": true,
    "deliveryTime": "08:00",
    "email": "you@example.com",
    "minWordCount": 300,
    "maxArticles": 10
  }'
```

- `deliveryTime`: 24-hour `HH:MM` format in UTC.
- `minWordCount`: Only include articles with at least this many words. Set to `0` to include all.
- `maxArticles`: Maximum articles included per digest. Sorted by newest first.

### Send a digest immediately (for testing)

```bash
curl -X POST http://localhost:3000/api/digest/send
```

This bypasses the schedule and sends a digest right now to the configured email. Useful for verifying SMTP config.

### View sent history

```bash
curl http://localhost:3000/api/digest/history
```

Returns an array of past digest runs:

```json
[
  { "id": "dgs_1", "sentAt": "2026-03-20T08:00:00Z", "articleCount": 10, "status": "sent" },
  { "id": "dgs_2", "sentAt": "2026-03-19T08:00:00Z", "articleCount": 7,  "status": "sent" },
  { "id": "dgs_3", "sentAt": "2026-03-18T08:00:00Z", "articleCount": 0,  "status": "skipped" }
]
```

Status values:

| Status | Meaning |
|--------|---------|
| `sent` | Digest was sent successfully |
| `skipped` | No unread articles met the criteria; nothing was sent |
| `failed` | SMTP error; check server logs |

## Digest email format

The digest email is an HTML email containing:

- Subject: `Reading List Digest - March 20`
- Header: count of articles and total estimated reading time
- Article list: thumbnail placeholder, title, site name, excerpt, read time, tag chips, and a "Read Now" link
- Footer: unsubscribe link that calls `PATCH /api/digest/config` with `{ "enabled": false }`

## Troubleshooting

**No digest received**

1. Check that `enabled` is `true` in the digest config.
2. Verify the configured email address is correct.
3. Trigger a manual send: `POST /api/digest/send`.
4. Check the SMTP credentials by sending a test email:

```bash
node -e "
const nodemailer = require('nodemailer');
const t = nodemailer.createTransport({
  host: process.env.DIGEST_SMTP_HOST,
  port: parseInt(process.env.DIGEST_SMTP_PORT || '587'),
  auth: { user: process.env.DIGEST_SMTP_USER, pass: process.env.DIGEST_SMTP_PASS }
});
t.verify().then(() => console.log('SMTP OK')).catch(e => console.error(e.message));
"
```

**Digest sent but emails not arriving**

- Check spam folder.
- For Gmail, ensure the App Password is correct and 2FA is active.
- Check `digest_history` table for `status='failed'` rows; the `error_msg` column contains the SMTP error.

**Digest sends at wrong time**

The scheduler compares the current UTC time to `deliveryTime`. If your server is in a non-UTC timezone, convert your local time to UTC. For example, if you want delivery at 8am UTC+2, set `deliveryTime` to `06:00`.

**Digest skipped despite having unread articles**

The digest is only sent if at least one article passes the `minWordCount` filter. Lower the threshold or set it to `0`.

Related Skills

email-reports

7
from heldernoid/agentic-build-templates

Configure and trigger weekly habit progress email reports via SMTP. Use when you need to set up email delivery, test SMTP settings, send the weekly report immediately, or preview the report content. Triggers include "send report", "email summary", "weekly digest", "SMTP setup", or "habit email".

Skill: email-digest-builder

7
from heldernoid/agentic-build-templates

Use email-digest-builder to manage feeds, topics, and digest delivery through the REST API.

Skill: Uptime Monitoring

7
from heldernoid/agentic-build-templates

## Overview

Skill: Status Page

7
from heldernoid/agentic-build-templates

## Overview

Skill: unit-conversion

7
from heldernoid/agentic-build-templates

## Overview

Skill: recipe-scaler

7
from heldernoid/agentic-build-templates

## Overview

reading-list

7
from heldernoid/agentic-build-templates

Operate the reading-list API to save, manage, tag, search, and export articles.

websocket-realtime

7
from heldernoid/agentic-build-templates

Use the WebSocket connection in poll-builder to receive live vote updates. Use when you need to stream real-time poll results, monitor a poll for new votes, or build a live dashboard. Triggers include "live results", "real-time updates", "stream votes", "watch poll", or "WebSocket".

poll-builder

7
from heldernoid/agentic-build-templates

Self-hosted poll creation tool with real-time results. Use when you need to create a poll, check vote counts, close a poll, export results, or get the shareable link for a poll. Triggers include "create poll", "vote", "poll results", "survey", "collect votes", "share poll", or any task involving polling or voting.

Skill: personal-finance

7
from heldernoid/agentic-build-templates

## Overview

Skill: csv-import

7
from heldernoid/agentic-build-templates

## Overview

Skill: Syntax Highlighting

7
from heldernoid/agentic-build-templates

## Purpose