A custom element for embedding Bluesky posts. Live demo
- Lightweight, the entire package + dependencies is only 24 KB (7 KB gzipped)
- Standalone, no additional middleman involved, connects straight to Bluesky's API
- Server-side rendering possible, which allows for no-JavaScript usage
This custom element is available on npm.
npm install bluesky-post-embed
Then, import the package on your app.
import 'bluesky-post-embed';
If you like, you can also rely on CDN services like esm.sh or JSDelivr.
<script type="module" src="https://esm.sh/bluesky-post-embed@~0.1.0"></script>
Bluesky posts can be embedded like so:
<bluesky-post src="at://pfrazee.com/app.bsky.feed.post/3kj2umze7zj2n">
<blockquote class="bluesky-post-fallback">
<p dir="auto">angel mode</p>
— Paul Frazee 🦋 (@pfrazee.com)
<a href="https://bsky.app/profile/pfrazee.com/post/3kj2umze7zj2n">January 16, 2024</a>
</blockquote>
</bluesky-post>
Adding a fallback content like above is heavily recommended for progressive enhancement.
src
Required
Absky.app
URL of the post.
Heavily recommended that the URL points to a DID instead of a handle, otherwise, it would have to resolve the handle into DID first (and suffer from issues like users changing their handles, etc)
An example of such URL would be: https://bsky.app/profile/did:plc:ragtjsm2j2vknwkz3zp4oxrd/post/3kj2umze7zj2ncontextless
Optional
Prevent displaying of context whensrc
points to a reply.allow-unauthenticated
Optional Allow displaying of posts even if author has opted for no public previewing.service-uri
Optional
URL to an AppView service, defaults tohttps://public.api.bsky.app
loaded
Fired when the embed has successfully loaded the posterror
Fired when the embed fails to load the post
The core of this package is a static HTML renderer, so long as your framework of choice has the means to deal with declarative shadow DOM, then it's possible to generate a completely static embed without any JavaScript in the client.
See this repository for an SSR demo made in Astro.