Index: src/services/PermissionsService.js
===================================================================
--- src/services/PermissionsService.js	(revision 2165b6d3d57ceaa8b5d1f70491868482149470cf)
+++ src/services/PermissionsService.js	(revision 7bc636b391c66ac399c33e54f7173a022c6a3cbd)
@@ -3,6 +3,4 @@
  * Used in templates to show/hide edit buttons, delete buttons, etc.
  */
-
-import db from '../config/database.js';
 
 class PermissionsService {
@@ -46,5 +44,4 @@
     if (!user) return false;
     if (user.role === 'god') return true;
-    if (!site) return false; // no site context (e.g. hub landing) -> nothing to post to
     if (user.id === site.owner_id) return true; // Site owner
     if (this.canAdminSite(user, site)) return true;
@@ -56,13 +53,9 @@
    */
   static canAdminSite(user, site) {
-    if (!user || !site) return false;
+    if (!user) return false;
     if (user.role === 'god') return true;
     if (user.id === site.owner_id) return true;
-    // Assigned co-admin (collaborator) via site_members. Previously read from
-    // a never-populated user.siteRoles → dead code; now queried directly on
-    // the table (a few checks per page, indexed = cheap).
-    return !!db.prepare(
-      "SELECT 1 FROM site_members WHERE site_id = ? AND user_id = ? AND role = 'admin' LIMIT 1"
-    ).get(site.id, user.id);
+    // Check site_members table
+    return user.siteRoles && user.siteRoles[site.id] === 'admin';
   }
 
