Index: src/routes/admin-comments.js
===================================================================
--- src/routes/admin-comments.js	(revision a7e12de366afd5fc8eddd39ace47658c9a219a46)
+++ src/routes/admin-comments.js	(revision 8cb1dc7b23142c8a8ec44f7659178b51a2da4ddf)
@@ -15,9 +15,9 @@
 import db from '../config/database.js';
 import { renderPage } from '../middleware/render.js';
-import { requireGod } from '../middleware/auth.js';
+import { requireSiteManager } from '../middleware/auth.js';
 
 const router = express.Router();
 
-router.get('/', requireGod, (req, res) => {
+router.get('/', requireSiteManager, (req, res) => {
   const site = res.locals.site;
   if (!site) return res.status(404).send('No site');
@@ -61,4 +61,5 @@
   const site = res.locals.site;
   if (!site) return res.status(404).send('No site');
+  const base = res.locals.siteUrlBase || ''; // /user/<slug> in hub-artiestcontext, anders ''
 
   const row = db.prepare(`
@@ -67,14 +68,14 @@
   `).get(req.params.id, site.id);
 
-  if (!row) return res.redirect('/admin/comments?error=Not+found');
+  if (!row) return res.redirect(base + '/admin/comments?error=Not+found');
 
   db.prepare(
     'UPDATE comments SET status = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?'
   ).run(status, req.params.id);
-  res.redirect('/admin/comments?success=' + encodeURIComponent('Comment ' + status));
+  res.redirect(base + '/admin/comments?success=' + encodeURIComponent('Comment ' + status));
 }
 
-router.post('/:id/approve', requireGod, (req, res) => setStatus(req, res, 'approved'));
-router.post('/:id/reject',  requireGod, (req, res) => setStatus(req, res, 'rejected'));
+router.post('/:id/approve', requireSiteManager, (req, res) => setStatus(req, res, 'approved'));
+router.post('/:id/reject',  requireSiteManager, (req, res) => setStatus(req, res, 'rejected'));
 
 export default router;
Index: src/routes/admin-sites.js
===================================================================
--- src/routes/admin-sites.js	(revision a7e12de366afd5fc8eddd39ace47658c9a219a46)
+++ src/routes/admin-sites.js	(revision 8cb1dc7b23142c8a8ec44f7659178b51a2da4ddf)
@@ -22,5 +22,5 @@
 import db from '../config/database.js';
 import { renderPage } from '../middleware/render.js';
-import { requireGod } from '../middleware/auth.js';
+import { requireGod, requireAuth, requireSiteManagerBySlug } from '../middleware/auth.js';
 import ThemeService from '../services/ThemeService.js';
 import { listPlatforms, PLATFORMS } from '../services/PlatformIcons.js';
@@ -82,5 +82,5 @@
 // holds the URL string in `profile_photo` — this endpoint just stores the
 // file and hands back a URL that the form can paste into the input field.
-router.post('/upload-photo', requireGod, (req, res) => {
+router.post('/upload-photo', requireAuth, (req, res) => {
   photoUpload.single('photo')(req, res, (err) => {
     if (err) return res.status(400).json({ ok: false, error: err.message });
@@ -218,5 +218,5 @@
 
 // ==================== EDIT (form) ====================
-router.get('/:slug/edit', requireGod, (req, res) => {
+router.get('/:slug/edit', requireSiteManagerBySlug, (req, res) => {
   const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(req.params.slug);
   if (!site) return res.redirect('/admin/sites?error=Not+found');
@@ -242,5 +242,5 @@
 
 // ==================== SAVE ====================
-router.post('/:slug/save', requireGod, (req, res) => {
+router.post('/:slug/save', requireSiteManagerBySlug, (req, res) => {
   const site = db.prepare('SELECT id FROM sites WHERE slug = ?').get(req.params.slug);
   if (!site) return res.redirect('/admin/sites?error=Not+found');
Index: src/routes/admin.js
===================================================================
--- src/routes/admin.js	(revision a7e12de366afd5fc8eddd39ace47658c9a219a46)
+++ src/routes/admin.js	(revision 8cb1dc7b23142c8a8ec44f7659178b51a2da4ddf)
@@ -8,10 +8,32 @@
 import db from '../config/database.js';
 import { renderPage } from '../middleware/render.js';
-import { requireGod } from '../middleware/auth.js';
+import { requireAuth } from '../middleware/auth.js';
 import { getTenancy } from '../services/SettingsService.js';
 
 const router = express.Router();
 
-router.get('/', requireGod, (req, res) => {
+router.get('/', requireAuth, (req, res) => {
+  const user = req.session.user;
+
+  // Niet-god: een artiest die een eigen site bezit krijgt een "Mijn PrutFolio"-
+  // dashboard, gescopet op z'n eigen site. Bezit 'ie geen site -> geen beheer.
+  if (user.role !== 'god') {
+    const mySite = db.prepare(
+      'SELECT * FROM sites WHERE owner_id = ? ORDER BY created_at ASC LIMIT 1'
+    ).get(user.id);
+    if (!mySite) return res.status(403).send('Geen beheer beschikbaar voor dit account.');
+
+    const mine = {
+      posts: db.prepare("SELECT COUNT(*) AS c FROM posts WHERE site_id = ?").get(mySite.id).c,
+      published: db.prepare("SELECT COUNT(*) AS c FROM posts WHERE site_id = ? AND status = 'published'").get(mySite.id).c,
+    };
+    return renderPage(req, res, 'pages/my-site', {
+      pageTitle: 'Mijn PrutFolio',
+      bodyClass: 'on-admin',
+      mySite,
+      mine,
+    });
+  }
+
   const tenancy = getTenancy();
 
