Area: Cross-cutting infra (audit p14) · Surface: AdminSitePageController / SitePage model / routes.php · Dimension: competitor-gap · Severity: major
Every competitor in the community space ships a custom-pages / CMS surface so a community owner can publish a 'Start Here', FAQ, Contact, Events-info, Code-of-Conduct, or marketing landing page without a code deploy. Circle has custom 'Pages' and a Spaces-based content layout; Skool lets owners build an 'About' page plus custom links; Discourse ships admin-editable static pages and a 'pages' plugin; Mighty Networks has a full page/space builder. Mobieus lets a tenant super-admin edit exactly one prose page (About Us) and four legal documents — anything else requires Patrick to ship code (new route + controller method + template). A community owner who wants a 'House Rules' or 'New Member Orientation' page has no path. This is table-stakes self-service content management that we structurally cannot offer today.
Evidence
AdminSitePageController.php:24-26 `private const EDITABLE_PAGES = ['about-us' => 'About Us'];` — the ONLY editable site page. LegalPage.php:34-39 `ALLOWED_SLUGS` is locked to terms/privacy/community-guidelines/marketplace-rules. routes.php:122-126 every page is a hard-coded route (`/about`, `/terms`, ...); there is no catch-all `/{page}` route. SitePage.php has only find()/upsert() — no list/create/delete. The controller docblock even states the limit is intentional: AdminSitePageController.php:17-19 'Adding a new editable page = three small touches' (routes + controller + template).
Suggested fix. Generalize SitePage into a real CMS: an admin 'Pages' index where super-admins create/edit/delete arbitrary slugs, a single dynamic public route (e.g. `/p/{slug}` or a catch-all that checks site_pages before 404), per-page publish/unpublish, and optional inclusion in the footer/nav. Keep the existing about/legal slugs as reserved system pages so nothing breaks.
Filed by the automated tenant-app audit and adversarially evidence-verified. Status: verified. Open — not yet actioned.
Patrick Bass
@mobieus