Skip to content

Instagram: the reels feed (/reels/) is not collected, only individual /reels/<code>/ pages #97

Description

@dale-wahl

Instagram: the reels feed (/reels/) is not collected, unlike every other listing page

Status: I decided this as a tradeoff to allow collecting individual reels via /reels/<code>/

What happens

Browsing instagram.com/reels/ collects nothing. instagram.com/reels/ always redirects to a specific reel and is thus not currently differentiable.

In the code, reels is absent from the views_serving_own_posts allowlist in modules/instagram.js, so the feed's /graphql/query responses are dropped.

Why it is excluded

Every other listing page displays what it delivers (I actually am not seeing any pre-loading at the moment in tests even!). An explore grid fetches 18 posts and puts 18 posts on screen; capturing the response captures what the user saw.

The reels feed does not. It delivers a batch of ~7-9 reels and shows one at a time, the rest being lookahead. Watch two and navigate away, and seven reels nobody saw would land in the dataset which are indistinguishable from ones that were watched by Zeeschuimer.

A second problem compounds it: instagram.com/reel/<code>/ — the format share links use — redirects to /reels/<code>/ (verified 2026-08-26). So opening somebody's shared reel puts you on the feed, at a URL indistinguishable from "I am browsing and this is reel #4". Allowlisting reels would therefore turn every opened share link into a nine-post harvest.

Why it is not simply fixed

The information needed — which reels were actually scrolled into view — never reaches the code that decides.

But, the signal does exist elsewhere. The reels feed rewrites the address bar to each reel's code as it comes into view, and js/zs-background.js already observes tab URL changes (that is how nav_index works). It is not currently plumbed through to modules.

Possible solution

Turn a response-driven decision into a view-driven one, for this surface only:

  1. When a reels batch arrives, capture() stashes the items in a module-scoped cache keyed by shortcode instead of returning them.
  2. Whenever a later request is seen while the tab is at /reels/<code>/, emit the cached item for <code> if it has not been emitted yet.

Open questions before attempting it:

  • Does anything fire per reel? Step 2 needs some request while each reel is on screen. Instagram sends logging_client_events during interaction, which capture() already sees and discards early, so the hook probably exists.
  • capture() has no tab id. A module-scoped cache would be shared across tabs and could mis-attribute. This may not super matter, but we do use tabs for our unique ids (and whether we recollect a post).
  • Cache lifetime. Entries for reels that are never scrolled should probably expire, but not sure how we do that.
  • Is it worth it for one surface? It's seems like it might be a lot.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions