Index: src/routes/admin-seo.js
===================================================================
--- src/routes/admin-seo.js	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
+++ src/routes/admin-seo.js	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
@@ -0,0 +1,99 @@
+/**
+ * Admin: geavanceerde SEO-instellingen van de primaire site.
+ *
+ * GET  /admin/seo   -> formulier met alle SEO/social-velden van de hoofdsite
+ * POST /admin/seo   -> opslaan (god-only)
+ *
+ * Deze velden worden al door de <head> (shell.ejs) en de JSON-LD/OpenGraph-
+ * tags geconsumeerd, maar waren tot nu toe nergens te bewerken. De basis-
+ * velden (titel/bio/robots) blijven in Uiterlijk; dit is de geavanceerde laag:
+ * titel-sjabloon, canonical, social-share-afbeelding, verificatie-metas,
+ * publisher/JSON-LD en OpenGraph-locale.
+ *
+ * Werkt op de PRIMAIRE site (solo = de enige site; hub = de bedrijfssite).
+ */
+
+import express from 'express';
+import db from '../config/database.js';
+import { renderPage } from '../middleware/render.js';
+import { requireGod } from '../middleware/auth.js';
+import { getPrimarySite } from '../middleware/site.js';
+
+const router = express.Router();
+
+function trimOrNull(v, max) {
+  const s = (v == null ? '' : String(v)).trim();
+  return s ? s.slice(0, max) : null;
+}
+
+// ==================== FORM ====================
+router.get('/', requireGod, (req, res) => {
+  const primary = getPrimarySite();
+  if (!primary) {
+    return res.redirect('/admin/sites/new?error=' + encodeURIComponent('Maak eerst een site aan'));
+  }
+  const site = db.prepare('SELECT * FROM sites WHERE id = ?').get(primary.id);
+
+  renderPage(req, res, 'pages/admin-seo', {
+    pageTitle: 'SEO',
+    bodyClass: 'on-admin',
+    site,
+    success: req.query.success || null,
+    error: req.query.error || null,
+  });
+});
+
+// ==================== SAVE ====================
+router.post('/', requireGod, (req, res) => {
+  const primary = getPrimarySite();
+  if (!primary) return res.redirect('/admin/seo?error=' + encodeURIComponent('Geen site gevonden'));
+
+  const f = req.body;
+  const schemaType = f.schema_type === 'Organization' ? 'Organization' : 'Person';
+
+  db.prepare(`
+    UPDATE sites SET
+      robots_index = ?,
+      title_template = ?,
+      canonical = ?,
+      default_description = ?,
+      og_image_default = ?,
+      og_locale = ?,
+      author = ?,
+      twitter = ?,
+      facebook_app_id = ?,
+      google_verification = ?,
+      bing_verification = ?,
+      pinterest_verification = ?,
+      yandex_verification = ?,
+      schema_type = ?,
+      publisher_name = ?,
+      publisher_url = ?,
+      publisher_logo = ?,
+      updated_at = CURRENT_TIMESTAMP
+    WHERE id = ?
+  `).run(
+    f.robots_index ? 1 : 0,
+    (f.title_template || '{title} — {site}').slice(0, 200),
+    trimOrNull(f.canonical, 200),
+    trimOrNull(f.default_description, 500),
+    trimOrNull(f.og_image_default, 500),
+    trimOrNull(f.og_locale, 32),
+    trimOrNull(f.author, 120),
+    trimOrNull(f.twitter, 64),
+    trimOrNull(f.facebook_app_id, 64),
+    trimOrNull(f.google_verification, 200),
+    trimOrNull(f.bing_verification, 200),
+    trimOrNull(f.pinterest_verification, 200),
+    trimOrNull(f.yandex_verification, 200),
+    schemaType,
+    trimOrNull(f.publisher_name, 200),
+    trimOrNull(f.publisher_url, 200),
+    trimOrNull(f.publisher_logo, 500),
+    primary.id,
+  );
+
+  res.redirect('/admin/seo?success=' + encodeURIComponent('SEO-instellingen opgeslagen'));
+});
+
+export default router;
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision 0dbb5c14a391c55db20fd75acf91c9876095ea7e)
+++ src/routes/admin-sites.js	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
@@ -303,7 +303,4 @@
       feed_view_default = ?, feed_view_switch = ?,
       show_search = ?, show_archive_link = ?,
-      title_template = ?, twitter = ?, canonical = ?,
-      google_verification = ?, bing_verification = ?,
-      pinterest_verification = ?, yandex_verification = ?,
       custom_css = ?, custom_head_html = ?, custom_foot_html = ?,
       updated_at = CURRENT_TIMESTAMP
@@ -330,11 +327,4 @@
     f.show_search ? 1 : 0,
     f.show_archive_link ? 1 : 0,
-    (f.title_template || '{title} — {site}').slice(0, 200),
-    (f.twitter || '').slice(0, 64) || null,
-    (f.canonical || '').slice(0, 200) || null,
-    (f.google_verification    || '').slice(0, 200) || null,
-    (f.bing_verification      || '').slice(0, 200) || null,
-    (f.pinterest_verification || '').slice(0, 200) || null,
-    (f.yandex_verification    || '').slice(0, 200) || null,
     f.custom_css      || null,
     f.custom_head_html || null,
Index: src/server.js
===================================================================
--- src/server.js	(revision 0dbb5c14a391c55db20fd75acf91c9876095ea7e)
+++ src/server.js	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
@@ -33,4 +33,5 @@
 import adminCommentsRoutes from './routes/admin-comments.js';
 import adminSettingsRoutes from './routes/admin-settings.js';
+import adminSeoRoutes from './routes/admin-seo.js';
 import prutterRoutes from './routes/prutter.js';
 import audioRoutes from './routes/audio.js';
@@ -245,4 +246,5 @@
 app.use('/admin/comments', adminCommentsRoutes);
 app.use('/admin/settings', adminSettingsRoutes);
+app.use('/admin/seo', adminSeoRoutes);
 app.use('/admin/circle', adminCircleRoutes);
 app.use('/admin/updates', adminUpdatesRoutes);
Index: src/views/pages/admin-seo.ejs
===================================================================
--- src/views/pages/admin-seo.ejs	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
+++ src/views/pages/admin-seo.ejs	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
@@ -0,0 +1,104 @@
+<div class="container admin-site-edit-page">
+  <p><a href="/admin" class="btn">&larr; Beheer</a></p>
+  <h1>SEO &amp; vindbaarheid</h1>
+  <p class="admin-tagline">Geavanceerde SEO van <strong><%= site.title %></strong> — hoe je site in zoekmachines en bij het delen op social media verschijnt.</p>
+
+  <% if (typeof success !== 'undefined' && success) { %><div class="audio-flash audio-flash--ok"><%= success %></div><% } %>
+  <% if (typeof error !== 'undefined' && error) { %><div class="audio-flash audio-flash--err"><%= error %></div><% } %>
+
+  <form method="post" action="/admin/seo" class="site-form">
+
+    <fieldset>
+      <legend>Indexeren</legend>
+      <label class="checkbox-row">
+        <input type="checkbox" name="robots_index" value="1" <%= site.robots_index ? 'checked' : '' %>>
+        <span>Zoekmachines mogen deze site indexeren <small class="form-hint-inline">— uit = <code>noindex</code> + sitemap.xml verborgen</small></span>
+      </label>
+    </fieldset>
+
+    <fieldset>
+      <legend>Titel &amp; omschrijving</legend>
+      <label>
+        <span>Titel-sjabloon <small class="form-hint-inline">— gebruik <code>{title}</code> en <code>{site}</code></small></span>
+        <input type="text" name="title_template" value="<%= site.title_template || '{title} — {site}' %>" maxlength="200" placeholder="{title} — {site}">
+      </label>
+      <label>
+        <span>Standaard-omschrijving <small class="form-hint-inline">— meta description / og:description als een pagina er geen heeft</small></span>
+        <textarea name="default_description" rows="2" maxlength="500" placeholder="Korte omschrijving van je site (max ~160 tekens werkt het best)"><%= site.default_description || '' %></textarea>
+      </label>
+      <label>
+        <span>Canonieke basis-URL <small class="form-hint-inline">— de productie-HTTPS-URL, voorkomt dubbele-content-straf</small></span>
+        <input type="text" name="canonical" value="<%= site.canonical || '' %>" placeholder="https://jouw-domein.com" maxlength="200">
+      </label>
+      <label>
+        <span>Auteur <small class="form-hint-inline">— meta author-tag</small></span>
+        <input type="text" name="author" value="<%= site.author || '' %>" maxlength="120" placeholder="Jouw naam">
+      </label>
+    </fieldset>
+
+    <fieldset>
+      <legend>Delen op social media</legend>
+      <label>
+        <span>Standaard deel-afbeelding (URL) <small class="form-hint-inline">— og:image / Twitter-card; ~1200×630px</small></span>
+        <input type="text" name="og_image_default" value="<%= site.og_image_default || '' %>" placeholder="https://jouw-domein.com/share.jpg" maxlength="500">
+      </label>
+      <label>
+        <span>Taal-locale <small class="form-hint-inline">— og:locale, bv. <code>nl_NL</code> of <code>en_US</code></small></span>
+        <input type="text" name="og_locale" value="<%= site.og_locale || '' %>" placeholder="nl_NL" maxlength="32">
+      </label>
+      <label>
+        <span>Twitter / X-handle <small class="form-hint-inline">— met @</small></span>
+        <input type="text" name="twitter" value="<%= site.twitter || '' %>" placeholder="@jouwnaam" maxlength="64">
+      </label>
+      <label>
+        <span>Facebook App-ID <small class="form-hint-inline">— fb:app_id (optioneel)</small></span>
+        <input type="text" name="facebook_app_id" value="<%= site.facebook_app_id || '' %>" maxlength="64">
+      </label>
+    </fieldset>
+
+    <fieldset>
+      <legend>Uitgever (JSON-LD / rich results)</legend>
+      <label>
+        <span>Type</span>
+        <select name="schema_type">
+          <option value="Person" <%= site.schema_type === 'Organization' ? '' : 'selected' %>>Persoon</option>
+          <option value="Organization" <%= site.schema_type === 'Organization' ? 'selected' : '' %>>Organisatie / bedrijf</option>
+        </select>
+      </label>
+      <label>
+        <span>Naam <small class="form-hint-inline">— valt terug op de site-titel</small></span>
+        <input type="text" name="publisher_name" value="<%= site.publisher_name || '' %>" maxlength="200">
+      </label>
+      <label>
+        <span>URL</span>
+        <input type="text" name="publisher_url" value="<%= site.publisher_url || '' %>" placeholder="https://jouw-domein.com" maxlength="200">
+      </label>
+      <label>
+        <span>Logo (URL)</span>
+        <input type="text" name="publisher_logo" value="<%= site.publisher_logo || '' %>" placeholder="https://jouw-domein.com/logo.png" maxlength="500">
+      </label>
+    </fieldset>
+
+    <fieldset>
+      <legend>Zoekmachine-verificatie</legend>
+      <label>
+        <span>Google site-verificatie</span>
+        <input type="text" name="google_verification" value="<%= site.google_verification || '' %>" maxlength="200">
+      </label>
+      <label>
+        <span>Bing <small class="form-hint-inline">— msvalidate.01</small></span>
+        <input type="text" name="bing_verification" value="<%= site.bing_verification || '' %>" maxlength="200">
+      </label>
+      <label>
+        <span>Pinterest <small class="form-hint-inline">— p:domain_verify</small></span>
+        <input type="text" name="pinterest_verification" value="<%= site.pinterest_verification || '' %>" maxlength="200">
+      </label>
+      <label>
+        <span>Yandex</span>
+        <input type="text" name="yandex_verification" value="<%= site.yandex_verification || '' %>" maxlength="200">
+      </label>
+    </fieldset>
+
+    <button type="submit" class="btn btn-primary">SEO opslaan</button>
+  </form>
+</div>
Index: src/views/pages/admin-site-edit.ejs
===================================================================
--- src/views/pages/admin-site-edit.ejs	(revision 0dbb5c14a391c55db20fd75acf91c9876095ea7e)
+++ src/views/pages/admin-site-edit.ejs	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
@@ -226,37 +226,8 @@
     </fieldset>
 
-    <fieldset>
+    <fieldset class="seo-pointer">
       <legend>SEO &amp; social</legend>
-      <label>
-        <span>Titel-sjabloon (gebruik {title} en {site})</span>
-        <input type="text" name="title_template" value="<%= site.title_template || '{title} — {site}' %>" maxlength="200">
-      </label>
-      <label>
-        <span>Canonieke basis-URL (voor productie-HTTPS)</span>
-        <input type="text" name="canonical" value="<%= site.canonical || '' %>" placeholder="https://jouw-domein.com">
-      </label>
-      <label>
-        <span>Twitter / X-handle (met @)</span>
-        <input type="text" name="twitter" value="<%= site.twitter || '' %>" placeholder="@jouwnaam" maxlength="64">
-      </label>
-      <details>
-        <summary>Zoekmachine-verificatie</summary>
-        <label>
-          <span>Google site-verificatie</span>
-          <input type="text" name="google_verification"    value="<%= site.google_verification    || '' %>" maxlength="200">
-        </label>
-        <label>
-          <span>Bing (msvalidate.01)</span>
-          <input type="text" name="bing_verification"      value="<%= site.bing_verification      || '' %>" maxlength="200">
-        </label>
-        <label>
-          <span>Pinterest (p:domain_verify)</span>
-          <input type="text" name="pinterest_verification" value="<%= site.pinterest_verification || '' %>" maxlength="200">
-        </label>
-        <label>
-          <span>Yandex</span>
-          <input type="text" name="yandex_verification"    value="<%= site.yandex_verification    || '' %>" maxlength="200">
-        </label>
-      </details>
+      <p>Titel-sjabloon, canonical, deel-afbeelding, verificatie-metas en meer staan
+        nu op een eigen pagina: <a href="/admin/seo">🔎 SEO &amp; vindbaarheid</a>.</p>
     </fieldset>
 
Index: src/views/pages/admin.ejs
===================================================================
--- src/views/pages/admin.ejs	(revision 0dbb5c14a391c55db20fd75acf91c9876095ea7e)
+++ src/views/pages/admin.ejs	(revision 662345333cce064d12731d86e9a2ede2f4b6805c)
@@ -14,4 +14,5 @@
       <a href="/admin/playlists" class="btn">📃 Playlists</a>
       <a href="/admin/comments" class="btn">💬 Reacties</a>
+      <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
       <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
     <% } else { %>
@@ -27,4 +28,5 @@
         <a href="/admin/circle" class="btn">🔗 Cirkel</a>
       <% } %>
+      <% if (primarySite) { %><a href="/admin/seo" class="btn">🔎 SEO</a><% } %>
       <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
     <% } %>
