content surface · pds · lexicon-agnostic

<atproto-record-list>

Browse every record in any collection. Custom lexicons included — no dedicated component required.

<!-- browse a user's follow records -->
<atproto-record-list src="pfrazee.com" collection="app.bsky.graph.follow"></atproto-record-list>

<!-- browse a custom lexicon -->
<atproto-record-list
  src="did:plc:..."
  collection="com.example.recipe.recipe">
</atproto-record-list>
NameTypeDefaultDescription
src * string Author handle or DID.
collection * string Lexicon NSID — any collection, custom included.
limit number 10 Records per page.

External CSS can target these via atproto-record-list::part(<name>) { ... }.

PartWhat it is
headCollection + subject header.
listVertical list container.
recordEach nested atproto-lexicon-viewer.
loadmore / emptyPagination button + empty-state.

The high-level components (<atproto-feed>, <atproto-comments>) bake in Bluesky lexicon assumptions — they filter replies, render posts, use known field paths. The moment you want to browse a custom lexicon or a non-post collection (follows, likes, lists, recipe records, whatever), those components don't fit.

<atproto-record-list> is the escape hatch. Point it at any DID + collection pair and it paginates the records, rendering each as a full lexicon-viewer tree. Useful for custom-lexicon builders who want immediate browsability without writing a dedicated UI.