Image Missing or Broken on Bluesky

Why your link card appears without an image or shows a black thumbnail

Likely causes

  1. Image exceeds 1 MB: the AT Protocol’s hard 1,000,000 byte blob limit means the client has to compress your og:image to fit. If it can’t, the card may render without an image.
  2. Content-Disposition: attachment header: CardyB may not treat the response as a displayable image if your server sends this header. Change it to inline or remove it.
  3. WebP compatibility: CardyB accepts WebP, but some Bluesky clients produce black or blank thumbnails after the blob conversion step.
  4. Image URL inaccessible: non-200 status, requires auth, or behind a redirect CardyB can’t follow.

Diagnosis

1. Check the file size

curl -sI "https://yoursite.com/og-image.jpg" | grep -i content-length

Over 1,000,000 bytes? You need to compress. JPEG at 1200x630 and quality 80-85% should fit easily.

2. Check Content-Disposition

curl -sI "https://yoursite.com/og-image.jpg" | grep -i content-disposition

If it says attachment, the server is signaling a download rather than display. Remove the header or set it to inline.

3. Check the format

JPEG and PNG are safe. WebP works but has caused display bugs in some clients. AVIF is not supported.

<meta property="og:image" content="https://example.com/image.jpg">

4. Test accessibility

Verify CardyB can actually reach the image:

curl -A "Mozilla/5.0 (compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app)" \
     -sI "https://yoursite.com/og-image.jpg"

You want a 200 OK with an image Content-Type.

Fixing oversized images

  • Compress JPEG quality to 80-85%, which is indistinguishable from 100% at card sizes
  • Resize to 1200x630, since larger dimensions waste bytes with no visual benefit
  • Use JPEG over PNG for photographic content
  • Strip EXIF data, as camera metadata can add surprising bulk

Black or blank thumbnails

Reported with WebP images that fail during blob conversion, incorrect Content-Type headers, and very large images that time out mid-download.

Switch to a JPEG under 500 KB and re-post.