Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/config/database.js	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -50,4 +50,17 @@
   ensureColumn('sites', 'allow_circle', 'INTEGER DEFAULT 1');
 
+  // Eén EXPLICIETE primaire/hoofd-site (= de bedrijfs-/labelsite in hub-modus,
+  // de enige site in solo) i.p.v. de fragiele "oudste = hoofd"-conventie die op
+  // 4 plekken gedupliceerd stond. Backfill: markeer de oudste als er nog geen
+  // primaire site is, zodat bestaand gedrag exact behouden blijft.
+  ensureColumn('sites', 'is_primary', 'INTEGER DEFAULT 0');
+  try {
+    const hasPrimary = db.prepare('SELECT 1 FROM sites WHERE is_primary = 1 LIMIT 1').get();
+    if (!hasPrimary) {
+      const oldest = db.prepare('SELECT id FROM sites ORDER BY created_at ASC LIMIT 1').get();
+      if (oldest) db.prepare('UPDATE sites SET is_primary = 1 WHERE id = ?').run(oldest.id);
+    }
+  } catch (e) { /* sites-tabel nog leeg/afwezig bij verse init — ensurePrimarySite regelt 't */ }
+
   // v9 audit additions —————————————————————————————————————————
   // SEO/social columns the v9 template uses (most live in 001-init.sql already
Index: src/middleware/site.js
===================================================================
--- src/middleware/site.js	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/middleware/site.js	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -12,4 +12,16 @@
 import db from '../config/database.js';
 import { getTenancy } from '../services/SettingsService.js';
+
+/**
+ * De primaire/hoofd-site — ÉÉN bron van waarheid (vervangt de "oudste site ="
+ * hoofd"-aanname die voorheen los in resolveSite/hub/account/admin stond).
+ * Leest de expliciete is_primary-vlag; valt terug op de oudste als die (nog)
+ * nergens staat, zodat bestaand gedrag exact behouden blijft.
+ */
+export function getPrimarySite() {
+  return db.prepare('SELECT * FROM sites WHERE is_primary = 1 LIMIT 1').get()
+      || db.prepare('SELECT * FROM sites ORDER BY created_at ASC LIMIT 1').get()
+      || null;
+}
 
 export function resolveSite(req, res, next) {
@@ -43,6 +55,6 @@
   }
 
-  // Solo (of hub zonder match): de primaire/owner-site (eerste aangemaakte).
-  const defaultSite = db.prepare('SELECT * FROM sites ORDER BY created_at ASC LIMIT 1').get();
+  // Solo (of hub zonder match): pin op de primaire/hoofd-site.
+  const defaultSite = getPrimarySite();
   if (defaultSite) {
     res.locals.site = defaultSite;
Index: src/routes/account.js
===================================================================
--- src/routes/account.js	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/routes/account.js	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -21,4 +21,5 @@
 import { v4 as uuid } from 'uuid';
 import db from '../config/database.js';
+import { getPrimarySite } from '../middleware/site.js';
 import { renderPage } from '../middleware/render.js';
 import { requireAuth } from '../middleware/auth.js';
@@ -80,5 +81,5 @@
   let site = db.prepare('SELECT id, title, tagline, slug, owner_id FROM sites WHERE owner_id = ? ORDER BY created_at LIMIT 1').get(user.id);
   if (!site && user.role === 'god') {
-    site = db.prepare('SELECT id, title, tagline, slug, owner_id FROM sites ORDER BY created_at LIMIT 1').get();
+    site = getPrimarySite(); // primaire/hoofd-site als fallback
   }
   return site || null;
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/routes/admin-sites.js	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -161,9 +161,9 @@
   const sites = db.prepare(`
     SELECT s.id, s.slug, s.title, s.description, s.created_at,
-           s.is_public, s.robots_index,
+           s.is_public, s.robots_index, s.is_primary,
            u.username AS owner_username,
            (SELECT COUNT(*) FROM posts WHERE site_id = s.id) AS post_count
     FROM sites s LEFT JOIN users u ON u.id = s.owner_id
-    ORDER BY s.created_at DESC
+    ORDER BY s.is_primary DESC, s.created_at DESC
   `).all();
 
@@ -354,4 +354,17 @@
 });
 
+// ==================== MAAK PRIMAIR ====================
+// God kiest welke site de primaire/hoofd-site is (de label-/bedrijfssite in hub;
+// in solo dé site). Precies één site is primair → eerst alles uit, dan deze aan.
+router.post('/:slug/make-primary', requireGod, (req, res) => {
+  const site = db.prepare('SELECT id FROM sites WHERE slug = ?').get(req.params.slug);
+  if (!site) return res.redirect('/admin/sites?error=Niet+gevonden');
+  db.transaction(() => {
+    db.prepare('UPDATE sites SET is_primary = 0').run();
+    db.prepare('UPDATE sites SET is_primary = 1 WHERE id = ?').run(site.id);
+  })();
+  res.redirect('/admin/sites?success=' + encodeURIComponent('Primaire site bijgewerkt'));
+});
+
 // ==================== DELETE ====================
 router.post('/:slug/delete', requireGod, (req, res) => {
Index: src/routes/admin.js
===================================================================
--- src/routes/admin.js	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/routes/admin.js	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -10,4 +10,5 @@
 import { requireAuth } from '../middleware/auth.js';
 import { getTenancy } from '../services/SettingsService.js';
+import { getPrimarySite } from '../middleware/site.js';
 
 const router = express.Router();
@@ -59,9 +60,7 @@
   const tenancy = getTenancy();
 
-  // De primaire/owner-site — in solo dé site, in hub de hoofdsite. Geeft de
+  // De primaire/hoofd-site — in solo dé site, in hub de hoofdsite. Geeft de
   // "Uiterlijk"-tegel z'n edit-link + de posts/concepten-lijst.
-  const primarySite = db.prepare(
-    'SELECT id, slug, title FROM sites ORDER BY created_at ASC LIMIT 1'
-  ).get() || null;
+  const primarySite = getPrimarySite();
 
   const stats = {
Index: src/routes/hub.js
===================================================================
--- src/routes/hub.js	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/routes/hub.js	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -35,6 +35,6 @@
   `).all();
 
-  // De hoofd-/labelsite (oudste = de bedrijfs-/hoofdaccount) is GEEN artiest;
-  // die tonen we apart bovenaan, niet in de Artiesten-roster.
+  // De hoofd-/labelsite (de expliciet primaire = de bedrijfs-/hoofdaccount) is
+  // GEEN artiest; die tonen we apart bovenaan, niet in de Artiesten-roster.
   const mainSite = db.prepare(`
     SELECT s.id, s.slug, s.title, s.tagline, s.profile_photo, s.accent,
@@ -43,5 +43,5 @@
     FROM sites s
     LEFT JOIN users u ON u.id = s.owner_id
-    ORDER BY s.created_at ASC
+    WHERE s.is_primary = 1
     LIMIT 1
   `).get() || null;
Index: src/services/ensurePrimarySite.js
===================================================================
--- src/services/ensurePrimarySite.js	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/services/ensurePrimarySite.js	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -40,6 +40,6 @@
       language, palette, accent, profile_photo,
       is_public, robots_index, require_login_to_comment, enable_audio_player,
-      feed_view_default, comments_moderation_mode
-    ) VALUES (?, ?, ?, '', '', ?, 'nl', 'sage', '#c2410c', NULL, 1, 1, 0, 1, 'grid', 'moderate')
+      feed_view_default, comments_moderation_mode, is_primary
+    ) VALUES (?, ?, ?, '', '', ?, 'nl', 'sage', '#c2410c', NULL, 1, 1, 0, 1, 'grid', 'moderate', 1)
   `).run(siteId, slug, defaultTitle(), owner.id);
 
Index: src/views/pages/admin-sites.ejs
===================================================================
--- src/views/pages/admin-sites.ejs	(revision 98ecf51d81042b5773ac053aa13dfc773dbdf4e9)
+++ src/views/pages/admin-sites.ejs	(revision 7881080819a21d5ba5da32d94ef51da0d866eea0)
@@ -36,4 +36,7 @@
               <div class="ax-site-name">
                 <a href="/sites/<%= s.slug %>"><%= s.title %></a>
+                <% if (s.is_primary) { %>
+                  <span class="ax-pill ax-pill-primary" title="Hoofd-/labelsite van deze installatie">★ primair</span>
+                <% } %>
                 <% if (s.is_public) { %>
                   <span class="ax-pill ax-pill-ok" title="Publiek zichtbaar">✓ public</span>
@@ -67,4 +70,10 @@
 
           <div class="ax-site-controls">
+            <% if (!s.is_primary && (typeof canMutate === 'undefined' || canMutate)) { %>
+              <form method="post" action="/admin/sites/<%= s.slug %>/make-primary" style="margin:0;display:inline"
+                    onsubmit="return confirm('Deze site instellen als de primaire/hoofd-site?')">
+                <button type="submit" class="ax-icon-btn" aria-label="Maak primair" title="Maak primaire/hoofd-site">★</button>
+              </form>
+            <% } %>
             <a href="/admin/sites/<%= s.slug %>/edit" class="ax-icon-btn" aria-label="Bewerken" title="Bewerken">✎</a>
             <form method="post" action="/admin/sites/<%= s.slug %>/delete" class="ax-delete-form"
@@ -198,4 +207,9 @@
   background: rgba(40,160,90,0.12);
 }
+.ax-pill-primary {
+  color: var(--accent);
+  background: color-mix(in srgb, var(--accent) 14%, transparent);
+  font-weight: 600;
+}
 
 /* ─── Stats (2 mini-columns for sites) ────────────────────────── */
