Back to Blog
Social Media Marketing

Why Your Bluesky Link Preview Can't Be Fixed After You Post

· 7 min read

Bluesky doesn't cache link previews. It copies the card into your post when you publish, and nothing ever reads your page again. Here's how that snapshot gets made, why it fails, and the one part of the link you can still change.

You post a link on Bluesky and the card underneath it is wrong. Maybe it shows the headline you rewrote an hour after publishing. Maybe it shows the site's default logo where the article image should be. You fix the tags on the page, reload the post, and nothing changes. You wait a day. Still nothing.

On Facebook or LinkedIn, waiting would eventually pay off. On Bluesky it never will, because the card isn't a cached copy of your page. It's part of the post.

How Does Bluesky Generate a Link Card?

Most platforms fetch a shared link on their own servers, store what they find, and render the card from that store whenever the post is displayed. Bluesky splits the job differently. When you paste a link into the official app, the composer asks a Bluesky service called CardyB to fetch the page. CardyB reads the Open Graph tags and hands back a title, a description, and an image URL. Its user agent contains the string Bluesky Cardyb/1.1, which is what to search for in your server logs.

Then the app does something no other major platform does. It downloads that image itself, shrinks it to fit within 2,000 pixels and under one megabyte, and uploads the result to Bluesky as a blob attached to your account. When you publish, everything gets written into the post record as an app.bsky.embed.external object with four fields: uri, title, description, and thumb.

That record is the card. Every time someone scrolls past your post, their app renders those four fields exactly as they were written. Nobody goes back to your page to check them.

Why Changing Your og:image Does Nothing

The thumb field isn't a link to your image. It points at the copy the composer uploaded, and the original og:image URL isn't stored anywhere in the post. You can overwrite the file on your server, delete it, or point og:image somewhere new, and the card keeps showing the copy it made when you posted.

The text works the same way. Title and description are plain strings sitting in the record. The only part of the card that still depends on the outside world is the uri, and that decides where a click goes, not what the card says.

Is There Any Way to Refresh a Bluesky Link Preview?

No. There's no debugger, no purge tool, and no query-string trick, because all of those act on a cache and there isn't one here. Adding ?v=2 to the URL only changes what a new post would capture. When we went through which platforms let you force a refresh, every answer was about clearing a stored copy. On Bluesky the stored copy belongs to the post.

This is also where og:url stops mattering. Facebook and LinkedIn use it to decide which cached object a share belongs to, so two URLs with the same og:url share one card. Bluesky has no shared object to file anything under. Every post carries its own card, frozen separately.

Editing the post isn't an option either. Bluesky still has no native edit button, and in May 2026 its head of product said the team had only started discussing one. That leaves delete and repost, and deleting a post takes its likes, reposts, and replies with it. Once a post has picked up traction, the wrong card is usually the cheaper mistake to live with.

The closest parallel is WhatsApp, where the phone builds the card and attaches it to the message. Bluesky does the fetch on its own servers instead of the sender's device, but the result is just as permanent.

Why Isn't My Link Card Showing Up on Bluesky?

Because the fetch happens once, at compose time, whatever goes wrong in that moment is permanent too. The most common cause is bot protection. A firewall rule or a CDN challenge serves CardyB an error page instead of your HTML, and the composer shows no card at all. GM ran into exactly this with Akamai and reported it in a GitHub issue that is still open, noting that allowing the user agent alone didn't fix it.

Speed is the other one. In the app's current source, the composer waits up to 15 seconds for CardyB's answer and another 15 for the image download. A slow origin behind a couple of redirects can burn through that before your page responds.

What you mostly won't see is a card dropped for a heavy image. WhatsApp throws away anything over 600KB. Bluesky's composer resizes large images before uploading them, so a 3MB hero image still makes it into the card, just compressed.

Who Actually Writes the Card?

The poster does. The official app fills the card from CardyB, but the protocol never checks it against the page. Any other client or script can publish a post with whatever title, description, and thumbnail it likes, and the domain shown under the card comes from the uri field, which the poster also sets. Ben Tasker wrote up the misinformation risk in 2023, and the record format still accepts free text in every field.

For anyone sharing links honestly, that has a practical upside. The card isn't bound to what the destination page says, so scheduling tools and custom clients can set it at posting time. None of them can change it afterward.

How to Get the Card Right Before You Post

Bluesky gives you one advantage the others don't: the composer shows you the exact card before you publish. That preview is the snapshot. If it's wrong there, remove the card, fix the page, and paste the link again. Bluesky doesn't document whether CardyB keeps recent results, so if a fix doesn't appear on the first retry, give it a few minutes before concluding the fix didn't work. If the page is yours, check these before you get that far:

  • og:title, og:description, and og:image are present in the HTML your server returns, inside <head>.
  • og:image is an absolute https URL that loads without a login, cookie wall, or bot challenge.
  • Your firewall and CDN let through requests whose user agent contains Bluesky Cardyb.
  • The page and its image each respond well inside 15 seconds on a cold cache.

Prelinq's Open Graph checker fetches a URL live and renders the Bluesky card alongside X, LinkedIn, Facebook, Discord, and Reddit, so you can see what the composer is about to freeze without posting a test.

Most links people post aren't theirs to fix, though. A news story, a product page, an affiliate offer, a partner's launch announcement. If the tags on that page are wrong, the card Bluesky freezes will be wrong, and there's no lever to pull on someone else's site.

Prelinq puts the tags on a page you control. You choose the title, description, and image, share the Prelinq link, and CardyB reads your card instead of the destination's. Whoever clicks gets forwarded to the original URL.

Be clear about what that does on Bluesky. Everywhere else, our strongest argument is editing a card after you've shared it. On Bluesky that doesn't reach the card, because the title, description, and image are copied into the post and stay put. What stays live is the destination. The card's uri is your Prelinq link rather than the final page, so on Pro and Business you can change where it forwards after posting, which helps when a sale page expires or a launch URL moves. The card will show prelinq.com as its domain instead of the destination's. Free links also expire after seven days, which matters more on a platform where the post never goes away. Two active links are free, enough to build a card, see it rendered the way Bluesky will render it, and get the snapshot right the first time.

Try it free

Ready to take control of your link previews?

Create your first custom preview in under two minutes — no sign-up required to get started.

Try Prelinq free →

Keep reading