···131131132132This only covers the signed-in user's own data. If subscribed authors have not yet been indexed, fan-in finds no posts. Running the backfill Lambda with both the reader's and the author's DIDs resolves this.
133133134134+## Subscriptions page
135135+136136+The `/subscriptions` route (`app/routes/subscriptions.tsx`) lets a signed-in reader view and manage all publication subscriptions in one place.
137137+138138+### Data flow
139139+140140+Subscription records (`Subscription[]`) are loaded once per session by `DataProvider` (`app/lib/data-context.tsx`) via `GET /subscriptions` and stored in React context. The subscriptions page reads those records directly from context — it never calls the API itself for the subscription list.
141141+142142+Publication details (name, site URL, description) are **not** stored in context because resolving them requires a separate `GET /publications?did=<authorDid>` call per author. Instead, the page resolves them lazily in pages as the reader scrolls.
143143+144144+### Infinite scroll
145145+146146+The page loads publication details for 20 subscriptions at a time:
147147+148148+1. The initial `useEffect` fires once when `subscriptions` first becomes defined in context (`initializedRef` prevents re-triggering on subsequent context updates from unsubscribes).
149149+2. For each page slice, subscriptions are grouped by `authorDid` and `listPublicPublications` is called for each unique author — at most 5 concurrent requests at a time (`BATCH = 5`) using `Promise.allSettled`. Failed author lookups are silently dropped; the rest are rendered.
150150+3. An `IntersectionObserver` on a sentinel `<div>` at the bottom of the list triggers the next page fetch when it scrolls into view. The observer captures `offset` and `subscriptions` at setup time so stale closure values are avoided.
151151+152152+### Unsubscribe
153153+154154+Clicking "Subscribed" on a card calls `DELETE /subscriptions/:rkey` on the API and then calls `removeSubscription(rkey)` on the context, which filters the record out of the shared `subscriptions` array. The card is also removed from the local `pubs` state. The `initializedRef` guard ensures the removed subscription does not re-trigger the initial fetch loop.
155155+134156## Jetstream indexer
135157136158### What it does