A 'Load older' control in the import window pages back through a Substack
publication's archive (/api/v1/archive?offset=) beyond the ~20-item RSS window,
fetching each older post's body on demand (/api/v1/posts/<slug>). ListItemsOptions
gains an offset; offset 0 keeps the inline-body RSS path. Generic RSS feeds expose
only their recent window, so the control is Substack-only. Defensive JSON parsing;
selection preserved across paged loads. +20 tests.
- source-common: fetchAndParseFeed, mapRawItemToFeedItem (the shared
RawFeedItem to FeedItem mapping), buildResolvedFeed, applyLimit, FeedFetchError
- source-generic: GenericRssFeedSource (RSS/Atom/podcast, body from RSS)
- source-substack: SubstackFeedSource (free RSS bodies, paywall detection sets
audience/isTruncated; section deferred to the JSON API in a later release)
32 source tests; 194 total green; tsc + eslint clean.