Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Fix social sharing previews so URLs render as rich cards on Facebook, LinkedIn, X/Twitter, WhatsApp, Telegram, and more. Covers OG tags, Twitter cards, absolute image URLs, and debugging.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 42% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 44% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 113% | 0% |
| case-21 | ✓→✓ | = Same ✓ | 92% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 59% | 0% |
Fix social sharing so every important URL unfurls as a rich card across all platforms.
metadataBase coverage in a web app.| Problem | Root Cause | |---------|-----------| | No preview at all | Missing og:title, og:description, or og:image | | Broken image | Relative URL (must be absolute) | | Wrong image size | Image not 1200×630px (OG standard) | | Plain text card | Twitter card type missing or set to summary | | Stale preview | Platform caching old metadata | | Metadata missing on crawl | Tags added by client-side JS (crawlers don't run JS) |
Every shareable page needs ALL of these in static HTML:
js// Next.js App Router — lib/socialMetadata.js export function buildSocialMetadata({ title, description, path, // '/blog/my-post' image, // '/images/og/my-post.jpg' or full URL imageAlt, imageWidth = 1200, imageHeight = 630, }) { const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'https://www.yourdomain.com'; // Always produce an absolute URL const imageUrl = image?.startsWith('http') ? image : `${baseUrl}${image}`; const pageUrl = `${baseUrl}${path}`; // Detect MIME type from extension const ext = imageUrl.split('.').pop().toLowerCase(); const mimeMap = { jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png', webp: 'image/webp' }; const imageType = mimeMap[ext] || 'image/jpeg'; return { title, description, alternates: { canonical: pageUrl }, openGraph: { title, description, url: pageUrl, type: 'website', // use 'article' for blog posts images: [{ url: imageUrl, secureUrl: imageUrl, // explicit HTTPS version width: imageWidth, height: imageHeight, alt: imageAlt || title, type: imageType, }], }, twitter: { card: 'summary_large_image', // NOT 'summary' — that shows a tiny image title, description, images: [imageUrl], }, }; }
js// app/about/page.js import { buildSocialMetadata } from '@/lib/socialMetadata'; export const metadata = buildSocialMetadata({ title: 'About Us | My Site', description: 'Learn about our team and mission.', path: '/about', image: '/images/og/about.jpg', imageAlt: 'The My Site team', });
js// app/blog/[slug]/page.js import { buildSocialMetadata } from '@/lib/socialMetadata'; export async function generateMetadata({ params }) { const post = await getPost(params.slug); return buildSocialMetadata({ title: `${post.title} | My Blog`, description: post.excerpt, path: `/blog/${params.slug}`, image: post.ogImage || '/images/og/default.jpg', imageAlt: post.title, }); }
jsexport const metadata = { metadataBase: new URL('https://www.yourdomain.com'), // REQUIRED for absolute URLs ...buildSocialMetadata({ title: 'My Site — Tagline Here', description: 'Site-wide description.', path: '/', image: '/images/og/home.jpg', }), };
> ⚠️ Set metadataBase when using relative metadata URLs. If your helper already outputs absolute canonical/OG URLs, previews can still work without it.
Good OG images:
bash# Verify your OG image is reachable and correct size curl -sI https://www.yourdomain.com/images/og/home.jpg | grep -i "content-type\|content-length\|status"
og:title, og:description, og:image, og:urltwitter:card = summary_large_image for full-width imagestwitter:image must be an absolute URLog: tags; ignores twitter: tagsog:type = article for richer embedsbashcurl -s https://www.yourdomain.com/blog/my-post | grep -i "og:\|twitter:"
If tags don't appear → they're being added by JavaScript (not crawlable). Fix: move to export const metadata or generateMetadata.
| Platform | Tool | |----------|------| | Facebook | https://developers.facebook.com/tools/debug/ | | LinkedIn | https://www.linkedin.com/post-inspector/ | | Twitter/X | https://cards-dev.twitter.com/validator | | General | https://metatags.io |
After deploying fixes, paste the URL into each platform's debugger and click "Fetch new scrape information" (or equivalent).
metadataBase set in root layoutbuildSocialMetadata helperhttps://)secureUrl set equal to url in OG image blocktwitter:card is summary_large_image (not summary)Other measured skills in the registry, with their headline benchmark lift.