Add ability to mark all items from a specific feed/source as read at once,
instead of clicking each item individually. The mark-read button becomes a
split button group with a caret that opens a popover offering "Mark [source]
as read". Items without a feedId (AP items) keep the simple button.
Confab-Link: http://localhost:8080/sessions/a477883d-4aef-4013-983c-ce3d3157cfba
Stripped dedup skeletons and unread items older than 30 days are now
hard-deleted on startup. Previously, stripped skeletons accumulated
forever and unread items had no expiry, causing unbounded collection
growth.
Confab-Link: http://localhost:8080/sessions/4d40ef89-a713-48c1-b4ed-0ffafca25677
The normalizer fix (1.0.35) only applies to newly ingested items.
Existing items in MongoDB lack photo arrays because dedup prevents
re-processing. Add the same extractImagesFromHtml() fallback in
transformToJf2() so images are extracted from content.html at read
time, making existing xkcd comics and photo posts display immediately.
- Add actor profile page with outbox fetcher for viewing AP actor posts
- Add follow/unfollow buttons on actor profile (delegates to AP plugin)
- Add AP actor link on item cards for posts from ActivityPub sources
- Add ensureActivityPubChannel() for auto-creating Fediverse channel
- Add AP-aware item storage with dedup, attachments, and categories
- Add CSS styles for actor profile cards and AP-specific UI elements
- Bump version to 1.0.31
- Add SSRF blocklist to media proxy (block private/internal IPs)
- Escape regex in searchItems() to prevent ReDoS
- Sanitize webmention content.html before storage (XSS prevention)
- Return 404 instead of redirect on failed media proxy (open redirect fix)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevents dateString.split crash when Nunjucks | date filter receives
Date objects from MongoDB. Audit timestamps (createdAt, updatedAt,
lastFetchedAt, etc.) now use .toISOString(). Query-used fields
(published, nextFetchAt) kept as Date objects for MongoDB compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add date filter to channel unread counts (UNREAD_RETENTION_DAYS = 30)
- Update getUnreadCount to also filter by date
- Prevents inflated counts from old accumulated items
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Runs cleanupAllReadItems on server startup to clean up accumulated
read items from all channels, keeping only the 30 most recent per
channel per user.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Prevents database accumulation by automatically deleting older read
items when marking items as read. Keeps the 30 most recent read items
per channel per user to allow revisiting recently read content.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add countReadItems function to storage/items.js
- Update getTimelineItems to filter out read items by default
- Add showRead query param support to channel controller
- Update channel.njk with show/hide read toggle buttons
- Add "All caught up!" state when all items are read
- Add JavaScript handler for individual mark-read buttons
- Mark-read now hides the item with smooth animation
- Add locale strings: showRead, hideRead, allRead
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Fork of @indiekit/endpoint-microsub with customizations.
Enables subscribing to feeds and reading content using the Microsub protocol.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>