The short answer
Set twitter:card to summary_large_image.
X only draws the big image card when twitter:card is explicitly summary_large_image. Missing, you get a bare link; set to summary, you get a small square thumbnail. After the tag, make sure og:image (X falls back to it) is an absolute HTTPS URL under 5 MB, Twitterbot isn't blocked in robots.txt or your WAF, and the cache isn't holding a stale empty scrape.
Don't want to hand-set Twitter tags? Every slsh.me short link ships twitter:card = summary_large_image with a 1200×630 image already wired — the big card renders on X out of the box. Free.
The checklist.
In order of how often each one's the culprit. Stop when the card renders.
twitter:card = summary_large_image
View source and search for twitter:card. If it's missing or set to summary, that's it. Add <meta name="twitter:card" content="summary_large_image"> in the <head>. This single line is the fix in most cases.
Image is absolute, HTTPS, and reachable
X reads twitter:image, then falls back to og:image — so one is enough, but it must be a full https:// URL, not /og.png. A relative path or an http:// URL resolves in your browser and silently drops for the scraper.
Under the size cap, right dimensions
Use 1200×630 (1.91:1) and keep the file under 5 MB. Oversized images are skipped and you fall back to a bare card. Square 1:1 art renders as the small thumbnail — use the wide image for the large card. See the image size guide.
Twitterbot isn't blocked
Check robots.txt and any user-agent / WAF / Cloudflare rule doesn't block Twitterbot. A blocked bot fetches an empty page and renders a bare card — even when every tag is perfect for human visitors.
Bust the cache
X retired its public Card Validator, and its cache is keyed on the exact URL. If the tags are right but the old (empty) card persists, append ?v=2 so X treats it as a new link and re-scrapes. See the refresh-a-cached-preview guide.
Small thumbnail vs the big card.
There are two Twitter Card types, and the tag value picks which one X draws. summary renders a small square thumbnail beside the text — the "tiny image" people complain about. summary_large_image renders the full-width 1200×630 banner most posts want.
If your card shows a small image, you're almost certainly on summary (or X guessed it because the tag was absent). Change the value to summary_large_image, confirm the image is the wide 1.91:1 ratio, re-scrape, and the small card becomes the large one. The twitter:title and twitter:description tags are optional — X falls back to your og: values, so don't bother duplicating them.
Test it before you tweet.
X's own validator is gone, so the safe move is to check the live tags off-platform before posting — then you're not burning a post (and caching a bad card) to find out it's broken.
The free slsh.me Open Graph checker fetches your page live and renders the real X card — flagging a missing summary_large_image, a relative or oversized image, or a blocked scraper — alongside how the same link looks on LinkedIn, Facebook, Slack and Discord.
Or skip the tags entirely: every slsh.me link ships the large X card pre-wired, free.
Questions
Why is my Twitter/X card not showing an image? +
twitter:card tag. X only draws the large image card when twitter:card is set to summary_large_image. If it's absent or set to summary, you get a bare link or a small thumbnail. After that, check that og:image is an absolute HTTPS URL under 5 MB, the scraper isn't blocked, and the cache isn't stale.What size should a Twitter/X card image be? +
summary card uses a 1:1 square of at least 144×144. One 1200×630 image keeps every platform consistent.Do I need twitter:image if I already have og:image? +
og:image when twitter:image is missing, so you don't need to duplicate it. The tag that matters is twitter:card = summary_large_image — without it X won't render the big card no matter how many image tags you set.I added the tags and X still shows no image — why? +
?v=2 to force a fresh scrape. Also confirm robots.txt and any WAF or user-agent rule don't block Twitterbot — a blocked bot sees an empty page and renders a bare card.The big card, every time.
Shorten any URL with slsh.me and it ships twitter:card = summary_large_image with a 1200×630 image wired in — the full X card renders without you touching a single meta tag. Plus live click analytics, free.
Free forever · see pricing