2026 Open Graph checklist: ship cards that stay correct
You do not need another essay on what og:title means. You need a page you can print, tick, and hand to whoever ships the next landing page — without rediscovering the whole series every time.
This is the series wrap-up: three checklists (15 minutes before ship, 15 minutes after ship, quarterly engineering), a map of which OGKit surface owns each job, and an index of posts 01–11. If an item is unclear, follow the deep link; do not invent policy in a Slack thread.
Honest boundary, same as the rest of the product: third-party multi-previews are approximations. Only each platform’s official debugger can invalidate that platform’s cache.
How to use this page
- Print or keep one tab open during release. Tick boxes; leave notes next to anything deferred.
- Prefer fixing the template (layout, CMS default, SSR shell) over one heroic URL.
- Re-run the relevant slice after you change tags, images, routing, or bot rules — not only after a full redesign.
Self-proof: this article’s own share card is generated from the same blog pipeline as every other post. If you paste this URL into a scanner or debugger and the card is wrong, the checklist failed its own job.
1. Pre-release — 15 minutes
Do this on the production-shaped URL (staging that matches CDN, HTTPS, and bot access — not only localhost with a different shell).
Tags (minimum correct set)
- Raw HTML includes
og:title,og:type,og:url,og:imagebefore any client JS runs
→ required meta tags · og-title-missing · og-tags-require-javascript -
og:descriptionandog:site_nameare intentional copy, not empty CMS placeholders
→ og-description-missing · og-site-name-missing -
og:urlis absolute HTTPS and matchesrel=canonical(same identity, no stray tracking params)
→ og-url-missing · og-url-canonical-mismatch - Twitter / X:
twitter:cardset (summary_large_imagewhen you want a large image)
→ twitter-card-missing - No conflicting duplicate meta for the same key from theme + plugin + framework
→ meta-tag-conflicting-duplicates
Image
-
og:imageis absolute HTTPS, returns 200 to a crawler, not a login wall
→ og-image-missing · og-image-not-https · image engineering - Final bytes after redirects stay inside the platforms you care about (WhatsApp-class budgets are the usual cliff)
→ og-image-bytes-exceeds-platform-budget · og-image-redirects - Content-Type matches the file; dimensions are large enough for large-card layouts
→ og-image-content-type-mismatch · og-image-dimensions-too-small - Safe crop: important text is not only in the edges platforms trim
→ og-image-aspect-ratio-crop-risk · platform differences
Platforms & crawlers
- Spot-check the platforms that actually drive traffic for this launch (not all eight every time)
→ platform archive · card differences - Social bot User-Agents are not blocked by robots / WAF on the public URL
→ robots-blocks-social-crawlers · crawler UA guide - If you fork HTML by UA, humans and bots still share the same intent of the card (no “security by hiding secrets from non-bots”)
→ ua-content-diverged
SPA / SSR
-
curlwithout a browser shows the same og:* as DevTools after a hard refresh
→ SPA / SSR - Dynamic routes that need unique cards do not rely on client-only
document.titlehacks
→ dynamic OG images
Private / pre-prod
- localhost / VPN / auth-walled staging was checked with a local path (extension or fixture), not by pasting secrets into a public checker
→ localhost & staging
Fast public pass: paste the URL into the homepage scan. You want rule findings you can act on, not a single green “looks fine” mock card.
2. Post-deploy — 15 minutes (rescrape)
Shipping new HTML is not the same as clearing every platform’s memory of the old card.
- Confirm production HTML (View Source or
curl -Awith a social bot UA) has the new tags and image URL
→ cache & rescrape - For each platform that matters this release, run the official debugger / Post Inspector / refresh flow — not only a third-party preview
→ rescrape helper (official entry points by URL) - Image URL strategy: either a new path (cache-bust) or accept that you must rescrape every network that already cached the old one
- Spot-check one real unfurl in Slack / chat / LinkedIn feed after official refresh — approximations lie about cache state
- If the card is still wrong after rescrape, stop guessing TTL: re-check redirects, final image bytes, and bot-facing HTML first
→ blank card patterns
There is no “clear the whole internet” button. Plan rescrape time into the launch checklist the same way you plan DNS TTL.
3. Quarterly engineering checklist
Release heroes burn out. Put the boring gates on a calendar.
CI & baselines
- Critical templates (home, pricing, docs hub, blog post layout) run an OG check on every PR
→ CI regression gate - Checks use stable rule ids and a non-zero exit code on failure (treat like ESLint, not a screenshot gallery)
- Baseline / allowlist exists for known debt — and shrinks over time, not grows forever
- HTML fixtures or public canaries cover “meta only after JS” and “relative og:image” so refactors cannot reintroduce them silently
Example shape (wire to your real CI; package and flags evolve — verify against the CLI package):
# Public URL or built HTML — exit non-zero on rule failures
npx --yes @og-kit/cli check https://www.example.com/
Image budget
- Default OG asset pipeline targets a max byte size the team agreed on (document the number; do not rely on folklore alone)
→ image engineering - Dynamic image routes (Satori /
opengraph-image/ template API) are load-tested for font subset and timeout failures
→ dynamic OG images - CDN / signed URL expiry longer than “how long a crawler might retry after a share spike”
Platform & bot matrix
- Re-verify platform docs numbers you depend on (title length, image slot) — UIs change; mark stale assumptions
- Re-sample bot UA behavior if you added edge auth, bot management, or a new CDN
→ crawler UA guide - Tooling review: official debuggers still bookmarked; preview sites only for layout QA
→ tooling comparison
Ownership
- Someone owns “share card broken” on-call or triage — not “whoever last touched the CMS”
- Needs-human / multi-property audits: use consulting only when the problem is process and surface area, not a missing meta tag
4. OGKit capability map
Use the thinnest surface that can see the URL.
| Job | Use | Not a substitute for |
|---|---|---|
| Score a public URL, rule-by-rule | Homepage scan + rules docs | Official cache invalidation |
| Understand why a rule fired | Rules reference (stable ids) | Platform product policy |
| Compare platform field / crop behavior | Platforms + series 03 | Pixel-perfect official UI |
| Force official rescrape | Rescrape helper → platform tools | Third-party “refresh” buttons |
| localhost / private HTML | Browser extension (page ↔ extension bridge) | Pasting cookies into SaaS checkers |
| CI / filesystem / build output | @og-kit/cli check (+ Action thin wrapper when you wire it) |
Manual DevTools on main |
| Multi-site / process-heavy audit | Consulting | A scanner alone |
One-line product pitch for the series: OGKit is ESLint + Lighthouse for Open Graph — crawl like a bot, score with named rules, fail the build when share cards would break. It does not replace Meta’s or LinkedIn’s own debuggers.
5. Series index (01–11)
| # | Topic | Link |
|---|---|---|
| 01 | What Open Graph actually solves | what-open-graph-really-solves |
| 02 | Required OG / Twitter meta tags | required-open-graph-meta-tags |
| 03 | Platform card differences | social-platforms-og-card-differences |
| 04 | Image engineering (size, bytes, format, redirects) | open-graph-image-engineering |
| 05 | Cache, TTL, and rescrape | open-graph-cache-and-rescrape |
| 06 | SPA crawlers, SSR, prerender | spa-open-graph-ssr-prerender |
| 07 | Dynamic OG images (Next / Satori) | dynamic-og-image-next-satori |
| 08 | Crawler user-agents and content forks | crawler-user-agents-open-graph |
| 09 | CI regression gates | open-graph-ci-lint-regression |
| 10 | localhost / staging preview gaps | preview-open-graph-localhost-staging |
| 11 | Choosing tools (debugger / preview / generator) | open-graph-tools-comparison |
| — | Companion: blank card failure modes | why-your-open-graph-card-is-blank |
| 12 | This checklist | open-graph-checklist-ogkit |
One command to start
Public URL, no install required beyond npx:
npx --yes @og-kit/cli check https://www.example.com/
Or paste the same URL into the web scanner. When the report is green and the official debuggers show the new art, you are done — until the next template change, which is why the quarterly and CI rows exist.