{"id":23266,"date":"2026-08-14T12:37:47","date_gmt":"2026-08-14T12:37:47","guid":{"rendered":"https:\/\/scannn.com\/introducing-bluesky-protocol-services-at-protocol\/"},"modified":"2026-08-14T12:37:47","modified_gmt":"2026-08-14T12:37:47","slug":"introducing-bluesky-protocol-services-at-protocol","status":"publish","type":"post","link":"https:\/\/scannn.com\/lv\/introducing-bluesky-protocol-services-at-protocol\/","title":{"rendered":"Introducing Bluesky Protocol Services - AT Protocol"},"content":{"rendered":"\n<div>\n<p>Today we\u2019re launching <strong><a href=\"https:\/\/bsky.network\" target=\"_blank\" rel=\"noopener noreferrer\">Bluesky Protocol Services<\/a><\/strong>: a new brand, and a new website, for the public infrastructure Bluesky operates on the <a href=\"https:\/\/atproto.com\" target=\"_blank\" rel=\"noopener noreferrer\">AT Protocol<\/a> network.<\/p>\n<p>Bluesky has always run more than the Bluesky app. We operate Jetstream instances, relays, and the Bluesky API endpoints built on atproto. But if you were a developer trying to build on that infrastructure, our docs didn\u2019t always make it easy to tell what we run as a service or where to start. We\u2019re fixing that today. Bluesky Protocol Services organizes all the documentation developers need within the ecosystem, clarifies the service contracts around Bluesky-provided infrastructure, replaces the old docs.bsky.app site and gives us a clean way to ship future releases like the ones in this post!<\/p>\n<p>The headline release shipping alongside the new site is <strong>Jetstream v2<\/strong>. Jetstream is the best way for most developers to use the network at scale: you describe the slice you want, and it arrives as plain JSON over a WebSocket. What it couldn\u2019t give you was <em>history<\/em>. If you needed the records that already existed on the network, you had to backfill repos yourself then cut over to the live stream.<\/p>\n<p>Jetstream v2 adds that capability to the server. It keeps a compressed archive of the whole network and adds a new way to consume it, alongside the live tail:<\/p>\n<p><strong>Network Replay<\/strong> lets you catch up from any point in the past and cut over to live with no gap. You <code>POST<\/code> your filters to <code>planSnapshot<\/code>, download the sealed segments it returns over plain HTTP, then connect the live WebSocket once at the tip. Replay is <strong>stateless on the server<\/strong>, with no per-consumer cursor, no subscription to register, and nothing to stage on the client. Jetstream is your buffer.<br \/>\nYou can also <em>just<\/em> snapshot the network \u2014 a point-in-time copy of the archive over HTTP only (<code>listSegments<\/code> + <code>getSegment<\/code>), with no live tail. Same archive, same filters, no WebSocket.<\/p>\n<p>This unlocks much more sophisticated server-side slicing without ever backfilling locally: you can spin up an <a href=\"https:\/\/atproto.com\/guides\/the-at-stack\" target=\"_blank\" rel=\"noopener noreferrer\">App<\/a>, run an analysis over a month of posts, or recover from downtime, all through the same JSON shape as the live tail.<\/p>\n<p>Serving these archives is bandwidth-intensive. To ensure the service remains reliable and cheap to run, we\u2019re now requiring an <a href=\"https:\/\/bsky.network\/account\" target=\"_blank\" rel=\"noopener noreferrer\">API token just for these requests<\/a>. The live tail remains open and unauthenticated, it\u2019s only when you request an archive that we require a token. We have no plans to introduce an auth requirement for the live stream.<\/p>\n<p>The v2 instances are live now at <code>wss:\/\/jetstream.us-west.bsky.network<\/code> and <code>wss:\/\/jetstream.us-east.bsky.network<\/code>. The existing v1 instances will keep running unchanged for a while, and the live tail behaves identically on both, so there\u2019s no rush to move. Read the full flow in the <a href=\"https:\/\/bsky.network\/docs\/jetstream-replay\" target=\"_blank\" rel=\"noopener noreferrer\">Network Replay docs<\/a>.<\/p>\n<p>And! As always, this infrastructure is open source and self-hostable. See <a href=\"https:\/\/bsky.network\/docs\/jetstream-self-host\" target=\"_blank\" rel=\"noopener noreferrer\">Running your own Jetstream<\/a> for details.<\/p>\n<p>Jetstream is plain JSON, so you never <em>need<\/em> an SDK. But there\u2019s some common glue: reconnecting, deduping, cursor management, decoding events into typed records. Hence, the new <strong>Jetstream SDKs<\/strong>: TypeScript and Go clients where you construct a <code>Jetstream<\/code> object, pass a filter, and <code>for await<\/code> over decoded, typed events:<\/p>\n<div class=\"my-6 overflow-hidden rounded-2xl bg-slate-50 dark:bg-slate-900 dark:ring-1 dark:ring-white\/10 max-md:max-w-[var(--code-container-width)]\">\n<div class=\"not-prose\">\n<div class=\"group dark:bg-white\/2.5\">\n<div class=\"relative\">\n<pre class=\"overflow-x-auto p-4 text-xs font-medium text-black dark:text-white\"><code class=\"language-ts\"><span><span style=\"color: var(--shiki-token-keyword)\">import<\/span><span style=\"color: var(--shiki-color-text)\"> { Jetstream } <\/span><span style=\"color: var(--shiki-token-keyword)\">from<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-string-expression)\">'@bsky\/jetstream'<\/span><\/span>\n<span><span style=\"color: var(--shiki-token-keyword)\">import<\/span><span style=\"color: var(--shiki-color-text)\"> { app } <\/span><span style=\"color: var(--shiki-token-keyword)\">from<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-string-expression)\">'@bsky\/sdk\/lexicons'<\/span><\/span>\n<span\/>\n<span><span style=\"color: var(--shiki-token-keyword)\">const<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-constant)\">js<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-keyword)\">=<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-keyword)\">new<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-function)\">Jetstream<\/span><span style=\"color: var(--shiki-color-text)\">(<\/span><span style=\"color: var(--shiki-token-string-expression)\">'https:\/\/jetstream.us-east.bsky.network'<\/span><span style=\"color: var(--shiki-color-text)\">)<\/span><\/span>\n<span\/>\n<span><span style=\"color: var(--shiki-token-keyword)\">for<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-keyword)\">await<\/span><span style=\"color: var(--shiki-color-text)\"> (<\/span><span style=\"color: var(--shiki-token-keyword)\">const<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-constant)\">evt<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-keyword)\">of<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-constant)\">js<\/span><span style=\"color: var(--shiki-token-function)\">.live<\/span><span style=\"color: var(--shiki-color-text)\">({ collections<\/span><span style=\"color: var(--shiki-token-keyword)\">:<\/span><span style=\"color: var(--shiki-color-text)\"> [<\/span><span style=\"color: var(--shiki-token-constant)\">app<\/span><span style=\"color: var(--shiki-color-text)\">.<\/span><span style=\"color: var(--shiki-token-constant)\">bsky<\/span><span style=\"color: var(--shiki-color-text)\">.<\/span><span style=\"color: var(--shiki-token-constant)\">feed<\/span><span style=\"color: var(--shiki-color-text)\">.post] })) {<\/span><\/span>\n<span><span style=\"color: var(--shiki-color-text)\">  <\/span><span style=\"color: var(--shiki-token-keyword)\">if<\/span><span style=\"color: var(--shiki-color-text)\"> (<\/span><span style=\"color: var(--shiki-token-constant)\">evt<\/span><span style=\"color: var(--shiki-color-text)\">.kind <\/span><span style=\"color: var(--shiki-token-keyword)\">===<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-string-expression)\">'commit'<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-keyword)\">&amp;&amp;<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-constant)\">evt<\/span><span style=\"color: var(--shiki-color-text)\">.<\/span><span style=\"color: var(--shiki-token-constant)\">commit<\/span><span style=\"color: var(--shiki-color-text)\">.operation <\/span><span style=\"color: var(--shiki-token-keyword)\">===<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-string-expression)\">'create'<\/span><span style=\"color: var(--shiki-color-text)\">) {<\/span><\/span>\n<span><span style=\"color: var(--shiki-color-text)\">    <\/span><span style=\"color: var(--shiki-token-constant)\">console<\/span><span style=\"color: var(--shiki-token-function)\">.log<\/span><span style=\"color: var(--shiki-color-text)\">(<\/span><span style=\"color: var(--shiki-token-constant)\">evt<\/span><span style=\"color: var(--shiki-color-text)\">.<\/span><span style=\"color: var(--shiki-token-constant)\">commit<\/span><span style=\"color: var(--shiki-color-text)\">.collection<\/span><span style=\"color: var(--shiki-token-punctuation)\">,<\/span><span style=\"color: var(--shiki-color-text)\"> <\/span><span style=\"color: var(--shiki-token-constant)\">evt<\/span><span style=\"color: var(--shiki-color-text)\">.<\/span><span style=\"color: var(--shiki-token-constant)\">commit<\/span><span style=\"color: var(--shiki-color-text)\">.<\/span><span style=\"color: var(--shiki-token-constant)\">record<\/span><span style=\"color: var(--shiki-color-text)\">.text)<\/span><\/span>\n<span><span style=\"color: var(--shiki-color-text)\">  }<\/span><\/span>\n<span><span style=\"color: var(--shiki-color-text)\">}<\/span><\/span>\n<span\/><\/code><\/pre>\n<p><button type=\"button\" class=\"group\/button absolute right-4 top-3.5 overflow-hidden rounded-full py-1 pl-2 pr-3 text-2xs font-medium opacity-0 backdrop-blur transition focus:opacity-100 group-hover:opacity-100 bg-white\/5 hover:bg-white\/7.5 dark:bg-white\/2.5 dark:hover:bg-white\/5\"><span aria-hidden=\"false\" class=\"pointer-events-none flex items-center gap-0.5 text-slate-400 transition duration-300\"><svg viewbox=\"0 0 20 20\" aria-hidden=\"true\" class=\"h-5 w-5 fill-slate-500\/20 stroke-slate-500 transition-colors group-hover\/button:stroke-slate-400\"><path stroke-width=\"0\" d=\"M5.5 13.5v-5a2 2 0 0 1 2-2l.447-.894A2 2 0 0 1 9.737 4.5h.527a2 2 0 0 1 1.789 1.106l.447.894a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-5a2 2 0 0 1-2-2Z\"\/><path fill=\"none\" stroke-linejoin=\"round\" d=\"M12.5 6.5a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-5a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2m5 0-.447-.894a2 2 0 0 0-1.79-1.106h-.527a2 2 0 0 0-1.789 1.106L7.5 6.5m5 0-1 1h-3l-1-1\"\/><\/svg>Copy<\/span><span aria-hidden=\"true\" class=\"pointer-events-none absolute inset-0 flex items-center justify-center text-blue-400 transition duration-300 translate-y-1.5 opacity-0\">Copied!<\/span><\/button><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>The TypeScript SDK is available from npm, including <a href=\"https:\/\/npmx.dev\/package\/@bsky\/jetstream\" target=\"_blank\" rel=\"noopener noreferrer\">npmx<\/a>.<\/p>\n<p>The Go SDK is available as part of the <a href=\"https:\/\/github.com\/bluesky-social\/jetstream\" target=\"_blank\" rel=\"noopener noreferrer\">Jetstream project<\/a>.<\/p>\n<p>The <a href=\"https:\/\/bsky.network\/docs\/jetstream-sdk\" target=\"_blank\" rel=\"noopener noreferrer\">Jetstream SDK docs<\/a> go into more detail.<\/p>\n<p>Back in May we <a href=\"https:\/\/atproto.com\/blog\/ts-sdk-upgrades\" target=\"_blank\" rel=\"noopener noreferrer\">promoted the <code>lex<\/code> SDK to stable preview<\/a> and promised that the standalone Bluesky docs would follow. That\u2019s now done: the <a href=\"https:\/\/npmx.dev\/package\/@bsky\/sdk\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Bluesky TypeScript SDK<\/strong><\/a> is rebuilt on top of <a href=\"https:\/\/www.npmjs.com\/package\/@atproto\/lex\" target=\"_blank\" rel=\"noopener noreferrer\"><code>@atproto\/lex<\/code><\/a>, which means we\u2019re no longer maintaining legacy code paths for Bluesky-specific helpers. This is the lexicon toolchain, fully typed end to end, from the protocol layer up through <code>app.bsky<\/code> records.<\/p>\n<p>Every TypeScript example on this new site is written against it, marking a huge move away from legacy technical debt\u2014this is good code hygiene for us, and should eliminate LLM recommendations for deprecated SDKs. If you\u2019re still using <code>@atproto\/api<\/code> code, it continues to work as before, and the <a href=\"https:\/\/bsky.network\/docs\/bluesky-api\" target=\"_blank\" rel=\"noopener noreferrer\">Bluesky API guides<\/a> serve as a migration reference.<\/p>\n<p>Finally, the <a href=\"https:\/\/endpoints.bsky.app\" target=\"_blank\" rel=\"noopener noreferrer\">HTTP reference<\/a> has been updated. Spinning those docs <em>out of<\/em> <a href=\"https:\/\/docs.bsky.app\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/docs.bsky.app<\/a> was actually step 1 of this overhaul; we\u2019re now landing the remainder.<\/p>\n<p>The new <code>network.bsky.jetstream.*<\/code> methods that power Replay \u2014 <code>planBackfill<\/code>, <code>listSegments<\/code>, <code>getSegment<\/code>, and <code>getBlock<\/code> \u2014 are now browsable with full request and response schemas, and the reference now documents Jetstream\u2019s WebSocket endpoints too, so the entire Jetstream v2 surface lives in one place.<\/p>\n<p>Everything above is live today: the <a href=\"https:\/\/bsky.network\" target=\"_blank\" rel=\"noopener noreferrer\">new site<\/a>, the v2 Jetstream instances, the SDK preview, and the updated HTTP reference. If you\u2019re new to the network, start with <a href=\"https:\/\/bsky.network\/docs\/how-it-works\" target=\"_blank\" rel=\"noopener noreferrer\">How It Works<\/a>, a visual walkthrough of how records, lexicons, and the firehose fit together. If you\u2019re building against the Bluesky app\u2019s data model, the <a href=\"https:\/\/bsky.network\/docs\/bluesky-api\" target=\"_blank\" rel=\"noopener noreferrer\">Bluesky API guides<\/a> are all still there, freshly rewritten (more on that below)<\/p>\n<p>If you build something on Replay in the next few weeks, we\u2019d love to hear about it; the fastest way to shape where the SDK\u2019s orchestration goes is to show us what you\u2019re folding the stream into.<\/p>\n<\/div>\n<p><a href=\"https:\/\/atproto.com\/blog\/introducing-bluesky-protocol-services?utm_source=tldrnewsletter\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today we\u2019re launching Bluesky Protocol Services: a new brand, and a new website, for the public infrastructure Bluesky operates on the AT Protocol network. Bluesky has always run more than the Bluesky app. We operate Jetstream instances, relays, and the Bluesky API endpoints built on atproto. But if you were a developer trying to build [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":23267,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[],"class_list":["post-23266","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/comments?post=23266"}],"version-history":[{"count":0,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23266\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media\/23267"}],"wp:attachment":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media?parent=23266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/categories?post=23266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/tags?post=23266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}