Files
SnapOtter/apps/demo/index.html
T
SnapOtterandGitHub e6718ada71 fix(seo): emit clean docs URLs and de-index the demo (#598)
The docs sitemap listed .html URLs that Cloudflare Pages 308-redirects to
their clean form, while every page's canonical/hreflang already pointed at
the clean URL. Google indexed the redirecting .html variant and picked its
own canonical (GSC "Duplicate, Google chose different canonical"), and burned
crawl budget re-fetching redirecting URLs. Setting VitePress cleanUrls:true
makes the sitemap and internal links extension-less so they match the
canonicals. CF Pages already serves the clean URL at 200 and 308s the .html
form, so no hosting change is needed and legacy .html hits consolidate.

Also mark demo.snapotter.com noindex: it mirrors the real app under the same
domain property, so its routes were being crawled and indexed as thin,
duplicate pages.
2026-07-21 15:22:15 +08:00

26 lines
1.3 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>SnapOtter Demo</title>
<meta name="description" content="Try SnapOtter - open-source, self-hosted file processing platform. Live demo." />
<meta name="theme-color" content="#E07832" />
<link rel="icon" type="image/png" sizes="48x48" href="/favicon.png" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<meta property="og:title" content="SnapOtter Demo" />
<meta property="og:description" content="Try SnapOtter - open-source, self-hosted file processing. 200+ tools, 100% local." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://demo.snapotter.com" />
<meta property="og:image" content="https://snapotter.com/og-image.png" />
<!-- Demo mirrors the real app and lives under the same domain property; keep it
out of search to avoid thin/duplicate pages (GSC "Crawled - currently not indexed"). -->
<meta name="robots" content="noindex, nofollow" />
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>