og:image is relative
A path like /og.png cannot be fetched by a crawler. The single most common reason a shared link has no thumbnail.
Paste a URL. See every tag you have, every preview each platform will build from them, and the exact fix for anything missing.
Fixes come ready for Claude Code, Cursor, Codex, ChatGPT or Copilot. One copied prompt is the whole change.
Thirty-two checks on every page, including these.
Every issue carries a real snippet, written in the idiom of your framework. Take one tag, or take the whole report as a single prompt for your AI assistant.
<title>Acme — Pricing that scales</title>
<meta name="description" content="Compare plans.">
<link rel="canonical" href="https://acme.com/pricing">
<meta property="og:title" content="Acme — Pricing">
<meta property="og:image" content="https://acme.com/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta name="twitter:card" content="summary_large_image">
Meta::title('Acme — Pricing that scales');
Meta::description('Compare plans.');
Meta::canonical(url()->current());
Meta::image(asset('og.png'), width: 1200, height: 630);
Meta::twitter()->card('summary_large_image');
// composer require davmixcool/laravel-meta-manager
export const metadata = {
title: 'Acme — Pricing that scales',
description: 'Compare plans.',
alternates: { canonical: 'https://acme.com/pricing' },
openGraph: {
images: [{ url: '/og.png', width: 1200, height: 630 }],
},
twitter: { card: 'summary_large_image' },
};
useSeoMeta({
title: 'Acme — Pricing that scales',
description: 'Compare plans.',
ogImage: 'https://acme.com/og.png',
ogImageWidth: 1200,
ogImageHeight: 630,
twitterCard: 'summary_large_image',
});
Not one generic card. Each platform gets the layout it actually uses, and each says which of your tags produced every value it shows.
Every one of these is a real rule in the checker. Most sites have at least two of them right now, and none of them show up in a browser.
A path like /og.png cannot be fetched by a crawler. The single most common reason a shared link has no thumbnail.
A plugin and a theme both wrote one. Search engines pick a winner, and not always the page you wanted.
Tags say 1200×675, the file is 1200×630. Platforms reserve the wrong space and the preview reflows.
X falls back to a small card, or nothing. One tag turns it into the full-width image everyone expects.
At 210 characters it is not wrong, but search results and most unfurls truncate it mid-sentence.
Shares consolidate to whatever og:url names. If it is stale, the engagement lands on the wrong page.
One page is a spot check. Point MetaManager at a site and it crawls up to 500 pages, scores each one, and groups the issues so you can see that a single template is breaking two hundred pages.
Alerts are deliberately quiet: a new issue or a page that stopped resolving will email you, a reworded description will not. See what Pro includes →
The most common thing we find is a page with no og:image. Add one line to
your template and every page gets a card built from its own title, in your colours.
An example, drawn from our own pricing page. Demo cards use our colours and carry our mark — yours use yours, and do not.
Connect MetaManager to Claude, Cursor, Codex or anything else that speaks MCP. Your agent checks the page, reads exactly what is wrong, edits your templates, then checks again and tells you the score moved.
Connecting takes one command. Clients that support OAuth open MetaManager, ask you to tick what the agent may do, and handle the credential themselves — and clients that do not can still use an API key, exactly as before.
Our agent skill teaches that loop, so it re-checks its own work rather than assuming.
npx skills add davmixcool/skills --skill metamanager
Single-page checks work on the free plan; site audits and monitoring need Pro. Connect your agent →
The same engine behind the checker, returning the whole report as JSON. Point CI at it and fail a build when a page loses its tags. Checking a page needs no account at all; a key unlocks your audits, monitors and saved URLs, and is what your agent uses over MCP.
curl 'https://metamanager.dev/inspect?url=https://acme.com'
{
"score": 93,
"final_url": "https://acme.com/",
"response_time": 162,
"metadata": { "title": "Acme", "open_graph": { ... } },
"image": { "width": 1200, "height": 630, "size": 54210 },
"previews": { "google": { ... }, "x": { ... } },
"issues": [ { "code": "missing_og_locale", ... } ]
}
const res = await fetch(
'https://metamanager.dev/inspect?url=' +
encodeURIComponent('https://acme.com') + '&prompt=next'
);
const report = await res.json();
if (report.score < 90) {
console.error(report.issues.map(i => i.code));
process.exit(1); // fail the build
}
$response = Http::get('https://metamanager.dev/inspect', [
'url' => 'https://acme.com',
'prompt' => 'laravel',
]);
$report = $response->json();
foreach ($report['issues'] as $issue) {
logger()->warning($issue['code'], $issue['fix']);
}
&fresh=1 bypasses itThe things worth knowing before you paste anything in. Answered plainly, without jargon.
The checker is free and needs no account. Enter a URL and you get the whole report — every tag, all eight previews, and the fixes.
Reports are cached for about fifteen minutes so a repeat check is instant. Nothing is kept beyond that, and nothing is tied to an account.
Because they are approximations, and every card says so. Platforms change layouts, crop differently and cache aggressively. What stays true is which tag produced each value.
No. We read the HTML your server returns, which is what crawlers read. If your metadata is injected client-side, most platforms will not see it either — so that is a finding, not a limitation.
Fifty an hour, which is generous for a person and unfriendly to a script.
Metadata completeness and correctness, and nothing else. It is a Meta Score, not an SEO score, and says nothing about how you rank.
One paste. A couple of seconds.
or check it from your terminal
curl 'https://metamanager.dev/inspect?url=yoursite.com'