Check your metadata
before the internet does.

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.

  • <title>
  • meta description
  • canonical
  • favicon
  • lang
  • og:title
  • og:description
  • og:image
  • og:url
  • og:type
  • og:site_name
  • og:locale
  • og:image:alt
  • image dimensions
  • twitter:card
  • twitter:title
  • twitter:image
  • twitter:site

Copy the exact fix for the stack you already use.

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">
Exactly what the checker hands you.
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
Exactly what the checker hands you.
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' },
};
Exactly what the checker hands you.
useSeoMeta({
  title: 'Acme — Pricing that scales',
  description: 'Compare plans.',
  ogImage: 'https://acme.com/og.png',
  ogImageWidth: 1200,
  ogImageHeight: 630,
  twitterCard: 'summary_large_image',
});
Exactly what the checker hands you.

See the real preview for every platform.

Not one generic card. Each platform gets the layout it actually uses, and each says which of your tags produced every value it shows.

  • GoogleSearch result
  • X / TwitterSummary card
  • FacebookOpen Graph
  • LinkedInOpen Graph
  • DiscordRich embed
  • WhatsAppSmall thumb
  • SlackUnfurl
  • TelegramInstant view

The problems that quietly break a shared link.

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.

error

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.

error

Two canonical tags

A plugin and a theme both wrote one. Search engines pick a winner, and not always the page you wanted.

warning

Dimensions do not match

Tags say 1200×675, the file is 1200×630. Platforms reserve the wrong space and the preview reflows.

warning

No twitter:card

X falls back to a small card, or nothing. One tag turns it into the full-width image everyone expects.

tip

Description reads past the cut

At 210 characters it is not wrong, but search results and most unfurls truncate it mid-sentence.

tip

og:url points elsewhere

Shares consolidate to whatever og:url names. If it is stale, the engagement lands on the wrong page.

Then keep the whole site right.

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.

  • Site auditsUp to 500 pages, scored
  • Scheduled checksDaily or weekly
  • Change detectionSeven tags watched per page
  • Email alertsOnly when something breaks
  • Compare two runsWhat a deploy changed
  • Shareable reportsA link, or a PDF

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 →

Missing a preview image? We will draw one.

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.

Layout
A social card drawn from a page's own title

An example, drawn from our own pricing page. Demo cards use our colours and carry our mark — yours use yours, and do not.

Or let your agent do it.

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.

  • Claude
  • Codex
  • Gemini
  • Copilot
  • Zed
  1. Check Score and issues for any URL
  2. Fix Instructions for your framework
  3. Verify Re-check and confirm the score rose

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 →

A public API, no key required.

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", ... } ]
}
Exactly what the checker hands you.
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
}
Exactly what the checker hands you.
$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']);
}
Exactly what the checker hands you.
  • No authNo key, no account
  • 50 req/hourPer IP, sliding window
  • JSONStable issue codes
  • Cached 15 min&fresh=1 bypasses it

Questions you have that we already answered.

The things worth knowing before you paste anything in. Answered plainly, without jargon.

Is it really free?

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.

Do you store the pages I check?

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.

Why does a preview look different on the real platform?

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.

Does it run JavaScript?

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.

How many checks can I run?

Fifty an hour, which is generous for a person and unfriendly to a script.

What does the score actually measure?

Metadata completeness and correctness, and nothing else. It is a Meta Score, not an SEO score, and says nothing about how you rank.

See how your links really look.

One paste. A couple of seconds.

or check it from your terminal

curl 'https://metamanager.dev/inspect?url=yoursite.com'