Cogeze
Guide

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.