All notable changes to instagram-scraper. Format loosely follows
Keep a Changelog; versions are shared
across the monorepo packages.
- CLI
highlights <username>gains filter flags:--album <titles>— only albums whose title contains one of these (comma-separated, case-insensitive substring match).--since <date>/--until <date>— keep only items posted within the date window (a bareYYYY-MM-DDfor--untilcovers the day).
- A privacy-oriented
pre-pushgit hook (.githooks/pre-push) — blocks pushes that introduce secrets or denylisted identifiers;--scan-allaudits the whole tree before publishing. Denylist stays local, never committed (see.githooks/denylist.sample).
- Highlights-tray discovery —
scrapeHighlightsTray(http, username)lists every permanent Highlights album of a profile. The tray is not in the profile SSR; it loads via thePolarisProfileStoryHighlightsTrayContentQueryGraphQL XHR, which the scraper intercepts. - CLI
highlights <username>— discovers and scrapes all of a profile's highlight albums in a single pass. HttpClient.captureXhraccepts an optionalrequestPatternthat matches the request body — required to disambiguate the shared/graphql/queryendpoint by GraphQL friendly name.
scrapeHighlightByIdreturned nothing: Instagram renamed the album SSR field toxdt_api__v1__feed__reels_media__connection(a GraphQL connection). The stories parser now reads both the connection (edges[].node) shape and the legacy field.captureXhrnavigates withdomcontentloadedinstead ofnetworkidle, which never settles on Instagram and caused spurious navigation timeouts.
Initial monorepo: Playwright auth (persistent context + cookie import),
HTTP client with jitter and checkpoint detection, Apollo-cache extractor,
parsers (profile / post / reel / stories / highlight / hashtag /
location), media downloader with atomic writes, the instagram-scraper
CLI, and the FilesystemAdapter storage tree.