Paste any URL to auto-fetch its OG tags, or fill them in manually. Preview exactly how your link card looks on Twitter/X, Facebook, Discord, Slack, and WhatsApp — then copy the generated HTML.
Leave blank to inherit the og: values. Use these only when the Twitter card should show different content.
When a URL is shared on social media, platforms don't use the page title — they read a set of HTML <meta> tags in the page's <head> block called Open Graph (OG) tags. These tags define the title, description, image, and other metadata shown in the link preview card. Getting them right is the difference between a card that drives clicks and a blank square with a truncated URL.
This tool gives you a live editor for all the critical OG and Twitter Card meta tags, with simultaneous previews of how the card renders on five different platforms: Twitter/X (both summary and summary_large_image layouts), Facebook/LinkedIn, Discord, Slack, and WhatsApp. You can paste any public URL into the fetch bar and the tool will attempt to read the existing OG tags via a CORS proxy — useful for auditing live pages without digging through DevTools. Paste the generated HTML directly into your <head> block when you're done.
twitter:title, twitter:description, and twitter:image independently, e.g. if your Twitter card should have a different image ratio from the Facebook card.<head>.CORS proxy fetch — browsers enforce the Same-Origin Policy, blocking JavaScript from reading the HTML of cross-origin pages. This tool sends the target URL to https://api.allorigins.win/get?url=, a public CORS proxy that makes the request server-side and returns the page HTML as a JSON string. The returned HTML is parsed with new DOMParser().parseFromString(contents, 'text/html'), giving a DOM object that can be queried with querySelector. Relative image URLs are resolved to absolute using new URL(path, baseUrl).href.
Meta tag priority — the tool reads tags in this fallback order: og:title → twitter:title → document.title for the title; og:description → twitter:description → name="description" for the description. Twitter-specific overrides in the Advanced panel take precedence over og: values when computing the Twitter card preview.
Image validation — <img> elements fire load or error events after the browser attempts to fetch the URL. @load="onImageLoad()" sets imageLoaded = true and clears imageError; @error="onImageError()" does the reverse. The same image element is used across all platform previews so the browser only makes one request regardless of how many tabs are shown.
HTML escaping in generated code — the generatedCode getter escapes & → & and " → " in attribute values so user input containing these characters produces valid HTML. The display uses Alpine's x-text which sets textContent (not innerHTML), so the < and > characters in the tag strings render correctly as-is without a second round of escaping. The copyCode() method builds a parallel version using only the &/" escapes (no </>) so the copied HTML is pasteable directly into <head>.