Social Card Preview

See which card tags a published page actually serves, and which one each platform will use.

Secure server processingWeb & SEOWorkingNo account needed

What this tool does

Social Card Preview takes the address of a published page, sends it to the OmniKitly processing service over an encrypted connection, and the service requests that page as an anonymous visitor. Out of the HTML that comes back it reads seven Twitter card tags — twitter:card, twitter:title, twitter:description, twitter:image, twitter:image:alt, twitter:site and twitter:creator — beside five Open Graph ones: og:title, og:description, og:image, og:url and og:site_name. Above that table sit three schematic cards, one each for X, LinkedIn and Slack, filled with the title, description and host the page would hand them.

The two tag namespaces are read by different places, which is why a link can unfurl properly in one app and arrive as a bare URL in the next. Each value is taken from the first tag that exists — twitter:title, then og:title, then the title element — so you see which fallback a platform lands on and not merely which tag is absent. The findings call out a twitter:card value outside summary, summary_large_image, app and player; a player card with no twitter:player; a card title past 70 characters or a description past 200; a twitter:site or twitter:creator that is not a valid @handle; a relative image path, with the absolute form worked out for you; and a page carrying no Open Graph tags at all.

What comes back is a reading of the markup, not a picture of the card. The image is named and never requested, so a URL that returns 404, a file too small for the wide layout, or one that crops badly all pass without comment. Only the first tag of each name is counted, which means a second og:image on the same page goes unmentioned, and og values written as name= rather than property= are accepted here without the objection the Open Graph report would raise. Nothing is executed either, so tags a single-page app writes after load read as missing.

The fetch is anonymous over http or https. It carries OmniKitly's own user agent, no cookies and no credentials, follows at most five redirects with every hop re-checked, stops after 512 KB, parses only as far as the closing head tag, and refuses private addresses, localhost and .local, .internal, .home or .lan hostnames. The URL you entered, the meta.json it produced and the job record are deleted together once the retention window passes — hours, not days.

How to use it

  1. Enter the page URL. The published address, http or https. The hostname is resolved before anything connects, and an address carrying a username and password is turned away.
  2. Set Page URL if an image path is relative. The one setting here. Left empty, the address the fetch finished on is used to resolve a relative twitter:image or og:image.
  3. Run the check. The URL travels to the processing service over an encrypted connection, and the page is requested with OmniKitly's own user agent and no cookies — so you see what an unauthenticated crawler sees.
  4. Read the cards, then the findings. Three schematic previews, the tag table, then the errors, warnings and notes. The raw fetch behind it — HTTP status, canonical, robots and the URL the redirects ended on — downloads as meta.json.
  5. Re-run after you deploy, then clear the platform's cache. A tag change does not reach an existing post. X's card validator, LinkedIn's post inspector and a fresh share in Slack each force a re-scrape.

Processing & privacy

Secure server processing. This operation requires temporary server processing.

Common use cases

Checking a link before you post it

One fetch says whether the card tags are on the live URL, rather than finding out from the preview in the composer.

A share preview showing the wrong title

The report shows which of twitter:title, og:title and the title element is actually present, so you know which one the platform fell back to.

Links that travel through a redirect

Campaign and shortened URLs land somewhere else. Up to five hops are followed and the tags are read from the page you end on, with that address named in meta.json.

Auditing one page per template

Run an article, a product and a listing URL. A template where og:image was never filled in shows as missing rather than inherited.

Questions

Does OmniKitly fetch the page rather than my browser?
Yes. The URL is sent to the processing service over an encrypted connection and the service makes the request, because a browser cannot read another site's HTML from this page. The URL, the report and the job record are deleted when the short retention window expires.
It says my tags are missing, but I can see them in the browser
The service reads the HTML your server sends and executes no JavaScript. Tags a framework injects into the head after load are not in that response, so they read as missing — which is roughly how most social crawlers see the page too.
Does it render the card as an image?
No. The three cards are schematic: real title, description and host, but the image appears as its URL inside a placeholder box. The file is never downloaded, so the report cannot tell you whether it loads, what it weighs, or whether its dimensions suit the card type you declared.
I fixed the tags and the old preview still shows
Every platform caches its first scrape of a URL. Re-run this check to confirm the new tags are live, then force a re-scrape with X's card validator, LinkedIn's post inspector, or by sharing the link again in Slack.
Can I check a staging site or a page behind a login?
No. The fetch carries no cookies or credentials, and private addresses, localhost and .local or .internal hostnames are refused outright. Check a publicly reachable URL instead.
What is the difference between summary and summary_large_image?
summary renders a small square thumbnail beside the text; summary_large_image gives the wide image card. The report shows which value your twitter:card tag carries, and a page with no twitter:card at all leaves X to fall back to the Open Graph tags.
The box says page HTML is accepted, and Load sample fills it with markup
Ignore both — they are wrong today. Whatever sits in that box is sent to the service as an address to fetch, so the sample markup, or any head you paste, comes back rejected as an invalid URL. Enter the URL of the page instead.

Related tools