Yes, twice. Does Bluesky compress images? On 2026-07-18 I uploaded a 4.13 MB iPhone photo, 4032x3024 pixels, to Bluesky. The file it served back was a 1.56 MB WebP at 4000x3000, 62.3 percent smaller and in a format I never gave it. One compression pass happens on your device before upload, and a second happens on Bluesky's image CDN.
| Test, 2026-07-18 | Input | Delivered | Verdict |
|---|---|---|---|
| iPhone photo, Bluesky post | 4.13 MB JPEG, 4032x3024 | 1.56 MB WebP, 4000x3000 | 62.3% smaller, format swapped |
Scope first, because honest numbers need it. That result is what Bluesky did to one reference file, on one day, through one upload path, captured from the copy Bluesky serves to viewers. A different surface, an avatar, a link card, a third party client, can behave differently. This page keeps measured results and documented behavior clearly labeled as what they are.
Does Bluesky Compress Images? The Measured Verdict
Yes, every post image, with no setting to prevent it. Bluesky is also the only platform in this test series that handed my photo back in a different file format than the one I uploaded.
The reference file and the Bluesky test
REF-A is the same real iPhone photo every platform in this project gets: 4,332,705 bytes, 4032x3024 pixels, a JPEG carrying the full EXIF block a phone camera writes. Identical input is the point. When every app meets the same file, the differences between platforms are real, and the full scoreboard lives on the hub page collecting every measured app test. On 2026-07-18 I posted REF-A to Bluesky and captured the file Bluesky served back.
What Bluesky served back: a 1.56 MB WebP
Three separate things happened to the file. The bytes dropped 62.3 percent, from 4.13 MB to 1.56 MB. The dimensions shrank from 4032x3024 to 4000x3000, which sounds dramatic and is not: that is 12.19 million pixels trimmed to 12.00 million, a 1.6 percent cut made to duck under Bluesky's 4000 pixel cap. And the format changed outright, JPEG in, WebP out.
The format swap settles a question the Bluesky community had left hanging. Reports in spring 2026 suggested Bluesky's CDN had started serving WebP instead of JPEG, but nobody published a verified number. My capture path returned a WebP file, so on the surface I tested, WebP delivery is real. WebP typically beats JPEG by 25 to 35 percent at the same visual quality, which is a big part of how Bluesky sheds bytes while barely touching pixels; our WebP explainer covers the format in full.
What one measurement can and cannot prove
It proves the pipeline rewrote bytes, pixels, and format end to end on the path I ran. It cannot split the 62.3 percent between the two stages, because I captured the served file, not the intermediate upload. I also did not run our transparent PNG reference file through Bluesky, so this page makes no measured claim about PNG uploads. Where a claim rests on documentation instead of my test, I say so.
Why Does Bluesky Compress Photos Twice?
Because two different systems touch the file: the app on your device compresses before upload, and Bluesky's image CDN re-encodes again when serving. Bluesky's client is open source, so none of this is speculation. It is readable code.
Stage one: the app compresses photos before upload
The official app converts every post image to JPEG and steps the quality down, attempt by attempt, until the file fits under the size cap. A proposal on the app's own repository documents the loop: start at quality 100, drop 10 points, encode, check the size, repeat; if every attempt fails, the app gives up with its Unable to compress image error. The part that surprises people is that the conversion is unconditional. Bluesky's issue tracker confirms that images already inside every limit get recompressed anyway, which is why re-uploading a saved Bluesky image degrades it a little more each time.
The compressed file then goes to your Personal Data Server, the piece of AT Protocol infrastructure that stores your account's data. The PDS enforces the byte cap and rejects files over it, which is exactly why the client compresses first. Bluesky's developer guide to posts shows the check in code: 2,000,000 bytes, no exceptions.
Stage two: the CDN re-encodes what viewers see
Nobody scrolling a feed loads your stored file. They load a copy processed by cdn.bsky.app, which runs the image through the Sharp encoding library a second time, with its own quality settings, its own chroma subsampling, and metadata stripping switched on. Those parameters sit in the same issue tracker discussion cited above. Two lossy passes stack, and detail removed by the first pass never comes back for the second one to preserve; lossy versus lossless compression explains that one way street.
Why Bluesky compresses at all
Bandwidth and storage. Every image on Bluesky has to be stored by a Personal Data Server and moved through the network's relays, and the service is free with a small team behind it. A maintainer also pointed out that re-encoding strips metadata as a side effect, which Bluesky treats as a privacy feature rather than a bug. The tradeoff is real: cheaper infrastructure and safer defaults, paid for in image fidelity.
What Are Bluesky's Image Limits Right Now?
Two megabytes per image and 4000 pixels on the long edge, as of app version 1.121, released in April 2026, with up to four images per post. If a guide tells you 1 MB and 2000 pixels, it predates the change.
The current Bluesky image limits
| Limit | Before April 2026 | Now (v1.121 and later) |
|---|---|---|
| Max file size per post image | 1 MB | 2 MB |
| Max resolution, long edge | 2000 px | 4000 px |
| Images per post | 4 | 4 |
Bluesky announced the increase on its own account: the max file size doubled to 2 MB and the resolution cap rose to 4000x4000. My measured result matches the new numbers on both axes. The upload was resized to exactly 4000 pixels on the long edge, and the delivered file landed at 1.56 MB, under the cap.
Why the stated limits online disagree
Search for the Bluesky image size limit and you will find 900 KB, 976.56 KB, 1 MB, and 2 MB, sometimes on pages updated the same month. The spread has a boring explanation: the cap changed in April 2026 and most size guide sites have not caught up. Date stamp any Bluesky spec you rely on, including this one, tested 2026-07-18.
The limits also mean the cap is not something you should hit. A photo over 2 MB does not get rejected, it gets fed to the stepped quality loop, and the loop decides what your photo loses. Better to compress the photo below the 2 MB cap before you post, where you can watch the output size and judge the quality yourself instead of letting a retry loop judge it for you.
What Does Bluesky Do to Your File Format?
The official app converts everything to JPEG before upload, and the CDN decides what viewers actually receive, which was WebP on the surface I measured. Your format choice mostly does not survive contact with the pipeline.
How each format survives a Bluesky upload
| You upload | What the official app does |
|---|---|
| JPEG | Re-encoded as JPEG again, another lossy pass |
| PNG | Converted to JPEG, transparency flattened |
| WebP | Converted to JPEG, with reported artifact bugs |
| Animated GIF | Converted to video |
| AVIF | Not supported |
Two of those rows deserve emphasis. PNG conversion means a transparent sticker or cutout arrives flattened onto a background, lossless becomes lossy, and there is no toggle to prevent it. And WebP input has a history of conversion bugs, with users reporting stripe artifacts, so handing the app a WebP is currently the worst of both worlds: you get the JPEG conversion and the bug surface. Developers uploading through the raw AT Protocol API can store any supported format on the PDS as sent, but the CDN still re-encodes what viewers see, so the API route changes storage, not delivery.
The quality cost of double conversion
Each re-encode rounds away detail the previous encode already approximated, so artifacts compound quietly. On a 12 megapixel photo viewed in a feed you will rarely notice. On text, line art, and flat color graphics you will, because hard edges are exactly what lossy encoders approximate worst. Whether any of this matters for your use is the question our guide to compression and quality loss answers with side by side evidence.
Does Bluesky Strip EXIF Data From Photos?
Yes, by design, at both stages. Bluesky strips metadata during upload as a privacy measure, and the CDN's encoder is configured with metadata disabled, so nothing survives to the served copy.
What gets stripped and why
EXIF data, the hidden metadata block your camera writes into the file, includes GPS coordinates, camera model, timestamp, lens settings, and any copyright fields you embedded. Bluesky's engineering discussions show location EXIF scanning was designed in from the platform's earliest days, and the developer guide cited earlier tells API clients to strip EXIF before upload. For most people this is a feature: posting a photo should not broadcast where you live. For photographers who embed copyright and licensing, it is a silent cost with no opt out.
One honesty note: the measured store for this test recorded bytes, dimensions, and format, not metadata, so my EXIF statements here rest on Bluesky's documentation and code rather than on my own measurement for this specific platform.
The one way to reach an original file
The AT Protocol includes a public endpoint, com.atproto.sync.getBlob, that returns a stored blob exactly as uploaded, meaning after the client's compression pass but before the CDN's second pass. That is the closest thing to an original Bluesky keeps. The popular trick of editing a CDN image URL from @jpeg to @png does not do this. It changes the container format of the CDN's output, not the pixels inside it.
Do Avatars, Banners, and Link Cards Follow the Same Rules?
No. Post images get the full pipeline described above, while profile media and link previews have their own specs, and the differences matter if you are wondering why your avatar looks soft.
Bluesky avatar, banner, and link card specs
| Surface | Recommended size | Accepted formats |
|---|---|---|
| Post image | Up to 4000 px long edge, 2 MB | JPEG, PNG, GIF, WebP |
| Avatar | 1000x1000 px, shown as a circle | JPEG, PNG |
| Banner | 3000x1000 px, 3:1 ratio | JPEG, PNG |
| Link card | 1200x630 px JPEG from the page's og:image | JPEG, PNG |
These specs come from Bluesky's profile lexicon and its link embed behavior. A link card is built from the shared page's og:image, uploaded as a blob under the same byte limits, and WebP og images have caused broken or striped cards, so pages that want clean Bluesky previews should serve a JPEG og:image. Avatars are displayed small and cropped to a circle, so a sharp 1000x1000 upload survives best. Because avatars and banners accept only JPEG and PNG, a WebP profile image gets refused or converted before it ever reaches the pipeline.
Can You Stop Bluesky From Compressing Your Photos?
No. There is no original quality setting anywhere in the official app, so the only control you have is what the file looks like before it goes in. Used well, that control is worth a lot.
Prepare photos before you post: four steps
- Resize to 4000 pixels or less on the long edge yourself, with a proper downscaler, so Bluesky's resizer has nothing to do. Our guide to reducing image resolution covers the tools on every OS.
- Export as JPEG at quality 80 to 85. Quality 80 is the setting we treat as visually lossless for photographs, and it usually takes a phone photo 60 to 80 percent down with no visible difference at normal viewing size.
- Check the result sits well under 2 MB. A pre-shrunk file skips the stepped quality loop entirely, because the first encode attempt already fits.
- Post it. The app still runs its unconditional re-encode, but an already compact, already resized file gives the pass almost nothing to remove, and the visible damage drops accordingly.
Photos versus text and pixel art
Photographs absorb compression well because noise and organic texture hide artifacts. Screenshots, text, line art, and pixel art do not, and they take the double conversion hardest. Small pixel art has a second problem: the viewer enlarges it to fill the screen with soft interpolation, which blurs hard edges. Upscale tiny art yourself with hard edged nearest neighbor scaling before posting, and keep graphics inside the dimension caps so nothing gets resampled.
How Does Bluesky Compare to Other Platforms?
People asking does bluesky compress images usually mean compared to the alternatives, and the only fair comparison uses the same photo everywhere. Bluesky lands in the moderate middle: far gentler than LinkedIn or Facebook, heavier than Instagram, and unique in swapping the delivery format.
The same photo across four platforms
| Platform, same photo | Delivered file | Change | Dimensions |
|---|---|---|---|
| Bluesky | 1.56 MB WebP | 62.3% smaller | 4000x3000 |
| 3.91 MB JPEG | 5.4% smaller | 4032x3024 | |
| 579.7 KB JPEG | 86.3% smaller | 2048x1536 | |
| 22.0 KB JPEG | 99.5% smaller | 480x360 |
Where Bluesky sits on the spectrum
The table understates one thing in Bluesky's favor: pixels. Bluesky kept 98.4 percent of my photo's pixels, Facebook kept 25.8 percent, LinkedIn kept 1.4 percent. X, measured the same day, stores a full resolution copy just 8.5 percent smaller but serves timelines a 2048 pixel copy roughly 81 percent smaller, and Pinterest re-encodes its stored original 58.9 percent smaller while keeping every pixel. The Reddit threads complaining about Bluesky image quality largely predate the April 2026 limit increase; the two pass pipeline is still there, but it now has twice the byte budget and four times the pixel budget it had before.