How to download images from a Bluesky post in full size

This guide is for people who want their own Bluesky images back, for an archive or to post them somewhere else, and for anyone saving an image they have permission to use. A post shows each image as a WebP about 1000 px wide. Bluesky keeps the full-size image as well, and its address differs from the small one by a single word.

What Bluesky serves

An image in a post has an address like https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:z72i7hdynmk6r22z27h6tvur/bafkreih3mb3cwnbc5kv5b2qyy24q6banms25i5ut3cbty4ej2x7vjvd6y4. The part starting with did:plc: names the account, and the part starting with bafkrei names the image. The post page loads the feed_thumbnail address. Bluesky's public API lists a second address for every image, the same one with feed_fullsize in place of feed_thumbnail.

I fetched two images from two public posts by the @bsky.app account and read their real pixel size from the files:

Uploaded fileOn the post page (feed_thumbnail)feed_fullsizefeed_fullsize + @jpegUploaded file itself
JPEG, 4000×19161000×479 px, WebP, 28 KB4000×1916 px, WebP, 160 KB4000×1916 px, JPEG, 395 KB4000×1916 px, JPEG, 1.8 MB
JPEG, 4000×30001000×750 px, WebP, 159 KB4000×3000 px, WebP, 1.3 MB4000×3000 px, JPEG, 2.0 MB4000×3000 px, JPEG, 2.0 MB

The feed_fullsize copy has every pixel of the upload, but it comes as a WebP, which some apps still won't open. Adding @jpeg to the end of that address gets a JPEG of the same size, and @png a PNG (17.6 MB for the 4000×3000 image). Only the uploaded file is byte for byte what the poster uploaded.

Method 1: Edit the address (no install)

  1. Right-click an image in the post and choose "Open image in new tab".
  2. In the address bar, change feed_thumbnail to feed_fullsize and press Enter. You now have the full pixel size as a WebP.
  3. For a JPEG, add @jpeg to the very end of the address, press Enter, and save the image.
  4. For the exact uploaded file, copy the did:plc:… part and the bafkrei… part and open https://bsky.social/xrpc/com.atproto.sync.getBlob?did=did&cid=bafkrei part. For accounts hosted by Bluesky, bsky.social forwards you to the server that stores the file.

Method 2: Every image on the page as one ZIP

  1. Add PixLasso to Chrome or Edge and open the post or a profile's Media tab.
  2. Click the PixLasso icon, then Deep scan so it scrolls the page and picks up the images that load late.
  3. Set Min size to 300px to skip avatars and link previews.
  4. Click Download. You get one ZIP, numbered in the order the images appear (converting a whole batch to JPG is a Pro feature).

PixLasso has no Bluesky rule yet, so it saves the address the page loads: the feed_thumbnail copy, 1000 px wide WebP files in my test, not the 4000 px uploads. That is fine for a quick record of a thread or a profile. When you need full size, use Method 1 for the images that matter.

The free version saves 30 images per batch, and each press after that saves the next batch. Pro, a single US$9.99 payment, saves all of them in one press.

Copyright

Images you posted are yours to download; images in someone else's post belong to that person or to whoever they licensed them from, so ask before you reuse them.


Measured on 9 November 2026: I read two public posts through Bluesky's public API and the post page's HTML, downloaded each size and read the pixel size from the image header, then ran PixLasso's URL code on the same addresses. I made PixLasso; the first method needs no extension.