Skip to content

0.3.0

Choose a tag to compare

@toniher toniher released this 16 Aug 13:23
· 8 commits to main since this release

Highlights

  • Saved posts now use Substack's unified reader API by default. A live parity comparison found it a strict superset of the older posts-only reader API (985 vs 1079 posts on a real account, with the legacy API's count also unstable run-to-run), with saved_at/ordering/wordcount all confirmed at 100%. The legacy API and DOM scraping remain automatic fallbacks; SUBSTACK_SAVED_POSTS_SOURCE (auto/unified/legacy/dom) can force a specific source.
  • Fixed a silent-truncation bug shared by all three cursor-paginated fetchers (posts, unified posts, notes): a persistent 429 mid-pagination used to return a partial list indistinguishable from a complete one. A --force sync now detects this and skips reconciliation for that run instead of risking soft-deleting posts/notes that were merely unreachable, not actually unsaved. Reported via a new partial sync status.
  • New diagnostic commands: probe-api (headless GET of any known API URL) and compare-saved-apis (parity report between the legacy and unified endpoints) for verifying Substack API behavior without guesswork.
  • Fixed inspect-network's response-body capture, which was silently recording zero bodies due to a sync-API deadlock risk; now uses request interception.
  • Fixed a version-string drift: --version and the package's __version__ had been stuck at 0.1.0 since a previous release.

Full changelog

0.2.0...0.3.0