Likely causes
- Image exceeds 1 MB: the AT Protocol’s hard
1,000,000byte blob limit means the client has to compress yourog:imageto fit. If it can’t, the card may render without an image. Content-Disposition: attachmentheader: CardyB may not treat the response as a displayable image if your server sends this header. Change it toinlineor remove it.- WebP compatibility: CardyB accepts WebP, but some Bluesky clients produce black or blank thumbnails after the blob conversion step.
- 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-lengthOver 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-dispositionIf 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.