Add one short edge worker and every page on your site gets its SEO gaps filled automatically — missing OG tags, social cards, Twitter metadata, and more. No code changes on your origin.
snapog.com/x/<url>.Your worker is just a one-line proxy. All the SEO logic lives on SnapOG's side, so you get improvements automatically as we add new checks.
<title> tagmeta descriptionwebsite if missingsummary_large_image for rich previews<html> if missingTags that already exist on your pages are left alone. SnapOG only fills in what's missing.
/audit/<your-url> for a full report.
Choose your CDN:
Install Wrangler and scaffold a new project:
npm create cloudflare@latest snapog-seo
Replace the generated worker code with:
export default {
async fetch(request) {
const response = await fetch(request);
const contentType = response.headers.get("content-type") || "";
// Only rewrite HTML pages
if (!contentType.includes("text/html")) {
return response;
}
// SnapOG handles the SEO fixes and returns the rewritten page
return fetch(`https://snapog.com/x/${encodeURIComponent(request.url)}`);
}
};
That's the whole script. SnapOG handles the auditing and rewriting.
In your wrangler.toml:
name = "snapog-seo"
main = "src/index.js"
compatibility_date = "2024-01-01"
routes = [
{ pattern = "yoursite.com/*", zone_name = "yoursite.com" }
]
Scope it to specific paths if you prefer:
yoursite.com/* — all pagesyoursite.com/blog/* — only blog pages*.yoursite.com/* — all subdomainsnpx wrangler deploy
After deploying, check any page:
curl -s https://yoursite.com/some-page | grep -E 'og:|twitter:'
You should see the injected tags. You can also run the SnapOG audit again to confirm the score improved.
For social previews specifically, use the Facebook Sharing Debugger or Twitter Card Validator.
Look for the X-SnapOG-SEO: applied response header to confirm the proxy is active.
SnapOG respects your origin's cache headers. If your page is cacheable, the rewritten version is cached at the edge with stale-while-revalidate — so subsequent requests are served instantly while the cache refreshes in the background. Pages with no-cache, no-store, or private headers are passed through without rewriting.