WebHemi is an educational, production-minded dual-engine CMS. The core idea: keep one design system as the visual source of truth, while two backend stacks can render it — a PHP-first path and a JavaScript-first path.
This repository is the hub (meta-repo). The runnable code lives in three Git submodules side by side.
A multi-repository platform where:
webhemi-ui— React components developed and reviewed in Storybook, published as@webhemi/ui(NPM).webhemi-php— WebHemi.PHP: Symfony + Twig shell, React admin via AssetMapper/importmap. No Node.js required in production.webhemi-js— WebHemi.JS (later phase): Next.js + Payload CMS, consuming the same@webhemi/uipackage.
+---------------------------+
| webhemi-ui (Storybook) |
| @webhemi/ui on NPM |
+---------------------------+
|
+-------------------+-------------------+
| |
v v
+-------------------+ +-------------------+
| webhemi-php | | webhemi-js |
| Symfony CMS | | Next + Payload |
| zero-Node prod | | (phase 3) |
+-------------------+ +-------------------+
| Capability | Description |
|---|---|
| Multi-tenant | Sites as tenants; users, roles, and assignments scoped per site where needed |
| Multi-domain | Multiple hostnames per site; request host drives routing context |
| Surfaces | admin, site, and api — same host model, different entry points |
| RBAC | Roles and permission strings (e.g. site.list, host.verify) |
| Host ownership | File probe: pending → verified → assign to site; Status = Enabled/Disabled (plan); local app:seed skips probe |
The legacy Symfony monolith (Twig admin, inline CSS) is retired. Admin UI comes only from @webhemi/ui.
| Path | Repository | Role |
|---|---|---|
webhemi-ui/ |
Gixx/webhemi-ui | Design system + Storybook |
webhemi-php/ |
Gixx/webhemi-php | Symfony CMS engine |
webhemi-js/ |
Gixx/webhemi-js | Next + Payload (outline only for now) |
Architecture detail: docs/plan/WebHemi_Architecture_and_Roadmap.md · Where we are: docs/plan/CURRENT.md
git clone --recurse-submodules git@github.com:Gixx/WebHemi.git
cd WebHemiIf you already cloned without submodules:
git submodule update --init --recursive# once: install deps + seed PHP (see webhemi-php/README.md)
make up # Storybook + UI watch→sync + Symfony
make status
make down
make test php # PHPUnit
make test ui # typecheck, lint, Storybook Vitest, Chromatic| URL | Purpose |
|---|---|
| http://127.0.0.1:6006 | Storybook |
| https://127.0.0.1:8000/admin/login | Admin login (path / IP) |
| https://admin.webhemi.local:8000/login | Admin login (domain mode) |
| https://www.webhemi.local:8000/login | Frontend (site) login stub |
| https://www.webhemi.local:8000/ | Site JSON stub (by design) |
Custom hosts and certificate: docs/local-dev.md. First time: make cert (or symfony server:ca:install then make cert).
- UI:
cd webhemi-ui && npm install && npm run storybook/npm run build - PHP: see
webhemi-php/README.md - JS: not implemented yet —
webhemi-js/README.md
The previous single-repo Symfony application is preserved in Git history:
- Tag:
archive/pre-hub-monolith - A local copy may exist in
.old/(gitignored) for quick reference on your machine
Do not treat .old/ as the source of truth — use the tag or submodule repos.
| Document | Description |
|---|---|
| Current progress | Start here — done vs next phases (renumbered) |
| Local development | make up / hosts / Makefile vs DDEV |
| Architecture & roadmap | Multi-repo design (long-horizon) |
| Frontend sites & themes | Multi-site public stack + swappable themes (Phase 9 / 14) |
| Admin98 product integration | Historical phase narrative 0–7 |
| webhemi-php README | PHP setup, sync-ui, QA |
| webhemi-ui README | Storybook and library build |
| Host ownership probe (PHP) | File probe mechanics |
Other docs/plan/* files are detail / ADR notes; status lives in CURRENT.md.
MIT — see LICENSE.