[object Object]

← back to AsSeenInMovies

asseeninmovies: htmlShell — auto-emit baseline meta description + og:title/description/url + twitter:card when caller didn't inject OG via headExtras. Now every htmlShell route (/movies, /people, /spotted, /search etc) gets share preview cards; /movie/:id + /person/:id keep their richer routed tags.

880a1dddc97ec3b2980df574b32339913e3e3944 · 2026-05-12 18:54:04 -0700 · SteveStudio2

Files touched

Diff

commit 880a1dddc97ec3b2980df574b32339913e3e3944
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Tue May 12 18:54:04 2026 -0700

    asseeninmovies: htmlShell — auto-emit baseline meta description + og:title/description/url + twitter:card when caller didn't inject OG via headExtras. Now every htmlShell route (/movies, /people, /spotted, /search etc) gets share preview cards; /movie/:id + /person/:id keep their richer routed tags.
---
 server.js | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/server.js b/server.js
index e866558..421ef36 100644
--- a/server.js
+++ b/server.js
@@ -841,13 +841,25 @@ function imageCreditHtml(credit, license, sourceUrl, sourceKind) {
   return `<span class="img-credit">Photo: ${artistPart}${licPart}<a href="${esc(sourceUrl)}" rel="nofollow noopener" target="_blank">source</a></span>`;
 }
 
-function htmlShell(title, body, headExtras = '', canonical = '') {
+function htmlShell(title, body, headExtras = '', canonical = '', metaDesc = '') {
+  const fullTitle = `${title} · AsSeenInMovies`;
+  // Default fallback meta description if the caller didn't pass one and
+  // didn't inject one via headExtras. Route-level callers should override
+  // for stronger SEO; this guarantees no page ships with zero description.
+  const desc = metaDesc || `${title} — film + TV reference on AsSeenInMovies. 290k+ movies, 61k+ people, verified SPOTTED set decor.`;
+  const hasOgInExtras = /property="og:title"/.test(headExtras);
   return `<!doctype html>
 <html lang="en"><head>
-<meta charset="utf-8"><title>${esc(title)} · AsSeenInMovies</title>
+<meta charset="utf-8"><title>${esc(fullTitle)}</title>
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='6' fill='%230d0c0a'/%3E%3Ctext x='16' y='22' font-family='Georgia,serif' font-style='italic' font-size='20' fill='%23c9a14b' text-anchor='middle'%3EA%3C/text%3E%3C/svg%3E">
 ${canonical ? `<link rel="canonical" href="${esc(canonical)}">` : ''}
+${hasOgInExtras ? '' : `<meta name="description" content="${esc(desc)}">
+<meta property="og:type" content="website">
+<meta property="og:title" content="${esc(fullTitle)}">
+<meta property="og:description" content="${esc(desc)}">
+${canonical ? `<meta property="og:url" content="${esc(canonical)}">` : ''}
+<meta name="twitter:card" content="summary_large_image">`}
 ${headExtras}
 <link rel="preconnect" href="https://fonts.googleapis.com">
 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

← f353476 asseeninmovies: canonical URLs on all 5 remaining htmlShell  ·  back to AsSeenInMovies  ·  asseeninmovies: /search perf — gate ILIKE search to poster/h 1910794 →