Index: src/config/database.js
===================================================================
--- src/config/database.js	(revision 9e27d64c70dff768f7a07cb5f10586ad65f56c42)
+++ src/config/database.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -93,4 +93,15 @@
       ON playlist_tracks(playlist_id, position);
   `);
+
+  // Globale app-instellingen (key/value singleton). O.a. de tenancy-modus
+  // (solo = één site, hub = bedrijfssite + /gebruikers). Default = solo.
+  db.exec(`
+    CREATE TABLE IF NOT EXISTS app_settings (
+      key TEXT PRIMARY KEY,
+      value TEXT,
+      updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
+    );
+  `);
+  db.prepare("INSERT OR IGNORE INTO app_settings (key, value) VALUES ('tenancy', 'solo')").run();
 }
 
Index: src/middleware/site.js
===================================================================
--- src/middleware/site.js	(revision 9e27d64c70dff768f7a07cb5f10586ad65f56c42)
+++ src/middleware/site.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -11,33 +11,36 @@
 
 import db from '../config/database.js';
+import { getTenancy } from '../services/SettingsService.js';
 
 export function resolveSite(req, res, next) {
-  // Try /sites/:slug pattern
-  const m = req.path.match(/^\/sites\/([a-zA-Z0-9_-]+)(\/.*)?$/);
-  if (m) {
-    const slug = m[1];
-    const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug);
-    if (site) {
-      res.locals.site = site;
-      // Strip /sites/:slug from req.url so downstream routes see the rest
-      req.url = (m[2] || '/');
-      // Also rewrite originalUrl for redirect targets to keep the prefix
-      res.locals.siteUrlBase = `/sites/${slug}`;
-      return next();
+  const tenancy = getTenancy();
+  res.locals.tenancy = tenancy; // ook beschikbaar voor views
+
+  // In HUB-mode mapt /sites/:slug en (later) een subdomein naar een specifieke
+  // site. In SOLO-mode bestaat er maar één site: we slaan die routing over en
+  // pinnen altijd op de primaire site.
+  if (tenancy === 'hub') {
+    const m = req.path.match(/^\/sites\/([a-zA-Z0-9_-]+)(\/.*)?$/);
+    if (m) {
+      const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(m[1]);
+      if (site) {
+        res.locals.site = site;
+        req.url = (m[2] || '/'); // strip /sites/:slug zodat downstream de rest ziet
+        res.locals.siteUrlBase = `/sites/${m[1]}`;
+        return next();
+      }
+    }
+    const host = req.get('host')?.toLowerCase().replace(/:\d+$/, '');
+    if (host) {
+      const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(host);
+      if (site) {
+        res.locals.site = site;
+        res.locals.siteUrlBase = '';
+        return next();
+      }
     }
   }
 
-  // Future: subdomain mapping
-  const host = req.get('host')?.toLowerCase().replace(/:\d+$/, '');
-  if (host) {
-    const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(host);
-    if (site) {
-      res.locals.site = site;
-      res.locals.siteUrlBase = '';
-      return next();
-    }
-  }
-
-  // Default: pick first site
+  // 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();
   if (defaultSite) {
Index: src/routes/admin-settings.js
===================================================================
--- src/routes/admin-settings.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
+++ src/routes/admin-settings.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -0,0 +1,32 @@
+/**
+ * Admin: globale instellingen — nu de tenancy-modus (Solo/Hub).
+ *
+ * GET  /admin/settings        -> toon huidige modus + uitleg
+ * POST /admin/settings        -> sla modus op (god-only)
+ *
+ * Schakelen is niet-destructief: Solo verbergt alleen de multi-site-onderdelen
+ * en routeert naar de primaire site; er wordt niets verwijderd.
+ */
+
+import express from 'express';
+import { renderPage } from '../middleware/render.js';
+import { requireGod } from '../middleware/auth.js';
+import { getTenancy, setTenancy } from '../services/SettingsService.js';
+
+const router = express.Router();
+
+router.get('/', requireGod, (req, res) => {
+  renderPage(req, res, 'pages/admin-settings', {
+    pageTitle: 'Instellingen',
+    bodyClass: 'on-admin',
+    tenancy: getTenancy(),
+    success: req.query.success || null,
+  });
+});
+
+router.post('/', requireGod, (req, res) => {
+  setTenancy(req.body.tenancy === 'hub' ? 'hub' : 'solo');
+  res.redirect('/admin/settings?success=' + encodeURIComponent('Modus opgeslagen'));
+});
+
+export default router;
Index: src/routes/admin.js
===================================================================
--- src/routes/admin.js	(revision 9e27d64c70dff768f7a07cb5f10586ad65f56c42)
+++ src/routes/admin.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -9,8 +9,17 @@
 import { renderPage } from '../middleware/render.js';
 import { requireGod } from '../middleware/auth.js';
+import { getTenancy } from '../services/SettingsService.js';
 
 const router = express.Router();
 
 router.get('/', requireGod, (req, res) => {
+  const tenancy = getTenancy();
+
+  // De primaire/owner-site — in solo dé site, in hub de hoofdsite. Geeft de
+  // "Uiterlijk"-tegel z'n edit-link.
+  const primarySite = db.prepare(
+    'SELECT slug, title FROM sites ORDER BY created_at ASC LIMIT 1'
+  ).get() || null;
+
   const stats = {
     users: db.prepare('SELECT COUNT(*) AS c FROM users').get().c,
@@ -22,5 +31,6 @@
   };
 
-  const sites = db.prepare(`
+  // Sites/users-tabellen zijn alleen in hub relevant; in solo besparen we de query.
+  const sites = tenancy === 'hub' ? db.prepare(`
     SELECT s.slug, s.title, s.created_at, u.username AS owner_username
     FROM sites s
@@ -28,16 +38,18 @@
     ORDER BY s.created_at DESC
     LIMIT 50
-  `).all();
+  `).all() : [];
 
-  const users = db.prepare(`
+  const users = tenancy === 'hub' ? db.prepare(`
     SELECT username, email, role, created_at
     FROM users
     ORDER BY created_at DESC
     LIMIT 50
-  `).all();
+  `).all() : [];
 
   renderPage(req, res, 'pages/admin', {
-    pageTitle: 'Admin',
+    pageTitle: 'Beheer',
     bodyClass: 'on-admin',
+    tenancy,
+    primarySite,
     stats,
     sites,
Index: src/server.js
===================================================================
--- src/server.js	(revision 9e27d64c70dff768f7a07cb5f10586ad65f56c42)
+++ src/server.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -29,4 +29,5 @@
 import adminUsersRoutes from './routes/admin-users.js';
 import adminCommentsRoutes from './routes/admin-comments.js';
+import adminSettingsRoutes from './routes/admin-settings.js';
 import prutterRoutes from './routes/prutter.js';
 import audioRoutes from './routes/audio.js';
@@ -169,4 +170,5 @@
 app.use('/admin/users', adminUsersRoutes);
 app.use('/admin/comments', adminCommentsRoutes);
+app.use('/admin/settings', adminSettingsRoutes);
 app.use('/admin', adminRoutes);
 app.use('/prutter', prutterRoutes);
Index: src/services/SettingsService.js
===================================================================
--- src/services/SettingsService.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
+++ src/services/SettingsService.js	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -0,0 +1,42 @@
+// Globale app-instellingen (key/value, gecached). Nu vooral de tenancy-modus.
+//
+//   tenancy = 'solo'  -> precies één site (de primaire/owner-site)
+//   tenancy = 'hub'   -> hoofdsite (bedrijf) + /gebruikers, admin wijst PrutFolio's toe
+//
+// De cache wordt bij setSetting meteen ververst, dus een toggle in Beheer werkt
+// live zonder herstart.
+
+import db from '../config/database.js';
+
+let _cache = null;
+
+function load() {
+  if (!_cache) {
+    _cache = {};
+    for (const r of db.prepare('SELECT key, value FROM app_settings').all()) {
+      _cache[r.key] = r.value;
+    }
+  }
+  return _cache;
+}
+
+export function getSetting(key, fallback = null) {
+  const v = load()[key];
+  return v === undefined ? fallback : v;
+}
+
+export function setSetting(key, value) {
+  db.prepare(`
+    INSERT INTO app_settings (key, value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP)
+    ON CONFLICT(key) DO UPDATE SET value = excluded.value, updated_at = CURRENT_TIMESTAMP
+  `).run(key, String(value));
+  if (_cache) _cache[key] = String(value);
+}
+
+export function getTenancy() {
+  return getSetting('tenancy', 'solo') === 'hub' ? 'hub' : 'solo';
+}
+
+export function setTenancy(mode) {
+  setSetting('tenancy', mode === 'hub' ? 'hub' : 'solo');
+}
Index: src/views/pages/admin-settings.ejs
===================================================================
--- src/views/pages/admin-settings.ejs	(revision 6351545b08183045fe69f8d75db78b7e58951786)
+++ src/views/pages/admin-settings.ejs	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -0,0 +1,52 @@
+<div class="container admin-page">
+  <h1>Instellingen</h1>
+  <p class="admin-tagline"><a href="/admin">&larr; Terug naar beheer</a></p>
+
+  <% if (success) { %><div class="alert alert-success"><%= success %></div><% } %>
+
+  <section class="set-card">
+    <h2>Modus</h2>
+    <p class="set-help">
+      Bepaalt hoe deze installatie werkt. Wisselen is veilig: er wordt niets verwijderd —
+      Solo verbergt alleen de multi-onderdelen en toont je primaire site.
+    </p>
+
+    <form method="post" action="/admin/settings" class="set-form">
+      <label class="set-opt">
+        <input type="radio" name="tenancy" value="solo" <%= tenancy === 'solo' ? 'checked' : '' %>>
+        <span>
+          <strong>Solo</strong> — één site (de jouwe).
+          <small>Geen gebruikers-directory, geen site-wissel. Bezoekers kunnen wel met Google inloggen om te reageren.</small>
+        </span>
+      </label>
+      <label class="set-opt">
+        <input type="radio" name="tenancy" value="hub" <%= tenancy === 'hub' ? 'checked' : '' %>>
+        <span>
+          <strong>Hub</strong> — bedrijfssite met <code>/gebruikers</code>.
+          <small>Jij (admin) wijst gebruikers een eigen PrutFolio toe. Gesloten cirkel: geen open registratie.</small>
+        </span>
+      </label>
+      <button type="submit" class="btn btn-primary">Opslaan</button>
+    </form>
+  </section>
+</div>
+
+<style>
+.admin-page { max-width: 700px; margin: 3rem auto; padding: 0 1rem; }
+.admin-page h1 { font-family: var(--font-display, serif); font-size: 2rem; margin: 0 0 0.25rem; }
+.admin-tagline { color: var(--ink-muted); margin: 0 0 2rem; }
+.admin-tagline a { color: var(--accent); }
+.set-card { background: var(--paper-2); border: 1px solid var(--rule); border-radius: 12px; padding: 1.25rem; }
+.set-card h2 { font-family: var(--font-display, serif); font-size: 1.25rem; margin: 0 0 0.5rem; }
+.set-help { color: var(--ink-muted); font-size: 0.9rem; margin: 0 0 1.25rem; }
+.set-form { display: flex; flex-direction: column; gap: 1rem; }
+.set-opt { display: flex; gap: 0.75rem; align-items: flex-start; padding: 0.85rem 1rem; border: 1px solid var(--rule); border-radius: 8px; cursor: pointer; background: var(--paper); }
+.set-opt:has(input:checked) { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; }
+.set-opt input { margin-top: 0.25rem; flex-shrink: 0; }
+.set-opt span { display: flex; flex-direction: column; gap: 0.2rem; }
+.set-opt small { color: var(--ink-muted); font-size: 0.82rem; }
+.set-opt code { background: var(--paper-2); padding: 0.05rem 0.35rem; border-radius: 3px; font-size: 0.85em; }
+.set-form .btn { align-self: flex-start; }
+.alert { padding: 0.75rem 1rem; border-radius: 6px; margin-bottom: 1rem; }
+.alert-success { background: #d1fae5; color: #065f46; border: 1px solid #a7f3d0; }
+</style>
Index: src/views/pages/admin.ejs
===================================================================
--- src/views/pages/admin.ejs	(revision 9e27d64c70dff768f7a07cb5f10586ad65f56c42)
+++ src/views/pages/admin.ejs	(revision 6351545b08183045fe69f8d75db78b7e58951786)
@@ -1,31 +1,37 @@
 <div class="container admin-page">
-  <h1>Admin</h1>
-  <p class="admin-tagline">God-level overview. <em>(Stub — full dashboard later.)</em></p>
+  <h1>Beheer</h1>
+  <% if (tenancy === 'hub') { %>
+    <p class="admin-tagline">Hub-modus — bedrijfssite met gebruikers, elk hun eigen PrutFolio.</p>
+  <% } else { %>
+    <p class="admin-tagline">Solo-modus — jouw site.</p>
+  <% } %>
 
   <nav class="admin-quick-links" aria-label="Beheer-snelkoppelingen">
-    <a href="/admin/sites" class="btn">🌐 Sites</a>
-    <a href="/admin/users" class="btn">👥 Users</a>
-    <a href="/admin/audio" class="btn">🎵 Audio tracks</a>
-    <a href="/admin/playlists" class="btn">📃 Playlists</a>
-    <a href="/admin/comments" class="btn">💬 Comments</a>
+    <% if (tenancy === 'hub') { %>
+      <a href="/admin/sites" class="btn">🌐 Sites</a>
+      <a href="/admin/users" class="btn">👥 Gebruikers</a>
+      <a href="/admin/audio" class="btn">🎵 Audio</a>
+      <a href="/admin/playlists" class="btn">📃 Playlists</a>
+      <a href="/admin/comments" class="btn">💬 Reacties</a>
+      <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
+    <% } else { %>
+      <a href="/posts/new" class="btn">✍️ Nieuwe post</a>
+      <a href="/admin/audio" class="btn">🎵 Audio</a>
+      <a href="/admin/comments" class="btn">💬 Reacties</a>
+      <% if (primarySite) { %>
+        <a href="/admin/sites/<%= primarySite.slug %>/edit" class="btn">🎨 Uiterlijk</a>
+      <% } %>
+      <a href="/account" class="btn">👤 Account</a>
+      <a href="/admin/settings" class="btn">⚙️ Instellingen</a>
+    <% } %>
   </nav>
 
   <div class="admin-stats">
-    <div class="stat-card">
-      <div class="stat-num"><%= stats.users %></div>
-      <div class="stat-label">Users</div>
-    </div>
-    <div class="stat-card">
-      <div class="stat-num"><%= stats.sites %></div>
-      <div class="stat-label">Sites</div>
-    </div>
-    <div class="stat-card">
-      <div class="stat-num"><%= stats.posts %></div>
-      <div class="stat-label">Posts</div>
-    </div>
-    <div class="stat-card">
-      <div class="stat-num"><%= stats.published %></div>
-      <div class="stat-label">Published</div>
-    </div>
+    <% if (tenancy === 'hub') { %>
+      <div class="stat-card"><div class="stat-num"><%= stats.users %></div><div class="stat-label">Gebruikers</div></div>
+      <div class="stat-card"><div class="stat-num"><%= stats.sites %></div><div class="stat-label">Sites</div></div>
+    <% } %>
+    <div class="stat-card"><div class="stat-num"><%= stats.posts %></div><div class="stat-label">Posts</div></div>
+    <div class="stat-card"><div class="stat-num"><%= stats.published %></div><div class="stat-label">Gepubliceerd</div></div>
   </div>
 
@@ -68,7 +74,4 @@
   <% } %>
 
-  <p class="admin-todo">
-    <strong>Coming later:</strong> create/delete sites, manage users, theme picker, audio toggles, Prutter settings.
-  </p>
 </div>
 
