Instead of checking twelve sites, have one email arrive each morning with what's new. It's a scheduled job, some parsing and a send — and it teaches all three.

1. Fetch politely and remember what you've seen

digest-fetch.txt
Build the fetch step for an RSS digest.

- Read feed URLs from a config file.
- Fetch with a real User-Agent and a timeout. Send If-Modified-Since
  and handle 304 — most feeds support it and it's much politer.
- Parse RSS and Atom; both exist and differ.
- Deduplicate against items already seen, stored by item GUID or link.
- One feed failing must not stop the others. Collect errors and report
  them at the end.

Store seen items with a timestamp so I can prune anything older than
<n> days rather than growing forever.

Deduplication is the whole thing. Without it your digest repeats yesterday's items and you stop reading it within a week.

2. Filter, or it becomes noise

An unfiltered digest of twelve feeds is worse than the websites. Add keyword includes and excludes per feed, and cap how many items each feed can contribute — otherwise one prolific source drowns everything else.

3. Format for skimming

Grouped by source. Title as a link, one line of description, nothing more. The digest's job is to help you decide what to open, not to replace reading.

Put the item count in the subject line so you can tell at a glance whether it's worth opening.

4. Schedule it and watch for silence

A cron job or your host's scheduler. Then the thing everyone forgets: know when it didn't run. A digest that silently stops feels exactly like a quiet week.

Send it even when there's nothing new — a "nothing today" email is proof the system is alive.

Send it to yourself for a fortnight before adding features. You'll find the filters need tuning far more than the formatting does.