Last updated: 2026-05-26 · Bluesky · By SocialKit Team
Link-preview cards on Bluesky and Mastodon look simple but break for different reasons on each platform. This guide explains why — AT Protocol embed records on Bluesky, server-side OpenGraph fetching on Mastodon — and shows how to schedule posts that include a working card every time.
Before you start
You need a Bluesky account (any handle) and/or a Mastodon account on any instance. To schedule link posts ahead of time, you also need a SocialKit account — the 7-day free trial (€0.00 due today) covers both platforms.
On the page-owner side: the URL you are linking to must have correct OpenGraph meta tags (`og:title`, `og:description`, `og:image`) for a card to appear on either network. If you own the target page, check those tags first. If you are linking to a third-party URL, you can influence only your post — not whether their page has OG tags — so set expectations accordingly.
On Bluesky, a link-preview card is not just a rendered URL — it is an explicit `app.bsky.embed.external` record attached to your post at the time of creation. As of June 2026, when you paste a URL into the Bluesky web app or a compliant third-party composer, the client fetches the page's OpenGraph tags and packages the title, description, and thumbnail into that embed record. The AT Protocol then stores it alongside the post text. If the embed record is absent, no card appears — even if the URL is in the post text.
Tip: A bare URL typed into a post body without the embed record will appear as plain text on most Bluesky clients, not as a card. Always confirm the card preview renders in the composer before posting.
Paste the URL into a browser and view source (Ctrl/Cmd + U), then search for `og:title`, `og:description`, and `og:image`. All three should be present. If `og:image` is missing, some clients will generate a text-only card; if the image dimensions are too small (Bluesky expects at least 800 px wide as of June 2026), the thumbnail may be blank or cropped badly. For your own pages, fix the tags in the CMS or `<head>` and verify with a free OG-tag validator before distributing the link.
Tip: Bluesky card images display at a 1.91:1 ratio (roughly 1200 × 628 px), the same as the standard OG image spec. A square og:image will be letterboxed rather than cropped on most clients — use a 1200 × 628 px image for the cleanest result.
Open SocialKit's composer and select your connected Bluesky account as a destination. Paste your URL into the post body. As of June 2026, SocialKit fetches the page's OpenGraph data and renders a live preview of the card in the composer so you can confirm title, description, and thumbnail before scheduling. If the card is blank or shows placeholder text, the issue is most likely the target page's OG tags — fix those first (see Step 2), then refresh the composer.
Tip: If you are linking to a page that has recently changed its OG tags, some CDN or preview caches take minutes to hours to refresh. Adding a cache-busting query parameter (e.g. `?v=2`) forces a fresh fetch in most composers but changes the canonical URL — use only on pages you own and where the URL change is acceptable.
Mastodon link cards work differently from Bluesky. When your home instance receives a post containing a URL, its server asynchronously fetches the target page and parses its OpenGraph tags — usually within a few seconds but sometimes up to a minute on busy or rate-limited instances. The card appears after that server-side fetch completes. As of June 2026, this means: (a) the card may not appear immediately even if OG tags are correct; (b) if the target URL is behind a bot-blocking CAPTCHA or Cloudflare challenge, the instance may be unable to fetch it and the card will never appear; (c) card behavior can vary between Mastodon versions (the current stable line is 4.x).
Tip: Mastodon does not store the card in the post record the way Bluesky does — it is generated on-demand from the URL each time a client loads the post. This means correcting a broken OG tag on the target page will eventually fix the card across all past Mastodon posts linking to it, once the instance refreshes its cache.
In SocialKit's composer, select your connected Mastodon account alongside (or instead of) Bluesky. Write your post text and paste the URL. Use the per-platform customization to tailor the caption if you are posting to both networks at once — Mastodon's default character limit is 500 (some instances raise this; check your instance's limit in your account settings), while Bluesky's limit is 300 graphemes as of June 2026. Set a specific time or use best-time data, then schedule. SocialKit auto-publishes to Mastodon at the scheduled time; no phone interaction is required.
Tip: Mastodon's Content Warning (CW) field is a distinct text box that hides post content behind a click. It is commonly used for spoilers, sensitive topics, or long threads — not for standard link posts. Leave it blank unless your community's norms require it.
If the link in your post points to a page you own, append UTM parameters so Google Analytics 4 (or any analytics platform) separates Bluesky clicks from Mastodon clicks. A minimal set looks like `?utm_source=bluesky&utm_medium=social&utm_campaign=your-campaign`. Use the free SocialKit UTM builder to generate these without typos, then paste the tagged URL into the composer before the preview card is fetched. The card will show the destination page's metadata even though the URL includes parameters.
Tip: Both Bluesky and Mastodon pass URLs unmodified — neither strips UTM parameters the way some platforms do. The card thumbnail and title come from the OG tags of the destination page regardless of the query string, so UTM-tagged URLs produce correct card previews.
Still in the SocialKit composer session, add X (Twitter), Threads, or any of the other nine supported platforms as additional destinations. Each gets its own caption field — keep Bluesky under 300 graphemes, Mastodon under your instance's limit, X (Twitter) under 280 characters (standard accounts, as of June 2026; premium plans differ), and Threads under 500 characters. Link-card behavior differs by platform: X renders a preview card and strips the URL from the character count; Threads and Bluesky show inline cards; Mastodon fetches one asynchronously. Schedule all destinations at once from a single session.
On Bluesky: the most common cause is that the composer did not generate an embed record, either because the OG fetch failed (bot-blocking, slow server, missing tags) or because you pasted the URL after typing other text and the client did not re-trigger a fetch. To fix it, clear the post, paste the URL first, wait for the card preview to appear, then add your caption text around it. If the card still does not appear, the target page's OG tags are missing or returning errors.
On Mastodon: the most common cause is that your instance either has not finished the asynchronous fetch yet, or the target server blocked the instance's request (Cloudflare, CAPTCHA, or IP-level block). There is no workaround for a blocked target URL other than using a redirect or different destination. Waiting 30–60 seconds and refreshing the post usually resolves a slow-fetch situation as of June 2026.
As of June 2026, Bluesky does not support editing post records after publication — this is a deliberate AT Protocol design choice around post immutability and federation integrity. If a post goes out with a broken or missing card, your only option is to delete it and repost with the corrected embed. This makes confirming the card in the SocialKit preview before scheduling more important on Bluesky than on any other platform.
Mastodon does support post editing on instances running version 3.5.0 and later; edited posts show an edit history badge on clients that support it. However, whether editing a Mastodon post refreshes the link-card cache is instance-dependent as of June 2026.
SocialKit's composer fetches OpenGraph data and shows a live card preview before you schedule — so you catch broken previews before they go live. Schedule to Bluesky, Mastodon, and nine other platforms from one calendar. Unlimited scheduled posts on every plan, 7-day free trial, €0.00 due today.
Schedule Bluesky and Mastodon link posts with SocialKitSchedule and cross-post to all 11 networks from one calendar on one flat plan. 7-day free trial — €0.00 due today.
€0.00 due today · cancel anytime · 7-day money-back guarantee
FAQ
The questions people ask before they schedule — answered honestly, hedged where platform behavior changes.
€0.00 due today · cancel anytime · 7-day money-back guarantee