Introduction
What Cogeze is, what the core owns, and what a plugin owns.
Cogeze is a CMS built on Laravel 13 and React 19. Every feature ships as a plugin — articles, products, orders, forms, navigation, SEO, translations, and the storefront itself.
What the core owns#
The core contains only what cannot be a plugin:
| Component | Responsibility |
|---|---|
PluginManager |
Discovery, boot order, enabled/disabled state |
PluginInstaller |
Install, uninstall, migrations, permissions, conflict checks |
Commander |
Cross-plugin command bus |
ShapeRegistry |
Declarative metadata one plugin publishes for others |
Router Hub |
Public URL resolution and page rendering |
| Auth, RBAC, admin shell | Required before a plugin can be installed at all |
Everything else lives in plugins/.
Three rules#
1. A plugin never touches another plugin's data. No importing another plugin's models, no querying its tables. Cross-plugin access goes through a named command — see Commander.
2. A data plugin does not render. It owns tables, an admin screen, and a gateway of commands. URLs and views belong to a storefront plugin — see Storefront.
3. URLs live in the database, not in code. routes/web.php declares no public routes.
Plugins declare intents; the route_map table maps intents to URLs — see
Pages.
Request flow#
Request
├─ /api/admin/* API (auth:sanctum + RBAC)
├─ /admin/* React SPA shell, client-side routing
└─ everything else
│
├─ look up route_map → intent
├─ resolve needs via Commander
├─ renderer produces the page body
├─ theme wraps chrome
└─ Hub wraps <html>, SEO, assets
The public branch imports no models. It only knows command names.
Admin and public share no front-end code#
Admin is a React SPA. Public pages are Blade rendered on the server, with React islands for interactive parts. The two share models and commands on the back end, and nothing on the front end.
Public content has to be readable by crawlers, which requires server rendering. The admin does not, and gets a real application experience instead.