Adds FeedLand (feedland.com or self-hosted) as a new source type alongside
OPML and Microsub. Syncs subscriptions via FeedLand's public OPML endpoint
with optional category filtering and AJAX category discovery in the admin UI.
Prevents dateString.split crash when Nunjucks | date filter receives
Date objects from MongoDB. All stored dates now use .toISOString().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Extract ~560 lines of inline CSS to external assets/styles.css
- Create intermediate layout (layouts/blogroll.njk) for CSS loading
- Use section(), badge(), button(), prose() macros instead of raw HTML
- Remove custom page headers (document.njk heading() handles via title/parent)
- Add parent breadcrumb navigation to all sub-pages
- Add consumeFlashMessage() to dashboard and sources controllers
- Rename CSS class prefix from br-* to blogroll-* for clarity
- Use upstream CSS custom properties without fallback values
- Fix Microsub orphan detection (soft-delete unsubscribed blogs)
- Fix upsert to conditionally set microsub fields (avoid path conflicts)
- Skip soft-deleted blogs during clear-and-resync
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Decode HTML entities (& ' etc) in feed titles and summaries
- Add isFuture flag to API items for future-dated posts
- Bump version to 1.0.12
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Microsub source type to sync subscriptions from Microsub channels
- Use reference-based approach to avoid data duplication:
- Blogs store microsubFeedId reference instead of copying data
- Items for Microsub blogs are queried from microsub_items directly
- No duplicate storage or retention management needed
- Add channel filter and category prefix options for Microsub sources
- Add webhook endpoint for Microsub subscription change notifications
- Update scheduler to skip item fetching for Microsub blogs
- Update items storage to combine results from both collections
- Bump version to 1.0.7
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Indiekit date filter expects ISO strings, not JavaScript Date objects.
This fixes 'dateString.split is not a function' errors in the dashboard.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>