The window now starts at the last dispatch, so pressing send twice does not
repeat a digest. Cards prefer entries that have a cover, the newest one of
them opens the message as a full width image, and the page says when the
last digest went out.
Each project leads with up to three cards: title, teaser and the cover
image as a thumbnail, the rest follows as a compact list. Entries sort by
number inside a project instead of jumping, and the project name links to
its archive.
POST /api/v1/weekly-report collects everything published in the last seven
days, groups it by project and posts one message. dry=1 returns the message
instead of sending it, no publications means no message, a missing webhook
answers 501 instead of failing quietly. scripts/cron.mjs runs the due
publishing first, then the digest.