content surface · constellation + pds

<atproto-thread>

Full thread view: ancestors above, focal post highlighted, nested reply tree below. One Constellation call gives us the whole thread.

<atproto-thread src="at://..." depth="2"></atproto-thread>
NameTypeDefaultDescription
src * string Focal post AT-URI or bsky.app URL. Can be mid-thread — the component finds the root automatically.
depth number 2 How deeply to render nested reply branches below the focal post.
constellation string Override the Constellation endpoint.

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

PartWhat it is
threadOuter container.
ancestorsThe parent chain above the focal post.
ancestorEach ancestor row (contains a compact atproto-post).
focalThe highlighted focal post (bordered in accent color).
repliesThe descendants section.
replyEach direct reply row.
branchNested reply sub-branch (children of a reply).
headSection headings inside the thread.

Every reply record carries both reply.parent.uri (immediate target) and reply.root.uri (thread root). So instead of walking the parent chain one PDS call at a time, we ask Constellation a single question: "give me every record whose reply.root.uri is this root." One XRPC call returns the entire thread — ancestors, siblings, descendants — at once.

The component then fetches each reply's record in parallel (to read reply.parent.uri for each), stitches parent-child relationships, and renders the tree with the focal post highlighted.

Flat latency regardless of thread depth. A 50-deep thread costs the same as a 2-deep one in Constellation time; PDS fetches parallelize.

  • Quote-link any post in a long thread and get the full context above and below it — readers see the full conversation, not just the line you pulled.
  • Embed a Bluesky AMA on your site — point at the question post, get the entire Q&A tree rendered below.
  • Debug your own thread — see every reply at once in a navigable tree.

Use <atproto-comments> when you want replies-only below an already-visible post (blog comments pattern — the post lives on your page, the comments are below it).

Use <atproto-thread> when the conversation itself is the content — you want ancestors visible, the focal post flagged, and the branches below, all in one component.

  • Constellation indexes the firehose — brand-new posts may take a few seconds to appear.
  • First page maxes at 100 replies (Constellation's limit). Threads exceeding that show a "thread exceeds 100 replies" hint; pagination for giant threads is a follow-up.
  • Deleted replies still show in the backlinks response if Constellation indexed them before deletion — the PDS fetch will fail and that branch will just not render.