Every link we had ever shared rendered as a cropped slice of our own logo. The image was 1695 × 387 — a 4.38:1 strip — and the card type our pages declare renders at about 1.91:1. Nothing warned us, because nothing in that pipeline treats a wrongly shaped image as an error.
Before building a replacement we measured nine other browser-game portals to see what a correct one looks like in the wild. Six of the nine served a measurable image, and exactly one of those matched both the card type it declared and its own declared dimensions. Ours was the worst number in the table.
The short version. A social card has a fixed shape. Your image gets fitted into it and the remainder is discarded — silently, with no error and no console message. So the defect is invisible from inside your own site: the page validates, the tag is present, the image loads. You only ever see it on somebody else's platform, in a preview you are not looking at.
It depends on one other tag, which is the part people miss. twitter:card chooses which of two layouts a platform uses: summarylargeimage — the big banner card. It renders at roughly 1.91:1, and 1200 × 630 is the conventional size to supply. summary — the small card with a thumbnail beside the text. Roughly square.
Declaring one and supplying an image shaped for the other is the whole bug. And because the platform fits rather than rejects, both mistakes look completely fine on your end. The tag is there. The image resolves. Your validator is happy. Somewhere else, a person sees the middle third of your wordmark.
Worth saying plainly, since these tags have a reputation for being fiddly: the ratio is what matters, not the exact pixel count. A 2400 × 1260 image is the same shape as a 1200 × 630 one and previews identically.
We read the number out of the PNG's own IHDR header rather than trusting the filename or the CSS, and by two independent routes — once off the file on disk, once by fetching the first 16 KB of the live URL. Both gave the same answer.
| Measurement | Value | |---|---| | The file we were serving as og:image | the site wordmark, 36,527 bytes | | Its real pixel size | 1695 × 387 | | Its aspect ratio | 4.380 : 1 | | What our declared card renders at | ~1.905 : 1 | | Mismatch | 2.30× | | Pages affected | 23 of 235 | | og:image:width / og:image:height declared | neither |
At 2.3× too wide, more than half the width of the image is cut. What survives is a centre slice of a wordmark with the first and last letters gone — which is worse than no image at all in one specific way: it looks like a rendering bug on the platform, not a choice.
This is the part we had not seen written down anywhere, so we measured it. One unauthenticated GET per homepage, the Open Graph tags read out of the served HTML, then a Range: bytes=0-16383 request against each image so we could read its real dimensions out of the file's own header without downloading the whole thing. Measured 12 August 2026.
| Site | Card declared | og:image, real size | Ratio | Dimensions declared in the markup | |---|---|---|---|---| | Poki | summarylargeimage | 1200 × 630 | 1.905 | 1200 × 630 — matches | | Playgama | summary | 2400 × 1260 | 1.905 | none | | CrazyGames | summarylargeimage | 1200 × 600 | 2.000 | 1200 × 630 — does not match | | Armor Games | summarylargeimage | 1200 × 825 | 1.455 | none | | Y8 | summarylargeimage | 500 × 500 | 1.000 | 500 × 500 — matches the file | | itch.io | summarylargeimage | no og:image | — | — | | Kongregate | none | no og:image | — | — | | GameJolt | none | no og:image | — | — | | Newgrounds | not measured — returned 403 to our request | | | | | Ours, before this | summarylargeimage | 1695 × 387 | 4.380 | none |
Reading it honestly, four things stand out: One site got it exactly right. Poki declares the wide card, serves 1200 × 630, and declares dimensions that match the file. That is the whole specification, done. Y8 has our bug, smaller. It declares the wide card and serves a square 500 × 500 logo. Same class of mismatch as ours, at 1.9× instead of 2.3×. A declared dimension can drift from the file. CrazyGames' markup says the image is 630 tall; the file the CDN actually delivered to us is 600. The image URL itself even asks for height=630&fit=crop. Thirty pixels is cosmetically nothing — but it is a live example of a hardcoded number and a real file disagreeing, which is the argument for generating those tags rather than typing them. Three of nine ship no og:image on the homepage at all, and itch.io declares summarylargeimage while supplying nothing to put in it. A card with a hole in it.
What this table is not. It is not a ranking, and it is not a criticism of anyone. Every site in it is a larger platform than ours, and the worst number in the table is ours. It is also a single unauthenticated request per homepage on one day: a site can serve different markup to a logged-in visitor or to a specific crawler, inner pages often differ from the homepage, and Newgrounds returned 403 to us so it is recorded as unmeasured rather than guessed at. The point of the table is only this — if a defect this visible is this common among sites this large, checking yours is worth five minutes.
The instinct on finding a broken share image is to build a card and put it on every page. We have 235 pages, so that is 235 edits.
Counting first said otherwise. 212 of the 235 were never part of the defect. Those pages point og:image at the individual game's own thumbnail rather than at any site-level image. We sampled 25 of the 200 catalogue thumbnails at random by range request, and 25 of 25 came back 1920 × 1080; a full sweep of all 200 resolved 196 at that size and left 4 unresolved.
16:9 is 1.778:1. Into a 1.91:1 card that is a trivial crop — a few per cent off the top and bottom. Those pages were fine.
They were also better than fine. A preview showing the actual game tells a reader what they are about to click; a brand card tells them the domain, which the platform already prints underneath. Putting a generic card on 212 game pages would have been a downgrade dressed up as a fix — the kind you never detect afterwards, because everything you changed still validates.
Count how many things actually have the defect before you build the thing that repairs it. The audit is not preparation for the fix. It is the first draft of the fix, and it is the step that stops a repair doing damage of its own.
