Index: src/assets/js/mod/admin-seo.js
===================================================================
--- src/assets/js/mod/admin-seo.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
+++ src/assets/js/mod/admin-seo.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -0,0 +1,115 @@
+// De SEO-pagina: op dit moment alleen het MusicBrainz-paneel (shaer-mbz).
+//
+// De rest van dit scherm is gewone formuliervelden en heeft geen JavaScript
+// nodig; deze module bestaat omdat opzoeken dat wel doet.
+
+import { pageData, makeSweeper } from './lib.js';
+
+const doc = makeSweeper();
+let T = {};
+
+export function init() {
+  doc.sweep();
+  T = pageData();
+  run();
+}
+
+function run() {
+  // Binnen run() en niet op moduleniveau: deze modules krijgen bij elke
+  // paginawissel opnieuw init(), en een blok dat maar een keer per sessie
+  // draait is precies wat shaer-5s1 opleverde.
+  wireMusicBrainz();
+}
+
+/**
+ * "Zoek jezelf op" in MusicBrainz.
+ *
+ * De kandidaten komen van de server, want MusicBrainz eist een verzoek per
+ * seconde per APPLICATIE en een User-Agent met contact -- allebei niet vanuit
+ * een browser af te dwingen.
+ *
+ * WIJ KIEZEN NIET. Ook niet als er precies een treffer is: een verkeerd geraden
+ * MBID zet jouw naam onder andermans werk. De knop staat er, de klik is van de
+ * artiest. En de keuze gaat mee met de Opslaan van de pagina -- een eigen
+ * formulier kan hier niet, want deze pagina IS er een.
+ */
+function wireMusicBrainz() {
+  const knop = document.getElementById('mb-zoek-btn');
+  const veld = document.getElementById('mb-q');
+  const uit = document.getElementById('mb-uit');
+  const idVeld = document.getElementById('mb-id');
+  const naamVeld = document.getElementById('mb-naam');
+  const huidig = document.getElementById('mb-huidig');
+  if (!knop || !veld || !uit || !idVeld || knop.__wired) return;
+  knop.__wired = true;
+
+  const el = (tag, cls, tekst) => {
+    const e = document.createElement(tag);
+    if (cls) e.className = cls;
+    // textContent en nooit innerHTML: dit is tekst uit een vreemd register.
+    if (tekst != null) e.textContent = tekst;
+    return e;
+  };
+
+  function zet(mbid, naam) {
+    idVeld.value = mbid || '';
+    if (naamVeld) naamVeld.value = naam || '';
+    if (huidig) {
+      huidig.hidden = !mbid;
+      const n = document.getElementById('mb-huidig-naam');
+      const a = document.getElementById('mb-huidig-link');
+      if (n) n.textContent = naam || mbid || '';
+      if (a) a.href = mbid ? `https://musicbrainz.org/artist/${mbid}` : '#';
+    }
+    uit.hidden = true;
+    uit.replaceChildren();
+  }
+
+  const wis = document.getElementById('mb-wis');
+  if (wis) wis.addEventListener('click', () => zet('', ''));
+
+  async function zoek() {
+    const q = (veld.value || '').trim();
+    if (!q) return;
+    uit.hidden = false;
+    uit.replaceChildren(el('p', 'form-hint', T.aseo_mb_busy || 'Zoeken…'));
+    knop.disabled = true;
+    try {
+      const r = await fetch(`/admin/seo/api/musicbrainz?q=${encodeURIComponent(q)}`, { credentials: 'same-origin' });
+      const j = await r.json();
+      toon((j && j.kandidaten) || []);
+    } catch {
+      uit.replaceChildren(el('p', 'form-hint', T.aseo_mb_fail || 'MusicBrainz is even niet bereikbaar.'));
+    } finally {
+      knop.disabled = false;
+    }
+  }
+
+  function toon(kandidaten) {
+    if (!kandidaten.length) {
+      uit.replaceChildren(el('p', 'form-hint', T.aseo_mb_none || 'Niets gevonden.'));
+      return;
+    }
+    const lijst = el('ul', 'mb-lijst');
+    for (const k of kandidaten) {
+      const li = el('li', 'mb-kandidaat');
+      li.appendChild(el('strong', null, k.naam));
+      // De toelichting is het hele punt: er zijn drie bands die Nirvana heten,
+      // en zonder dit veld kiest iemand de verkeerde.
+      const bij = [k.toelichting, k.soort, k.land, k.jaren].filter(Boolean).join(' · ');
+      if (bij) li.appendChild(el('small', 'mb-bij', bij));
+      const open = el('a', 'mb-open', T.aseo_mb_open || 'Bekijk op MusicBrainz');
+      open.href = k.url; open.target = '_blank'; open.rel = 'noopener';
+      li.appendChild(open);
+      const b = el('button', 'btn', T.aseo_mb_pick || 'Dit ben ik');
+      b.type = 'button';
+      b.addEventListener('click', () => zet(k.mbid, k.naam));
+      li.appendChild(b);
+      lijst.appendChild(li);
+    }
+    uit.replaceChildren(lijst);
+  }
+
+  knop.addEventListener('click', zoek);
+  veld.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); zoek(); } });
+}
Index: src/assets/js/mod/admin-site-edit.js
===================================================================
--- src/assets/js/mod/admin-site-edit.js	(revision f59a46cef840d0f6005427b2265304d01d519292)
+++ src/assets/js/mod/admin-site-edit.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -135,98 +135,3 @@
 })();
 
-  // MusicBrainz-paneel (shaer-mbz). Binnen run(), niet op moduleniveau: deze
-  // modules krijgen bij elke paginawissel opnieuw init(), en een blok dat maar
-  // een keer per sessie draait is precies wat shaer-5s1 opleverde.
-  wireMusicBrainz();
 }
-
-// ── MusicBrainz: ben jij dit? (shaer-mbz) ─────────────────────────
-//
-// De kandidaten komen van de server, want MusicBrainz eist een verzoek per
-// seconde per APPLICATIE en een User-Agent met contact -- allebei niet vanuit
-// een browser af te dwingen.
-//
-// WIJ KIEZEN NIET. Ook niet als er precies een treffer is: een verkeerd geraden
-// MBID zet jouw naam onder andermans werk. De knop staat er, de klik is van de
-// artiest. En de keuze gaat mee met de Opslaan-knop van de pagina -- een eigen
-// formulier kan hier niet, want deze pagina IS er een.
-function wireMusicBrainz() {
-  const knop = document.getElementById('mb-zoek-btn');
-  const veld = document.getElementById('mb-q');
-  const uit = document.getElementById('mb-uit');
-  const idVeld = document.getElementById('mb-id');
-  const naamVeld = document.getElementById('mb-naam');
-  const huidig = document.getElementById('mb-huidig');
-  if (!knop || !veld || !uit || !idVeld || knop.__wired) return;
-  knop.__wired = true;
-
-  const el = (tag, cls, tekst) => {
-    const e = document.createElement(tag);
-    if (cls) e.className = cls;
-    // textContent en nooit innerHTML: dit is tekst uit een vreemd register.
-    if (tekst != null) e.textContent = tekst;
-    return e;
-  };
-
-  function zet(mbid, naam) {
-    idVeld.value = mbid || '';
-    naamVeld.value = naam || '';
-    if (huidig) {
-      huidig.hidden = !mbid;
-      const n = document.getElementById('mb-huidig-naam');
-      const a = document.getElementById('mb-huidig-link');
-      if (n) n.textContent = naam || mbid || '';
-      if (a) a.href = mbid ? `https://musicbrainz.org/artist/${mbid}` : '#';
-    }
-    uit.hidden = true;
-    uit.replaceChildren();
-  }
-
-  const wis = document.getElementById('mb-wis');
-  if (wis) wis.addEventListener('click', () => zet('', ''));
-
-  async function zoek() {
-    const q = (veld.value || '').trim();
-    if (!q) return;
-    uit.hidden = false;
-    uit.replaceChildren(el('p', 'form-hint', T.asite_mb_busy || 'Zoeken…'));
-    knop.disabled = true;
-    try {
-      const r = await fetch(`api/musicbrainz?q=${encodeURIComponent(q)}`, { credentials: 'same-origin' });
-      const j = await r.json();
-      toon((j && j.kandidaten) || []);
-    } catch {
-      uit.replaceChildren(el('p', 'form-hint', T.asite_mb_fail || 'MusicBrainz is even niet bereikbaar.'));
-    } finally {
-      knop.disabled = false;
-    }
-  }
-
-  function toon(kandidaten) {
-    if (!kandidaten.length) {
-      uit.replaceChildren(el('p', 'form-hint', T.asite_mb_none || 'Niets gevonden.'));
-      return;
-    }
-    const lijst = el('ul', 'mb-lijst');
-    for (const k of kandidaten) {
-      const li = el('li', 'mb-kandidaat');
-      li.appendChild(el('strong', null, k.naam));
-      // De toelichting is het hele punt: er zijn drie bands die Nirvana heten,
-      // en zonder dit veld kiest iemand de verkeerde.
-      const bij = [k.toelichting, k.soort, k.land, k.jaren].filter(Boolean).join(' · ');
-      if (bij) li.appendChild(el('small', 'mb-bij', bij));
-      const open = el('a', 'mb-open', T.asite_mb_open || 'Bekijk op MusicBrainz');
-      open.href = k.url; open.target = '_blank'; open.rel = 'noopener';
-      li.appendChild(open);
-      const b = el('button', 'btn', T.asite_mb_pick || 'Dit ben ik');
-      b.type = 'button';
-      b.addEventListener('click', () => zet(k.mbid, k.naam));
-      li.appendChild(b);
-      lijst.appendChild(li);
-    }
-    uit.replaceChildren(lijst);
-  }
-
-  knop.addEventListener('click', zoek);
-  veld.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); zoek(); } });
-}
Index: src/routes/admin-seo.js
===================================================================
--- src/routes/admin-seo.js	(revision f59a46cef840d0f6005427b2265304d01d519292)
+++ src/routes/admin-seo.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -19,4 +19,6 @@
 import { requireGod } from '../middleware/auth.js';
 import { getPrimarySite } from '../middleware/site.js';
+import { isMbid } from '../services/ap-core.js';
+import MusicBrainz from '../services/MusicBrainzService.js';
 
 const router = express.Router();
@@ -37,4 +39,5 @@
   renderPage(req, res, 'pages/admin-seo', {
     pageTitleKey: 'admin.t_seo',
+    pageJs: 'admin-seo',
     bodyClass: 'on-admin',
     site,
@@ -42,4 +45,22 @@
     error: req.query.error || null,
   });
+});
+
+/**
+ * "Zoek jezelf op" -- kandidaten uit MusicBrainz (shaer-mbz).
+ *
+ * De zoekopdracht draait HIER en niet in de browser: MusicBrainz staat een
+ * verzoek per seconde toe per APPLICATIE, en dat is alleen af te dwingen als
+ * alles langs een plek gaat. Bovendien eisen ze een User-Agent met contact, en
+ * die kan een browser niet zetten.
+ *
+ * Wij kiezen NIET. Ook niet als er precies een treffer is: een verkeerd geraden
+ * MBID zet jouw naam onder andermans werk.
+ */
+router.get('/api/musicbrainz', requireGod, async (req, res) => {
+  const site = getPrimarySite(req);
+  const q = String(req.query.q || (site && (site.publisher_name || site.title)) || '').trim();
+  if (!q) return res.json({ ok: true, q: '', kandidaten: [] });
+  res.json({ ok: true, q, kandidaten: await MusicBrainz.zoekArtiesten(q) });
 });
 
@@ -72,6 +93,14 @@
       publisher_url = ?,
       publisher_logo = ?,
+      mb_artist_id = ?, mb_artist_name = ?,
       updated_at = CURRENT_TIMESTAMP
     WHERE id = ?
+  // De MusicBrainz-koppeling (shaer-mbz). Alleen een echte MBID komt de kolom
+  // in: zonder deze zeef sluipt er een URL of een handle in het veld dat naar
+  // buiten gaat, en het gaat naar TWEE uitgangen -- de JSON-LD en de actor.
+  // Leeg is een geldige keuze; dat is ontkoppelen.
+  const mbRuw = String(f.mb_artist_id || '').trim().toLowerCase();
+  const mbArtistId = isMbid(mbRuw) ? mbRuw : null;
+
   `).run(
     f.robots_index ? 1 : 0,
@@ -93,4 +122,6 @@
     trimOrNull(f.publisher_url, 200),
     trimOrNull(f.publisher_logo, 500),
+    mbArtistId,
+    mbArtistId ? (String(f.mb_artist_name || '').trim().slice(0, 200) || null) : null,
     primary.id,
   );
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision f59a46cef840d0f6005427b2265304d01d519292)
+++ src/routes/admin-sites.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -27,5 +27,4 @@
 import { mediaDir } from '../config/paths.js';
 import AP from '../services/ActivityPubService.js';
-import MusicBrainz from '../services/MusicBrainzService.js';
 
 
@@ -323,23 +322,4 @@
 
 // ==================== SAVE ====================
-/**
- * "Ben jij dit?" -- kandidaten uit MusicBrainz (shaer-mbz).
- *
- * De zoekopdracht draait HIER en niet in de browser: MusicBrainz staat een
- * verzoek per seconde toe per APPLICATIE, en dat is alleen af te dwingen als
- * alles langs een plek gaat. Bovendien eisen ze een User-Agent met contact, en
- * die kan een browser niet zetten.
- *
- * Wij kiezen NIET. Ook niet als er precies een treffer is: een verkeerd geraden
- * MBID zet jouw naam onder andermans werk.
- */
-router.get('/:slug/api/musicbrainz', requireSiteManagerBySlug, async (req, res) => {
-  const site = db.prepare('SELECT title, mb_artist_id, mb_artist_name FROM sites WHERE slug = ?').get(req.params.slug);
-  if (!site) return res.status(404).json({ error: 'no_site' });
-  const q = String(req.query.q || site.title || '').trim();
-  if (!q) return res.json({ ok: true, q: '', kandidaten: [] });
-  res.json({ ok: true, q, kandidaten: await MusicBrainz.zoekArtiesten(q) });
-});
-
 router.post('/:slug/save', requireSiteManagerBySlug, async (req, res) => {
   const site = db.prepare('SELECT id, ap_aliases FROM sites WHERE slug = ?').get(req.params.slug);
@@ -366,10 +346,4 @@
   // accent: only accept colors from the curated ACCENTS list. Falls back to
   // the orange default if the submitted value isn't recognised.
-  // De MusicBrainz-koppeling (shaer-mbz). Alleen een echte MBID komt de kolom
-  // in: zonder deze zeef sluipt er een hele URL of een handle in het veld dat
-  // straks naar buiten gaat. Leeg is een geldige keuze -- dat is ontkoppelen.
-  const mbRuw = String(f.mb_artist_id || '').trim().toLowerCase();
-  const mbArtistId = MusicBrainz.isMbid(mbRuw) ? mbRuw : null;
-
   const accent = ThemeService.validateAccent(f.accent) || '#e8b04b';
 
@@ -381,5 +355,4 @@
       profile_links = ?,
       ap_aliases = ?,
-      mb_artist_id = ?, mb_artist_name = ?,
       is_public = ?, robots_index = ?, require_login_to_comment = ?,
       enable_audio_player = ?,
@@ -401,6 +374,4 @@
     profileLinksJson,
     apAliasesJson,
-    mbArtistId,
-    mbArtistId ? (String(f.mb_artist_name || '').trim().slice(0, 200) || null) : null,
     f.is_public ? 1 : 0,
     f.robots_index ? 1 : 0,
Index: src/services/i18n.js
===================================================================
--- src/services/i18n.js	(revision f59a46cef840d0f6005427b2265304d01d519292)
+++ src/services/i18n.js	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -360,15 +360,17 @@
     'aaud.fedi_off': 'Niet op de fediverse gedeeld (alleen webspeler, bestand verborgen) — klik om te delen',
     'aaud.embed_player': 'Embedbare speler',
-    'asite.mb_title': 'Ben jij dit in MusicBrainz?',
-    'asite.mb_hint': 'MusicBrainz is het open register waar muziekdiensten je aan herkennen. Zoek jezelf op en kies je eigen pagina — dan weten anderen dat jouw muziek van jou is.',
-    'asite.mb_search': 'Zoeken',
-    'asite.mb_placeholder': 'Je artiestennaam',
-    'asite.mb_none': 'Niets gevonden. Sta je er nog niet in? Dan kun je jezelf aanmelden op musicbrainz.org — dat kan alleen daar, niet vanuit Klonkt.',
-    'asite.mb_pick': 'Dit ben ik',
-    'asite.mb_linked': 'Gekoppeld aan',
-    'asite.mb_unlink': 'Ontkoppelen',
-    'asite.mb_open': 'Bekijk op MusicBrainz',
-    'asite.mb_busy': 'Zoeken…',
-    'asite.mb_fail': 'MusicBrainz is even niet bereikbaar.',
+    'aseo.mb_legend': 'MusicBrainz (dezelfde artiest elders)',
+    'aseo.mb_search_label': 'Zoek jezelf op',
+    'aseo.mb_search_hint': 'de naam waaronder je muziek uitbrengt',
+    'aseo.mb_hint': 'MusicBrainz is het open register van de muziekwereld. Koppel je eigen pagina en je komt als sameAs in de JSON-LD van deze site én in je fediverse-profiel te staan — zo weten zoekmachines en muziekdiensten dat jouw muziek van jou is. Je verandert er niets mee bij MusicBrainz zelf; we verwijzen er alleen naar.',
+    'aseo.mb_search': 'Zoeken',
+    'aseo.mb_placeholder': 'Je artiestennaam',
+    'aseo.mb_none': 'Niets gevonden. Sta je er nog niet in? Dan kun je jezelf aanmelden op musicbrainz.org — dat kan alleen daar, niet vanuit Klonkt.',
+    'aseo.mb_pick': 'Dit ben ik',
+    'aseo.mb_linked': 'Gekoppeld aan',
+    'aseo.mb_unlink': 'Ontkoppelen',
+    'aseo.mb_open': 'Bekijk op MusicBrainz',
+    'aseo.mb_busy': 'Zoeken…',
+    'aseo.mb_fail': 'MusicBrainz is even niet bereikbaar.',
     'aaud.embed_hint': 'Plak deze code op je eigen website/blog om je muziek met deze speler in te sluiten:',
     'aaud.preview_player': 'Speler-voorbeeld openen',
@@ -1318,15 +1320,17 @@
     'aaud.fedi_off': 'Not shared on the fediverse (web player only, file hidden) — click to share',
     'aaud.embed_player': 'Embeddable player',
-    'asite.mb_title': 'Is this you on MusicBrainz?',
-    'asite.mb_hint': 'MusicBrainz is the open register music services recognise you by. Look yourself up and pick your own page — then others know your music is yours.',
-    'asite.mb_search': 'Search',
-    'asite.mb_placeholder': 'Your artist name',
-    'asite.mb_none': 'Nothing found. Not in there yet? You can add yourself on musicbrainz.org — that can only be done there, not from Klonkt.',
-    'asite.mb_pick': 'This is me',
-    'asite.mb_linked': 'Linked to',
-    'asite.mb_unlink': 'Unlink',
-    'asite.mb_open': 'View on MusicBrainz',
-    'asite.mb_busy': 'Searching…',
-    'asite.mb_fail': 'MusicBrainz is unreachable right now.',
+    'aseo.mb_legend': 'MusicBrainz (the same artist elsewhere)',
+    'aseo.mb_search_label': 'Look yourself up',
+    'aseo.mb_search_hint': 'the name you release music under',
+    'aseo.mb_hint': 'MusicBrainz is the music world\u2019s open register. Link your own page and it appears as sameAs in this site\u2019s JSON-LD and in your fediverse profile — so search engines and music services know your music is yours. It changes nothing at MusicBrainz itself; we only point at it.',
+    'aseo.mb_search': 'Search',
+    'aseo.mb_placeholder': 'Your artist name',
+    'aseo.mb_none': 'Nothing found. Not in there yet? You can add yourself on musicbrainz.org — that can only be done there, not from Klonkt.',
+    'aseo.mb_pick': 'This is me',
+    'aseo.mb_linked': 'Linked to',
+    'aseo.mb_unlink': 'Unlink',
+    'aseo.mb_open': 'View on MusicBrainz',
+    'aseo.mb_busy': 'Searching…',
+    'aseo.mb_fail': 'MusicBrainz is unreachable right now.',
     'aaud.embed_hint': 'Paste this code on your own website/blog to embed your music with this player:',
     'aaud.preview_player': 'Open player preview',
@@ -2275,15 +2279,17 @@
     'aaud.fedi_off': 'Nicht im Fediverse geteilt (nur Web-Player, Datei verborgen) — zum Teilen klicken',
     'aaud.embed_player': 'Einbettbarer Player',
-    'asite.mb_title': 'Bist das du bei MusicBrainz?',
-    'asite.mb_hint': 'MusicBrainz ist das offene Register, an dem Musikdienste dich erkennen. Suche dich und wähle deine eigene Seite — dann wissen andere, dass deine Musik von dir ist.',
-    'asite.mb_search': 'Suchen',
-    'asite.mb_placeholder': 'Dein Künstlername',
-    'asite.mb_none': 'Nichts gefunden. Noch nicht dabei? Du kannst dich auf musicbrainz.org eintragen — das geht nur dort, nicht aus Klonkt heraus.',
-    'asite.mb_pick': 'Das bin ich',
-    'asite.mb_linked': 'Verknüpft mit',
-    'asite.mb_unlink': 'Trennen',
-    'asite.mb_open': 'Bei MusicBrainz ansehen',
-    'asite.mb_busy': 'Suche läuft…',
-    'asite.mb_fail': 'MusicBrainz ist gerade nicht erreichbar.',
+    'aseo.mb_legend': 'MusicBrainz (dieselbe Künstlerin anderswo)',
+    'aseo.mb_search_label': 'Dich selbst suchen',
+    'aseo.mb_search_hint': 'der Name, unter dem du Musik veröffentlichst',
+    'aseo.mb_hint': 'MusicBrainz ist das offene Register der Musikwelt. Verknüpfe deine Seite, und sie erscheint als sameAs im JSON-LD dieser Website und in deinem Fediverse-Profil — so wissen Suchmaschinen und Musikdienste, dass deine Musik von dir ist. Bei MusicBrainz selbst ändert sich nichts; wir verweisen nur darauf.',
+    'aseo.mb_search': 'Suchen',
+    'aseo.mb_placeholder': 'Dein Künstlername',
+    'aseo.mb_none': 'Nichts gefunden. Noch nicht dabei? Du kannst dich auf musicbrainz.org eintragen — das geht nur dort, nicht aus Klonkt heraus.',
+    'aseo.mb_pick': 'Das bin ich',
+    'aseo.mb_linked': 'Verknüpft mit',
+    'aseo.mb_unlink': 'Trennen',
+    'aseo.mb_open': 'Bei MusicBrainz ansehen',
+    'aseo.mb_busy': 'Suche läuft…',
+    'aseo.mb_fail': 'MusicBrainz ist gerade nicht erreichbar.',
     'aaud.embed_hint': 'Füge diesen Code auf deiner eigenen Website/deinem Blog ein, um deine Musik mit diesem Player einzubetten:',
     'aaud.preview_player': 'Player-Vorschau öffnen',
Index: src/views/pages/admin-seo.ejs
===================================================================
--- src/views/pages/admin-seo.ejs	(revision f59a46cef840d0f6005427b2265304d01d519292)
+++ src/views/pages/admin-seo.ejs	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -88,4 +88,35 @@
     </fieldset>
 
+    <%# ── MUSICBRAINZ ─────────────────────────────────────────────
+        Direct onder Uitgever, en dat is geen willekeur: sameAs IS een
+        schema.org-eigenschap, en dat blok hierboven is waar ons schema.org
+        vandaan komt. Een koppeling hier voedt twee uitgangen tegelijk -- de
+        JSON-LD van de pagina en het fediverse-profiel (shaer-mbz). %>
+    <fieldset id="mb-veld">
+      <legend><%= t('aseo.mb_legend') %></legend>
+      <p class="form-hint"><%= t('aseo.mb_hint') %></p>
+
+      <input type="hidden" name="mb_artist_id" id="mb-id" value="<%= site.mb_artist_id || '' %>">
+      <input type="hidden" name="mb_artist_name" id="mb-naam" value="<%= site.mb_artist_name || '' %>">
+
+      <p class="mb-huidig" id="mb-huidig" <%= site.mb_artist_id ? '' : 'hidden' %>>
+        <%= t('aseo.mb_linked') %>
+        <strong id="mb-huidig-naam"><%= site.mb_artist_name || site.mb_artist_id || '' %></strong>
+        <a id="mb-huidig-link" target="_blank" rel="noopener"
+           href="https://musicbrainz.org/artist/<%= site.mb_artist_id || '' %>"><%= t('aseo.mb_open') %></a>
+        <button type="button" class="btn" id="mb-wis"><%= t('aseo.mb_unlink') %></button>
+      </p>
+
+      <label>
+        <span><%= t('aseo.mb_search_label') %> <small class="form-hint-inline">— <%= t('aseo.mb_search_hint') %></small></span>
+        <div class="mb-zoek">
+          <input type="text" id="mb-q" value="<%= site.publisher_name || site.title || '' %>"
+                 autocomplete="off" placeholder="<%= t('aseo.mb_placeholder') %>">
+          <button type="button" class="btn" id="mb-zoek-btn"><%= t('aseo.mb_search') %></button>
+        </div>
+      </label>
+      <div id="mb-uit" class="mb-uit" hidden></div>
+    </fieldset>
+
     <fieldset>
       <legend><%= t('aseo.verify_legend') %></legend>
Index: src/views/pages/admin-site-edit.ejs
===================================================================
--- src/views/pages/admin-site-edit.ejs	(revision f59a46cef840d0f6005427b2265304d01d519292)
+++ src/views/pages/admin-site-edit.ejs	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -190,36 +190,4 @@
     </fieldset>
 
-    <%# ── MUSICBRAINZ ─────────────────────────────────────────────
-        Naast de aliassen, want het is dezelfde vraag: wie ben jij elders?
-        Een MBID is geen vocabulaire maar een register -- eraan koppelen is als
-        je ISBN noemen, en muziekdiensten herkennen je eraan zonder dat wij hun
-        model hoeven over te nemen (shaer-mbz).
-
-        GEEN EIGEN FORMULIER: deze pagina IS er een, en een formulier in een
-        formulier bestaat niet in HTML. De keuze zet een verborgen veld en gaat
-        mee met de Opslaan-knop van de pagina, net als de profielfoto. %>
-    <fieldset id="mb-veld">
-      <legend><%= t('asite.mb_title') %></legend>
-      <p class="form-hint"><%= t('asite.mb_hint') %></p>
-
-      <input type="hidden" name="mb_artist_id" id="mb-id" value="<%= site.mb_artist_id || '' %>">
-      <input type="hidden" name="mb_artist_name" id="mb-naam" value="<%= site.mb_artist_name || '' %>">
-
-      <p class="mb-huidig" id="mb-huidig" <%= site.mb_artist_id ? '' : 'hidden' %>>
-        <%= t('asite.mb_linked') %>
-        <strong id="mb-huidig-naam"><%= site.mb_artist_name || site.mb_artist_id || '' %></strong>
-        <a id="mb-huidig-link" target="_blank" rel="noopener"
-           href="https://musicbrainz.org/artist/<%= site.mb_artist_id || '' %>"><%= t('asite.mb_open') %></a>
-        <button type="button" class="btn" id="mb-wis"><%= t('asite.mb_unlink') %></button>
-      </p>
-
-      <div class="mb-zoek">
-        <input type="text" id="mb-q" value="<%= site.title || '' %>" autocomplete="off"
-               placeholder="<%= t('asite.mb_placeholder') %>">
-        <button type="button" class="btn" id="mb-zoek-btn"><%= t('asite.mb_search') %></button>
-      </div>
-      <div id="mb-uit" class="mb-uit" hidden></div>
-    </fieldset>
-
     <fieldset>
       <legend><%= t('asite.feed_view') %></legend>
Index: src/views/shell.ejs
===================================================================
--- src/views/shell.ejs	(revision f59a46cef840d0f6005427b2265304d01d519292)
+++ src/views/shell.ejs	(revision 013e16c6f24f30b8d59a5c851a20e0d9a6ddef6b)
@@ -90,4 +90,10 @@
 if (safeSite.publisher_logo) {
   _publisher.logo = { '@type': 'ImageObject', url: safeSite.publisher_logo };
+}
+// Dezelfde koppeling die de fediverse-actor draagt, hier in de JSON-LD
+// (shaer-mbz). sameAs is schema.org-eigen, dus dit is geen extra vocabulaire --
+// het is hetzelfde feit, verteld aan de andere lezer.
+if (safeSite.mb_artist_id) {
+  _publisher.sameAs = 'https://musicbrainz.org/artist/' + safeSite.mb_artist_id;
 }
 let _jsonLd = null;
