content surface · pds

<atproto-feed>

Author's posts and reposts, chronological, paginated. PDS-direct — no AppView feed semantics.

<atproto-feed src="pfrazee.com" limit="10"></atproto-feed>
<atproto-feed src="..." include-replies></atproto-feed>
<atproto-feed src="..." no-reposts></atproto-feed>
NameTypeDefaultDescription
src * string Author handle or DID.
collection string app.bsky.feed.post Which collection to list. Override for custom lexicons.
limit number 10 Items per page (post + repost streams merged chronologically).
include-replies boolean Include the user's own replies (skipped by default).
no-reposts boolean Skip the parallel app.bsky.feed.repost stream.

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

PartWhat it is
feedContainer with role=feed.
feed-itemEach item wrapper (may include a repost-label + nested atproto-post).
repost-labelAttribution row above reposted items.
postEach nested atproto-post.
loadmore / emptyPagination button and empty-state.

Shows a chronological list of an author's records. By default: top-level posts plus the user's own reposts, merged by createdAt. Replies are filtered out (opt in with include-replies). Reposts render as their target post with a "Reposted by @handle" label above.

This is not a Bluesky-AppView-equivalent feed. There's no algorithmic ordering, no moderation labels, no thread collapse, no "Because you follow X" signals. It's a chronological list of the user's own records from their own PDS. For a Bluesky-like feed, use the official embed widget.

The feed pages each author independently. "Following feed" (posts from accounts you follow) isn't a thing here — that would require an aggregator, which is what the AppView is. We intentionally don't have one.

Under the hood the component runs two listRecords streams in parallel — app.bsky.feed.post (over-fetched 3x to offset reply filtering) and app.bsky.feed.repost (when not disabled) — and merges results by createdAt desc before capping at the limit. Two independent cursors track progress per stream.

If you ship a custom lexicon (com.example.article, whatever) and want an author-scoped chronological list of it, just pass collection. Reposts auto-disable for non-post collections. For full lexicon-agnostic browsing, see <atproto-record-list>.

  • <atproto-feed> — one author's chronological posts + reposts.
  • <atproto-thread> — a single conversation's full arc.
  • <atproto-record-list> — any collection, including non-posts.