A shared /watch/{token} link is a client-rendered SPA, so a social crawler only
saw the generic index.html — a blank link card. The server now injects per-video
Open Graph / Twitter tags (title, channel, thumbnail) into the served HTML for
that route, so links unfurl richly in Messenger and other chat apps; real
browsers ignore the extra tags and hydrate the page as usual. Password /
expired / invalid links fall back to the generic card with no metadata leak.
Also shortens the generic site description used for search engines and link
previews.
28 lines
1.0 KiB
HTML
28 lines
1.0 KiB
HTML
<!doctype html>
|
|
<html lang="en" data-theme="dark" data-scheme="midnight">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
<!-- OG:START — the server replaces this block for /watch/{token} so shared links unfurl with
|
|
the video's title/channel/thumbnail; every other route keeps these generic defaults. -->
|
|
<!--OG:START-->
|
|
<title>Siftlode</title>
|
|
<meta
|
|
name="description"
|
|
content="A self-hosted, multi-user reader, subscription organizer and media center with download capabilities."
|
|
/>
|
|
<meta property="og:title" content="Siftlode" />
|
|
<meta
|
|
property="og:description"
|
|
content="A self-hosted, multi-user reader, subscription organizer and media center with download capabilities."
|
|
/>
|
|
<meta property="og:type" content="website" />
|
|
<!--OG:END-->
|
|
</head>
|
|
<body>
|
|
<div id="root"></div>
|
|
<script type="module" src="/src/main.tsx"></script>
|
|
</body>
|
|
</html>
|