Embed a live Bluesky profile card with AnyWidget
We have been spending time lately exploring Bluesky and the AT Protocol that powers it. There is something genuinely exciting about a social network built on an open protocol where public data is actually, properly public — no API keys, no rate-limited developer tiers, just a clean HTTP endpoint anyone can call. That philosophy of openness feels important, and we are keen to see where it goes.
While poking around the APIs, we built a small AnyWidget as a way to play with the data — a live profile card that fetches directly from the AT Protocol public API in the browser and renders inline in any MyST article or Curvenote document. If you missed it, we recently wrote about how AnyWidgets are being upstreamed into MyST core and are already available in Curvenote today.
Using it in your own documents¶
Drop the any:bundle directive into any MyST Markdown file and point it at your handle:
:::{any:bundle} https://curvenote.github.io/widgets/widgets/bluesky-profile-card.js
{ "actor": "your-handle.bsky.social" }
:::The body is a small JSON object with four optional fields:
| Field | Type | Default | Description |
|---|---|---|---|
actor | string | — | Bluesky handle or DID (required) |
show_stats | boolean | true | Show followers / following / post counts |
theme | "light" | "dark" | "light" | Card colour scheme |
link_target | boolean | true | Make the card clickable, opening the profile on https://bsky.app |
The widget is a plain ESM module — no bundler, no build step, no server. It fetches the profile at render time from api.bsky.app and works in any browser that supports ES modules.
We are only just getting started with what the AT Protocol makes possible. The data model is rich, the community is active, and there is real momentum behind the idea that social content should be portable and open. Expect more experiments here. In the meantime, come find us on Bluesky at opensci.dev and row1.ca.