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.
Live
<atproto-thread src="at://..." depth="2"></atproto-thread> Attributes
| Name | Type | Default | Description |
|---|---|---|---|
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. |
Parts
External CSS can target these via atproto-thread::part(<name>) { ... }.
| Part | What it is |
|---|---|
thread | Outer container. |
ancestors | The parent chain above the focal post. |
ancestor | Each ancestor row (contains a compact atproto-post). |
focal | The highlighted focal post (bordered in accent color). |
replies | The descendants section. |
reply | Each direct reply row. |
branch | Nested reply sub-branch (children of a reply). |
head | Section headings inside the thread. |
How it works
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.
What you can do with it
- 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.
When to use this vs atproto-comments
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.
Limits
- 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.