content surface · pds

<atproto-blobs>

Browsable grid of a repo's blob CIDs, MIME-aware. Images render as <img>, videos as <video controls>, audio as <audio controls>, everything else as a labeled download tile.

<atproto-blobs src="pfrazee.com" limit="20"></atproto-blobs>
NameTypeDefaultDescription
src * string Handle or DID.
limit number 20 Blobs per page.

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

PartWhat it is
headCounter line above the grid.
gridTile grid container.
tile / cidEach blob tile + the CID label overlay.
loadmore / emptyPagination button and empty-state.

Calls com.atproto.sync.listBlobs and paginates CIDs. For each CID, it issues a HEAD request to getBlob to read the Content-Type header, then renders an element appropriate to the MIME:

  • image/*<img>
  • video/*<video controls playsinline preload="metadata">
  • audio/*<audio controls preload="metadata">
  • anything else → labeled download tile with a content-type-appropriate icon

listBlobs itself returns CIDs only. The HEAD roundtrip is cheap (headers only, no body download) and runs in parallel per page. The PDS exposes Content-Type via Access-Control-Expose-Headers so browsers can read it cross-origin.

  • Protocol debugging: verify that uploaded media landed in a repo. No need to fish through getRecord responses for blob references.
  • Media archaeology: browse every image a user has ever attached to a record (orphaned or not).
  • Custom lexicon builders: if your records reference blobs, this surfaces them in one view.

Some PDSes return 501 MethodNotImplemented for listBlobs — the component catches that and shows a short explanation. Public Bluesky PDSes tend to implement it; self-hosted installs vary.

If a PDS doesn't expose Content-Type via CORS, the HEAD request will succeed but the header read returns null — those blobs fall through to the "other" tile. Rare but possible.

Blobs are raw — no orphan filtering, no grouping by record. If your repo has 10,000 blobs, you'll paginate through 10,000 CIDs.

<atproto-repo> for the collection-level view of the same repo. <atproto-record-list> for browsing specific record types (which may reference these blobs).