Symptom
Backend may load, or the Modules UI shows installed=true, but the shell never registers the plugin UI — no side menu items, blank routes, or a missing frontend bundle in the network tab.
Checklist
- Confirm base/backend/installed-plugins/<name>/ contains frontend/ and module.metadata.json — not only backend/
- Folder name, metadata.name, and the Modules table name must match exactly
- Rebuild with quan-erp watch <plugin>, then re-install (or confirm watch refreshed the installed copy)
- Hard-refresh the browser; check Network for the plugin frontend entry (404 / blocked)
- Open the browser console for register() / import errors from frontend/src/index.tsx
- If the plugin declares pluginDependencies, those providers must be installed and load first
Source vs available vs installed
Watch only stages available-plugins. The shell loads installed-plugins. Building without Install (or without an already-installed refresh) leaves the UI on an old or empty copy.
- Source — plugins/<name>/frontend/
- Available — base/available-plugins/<name>/<version>/frontend/
- Installed — base/backend/installed-plugins/<name>/frontend/
Entry must export PluginModule
The shell loads only frontend/src/index.tsx. Default-export a PluginModule and register routes/menus inside register(AppRegistry).
- Missing or wrong default export → module never registers
- Throwing inside register() → check console; fix and rebuild
- Routes/menus added outside register() are ignored