Skip to content

0.3.1

Choose a tag to compare

@toniher toniher released this 22 Aug 16:01
· 2 commits to main since this release

Highlights

  • Reading-progress tracking & read_state filtering. Substack exposes per-post reading progress (read_progress/max_read_progress/is_viewed) on both unified and legacy reader APIs. They are now stored as columns and surfaced via read_state filters (unread/in_progress/finished/started) on list_posts/search_posts and MCP tools, with sorting by read_progress and minutes_remaining (word_count * (1 - max_read_progress)). is_fully_read and minutes_remaining are derived at read time from the high-water mark max_read_progress against a configurable SUBSTACK_SAVED_FULLY_READ_THRESHOLD (default 0.95, env SUBSTACK_SAVED_FULLY_READ_THRESHOLD). get_status now reports posts_unread/posts_in_progress/posts_fully_read/minutes_remaining_total. upsert_post now preserves 0.0 progress values (previously lost to or-coalescing).

  • inspect-network stability fixes. Removes the context.route("**/*") → route.fetch() → route.fulfill() interception that caused cross-tab stalls, CORS breakage, and content-encoding: gzip double-decompression (React feed failed to render). Replaced with a passive context.on("response") listener so every page asset and API call loads natively. Scopes the browser launch with --disable-blink-features=AutomationControlled, a desktop Chrome user-agent and 1280×800 viewport to pass Cloudflare Turnstile / cookie-banner checks.

  • Rate-limit resilience. Raises reader-API max_retries from 3→5 (with Retry-After-aware capped exponential backoff, 2–30 s) across all three cursor-paginated fetchers (legacy posts, unified posts, notes). Adds a 15 s cooldown between posts and notes phases of sync when the posts phase was truncated by rate-limiting, so the notes phase no longer immediately re-trips the same bucket.

  • Sync warning hygiene. Explicit api_context.dispose() in finally blocks for all Playwright request contexts (_fetch_saved_posts_page_impl, _fetch_saved_notes_page_impl, probe_api) suppresses Task was destroyed but it is pending! / TargetClosedError noise on sync completion after a mid-pagination 429.

Full changelog

0.3.0...0.3.1