Submission Guidelines
Submission Guidelines
This page documents the contract every theme and plugin in this marketplace agrees to follow. It's not a barrier — it's a small set of practices that keep installs predictable and uninstalls clean.
Plugin checklist
- A valid
manifest.jsonwithid,name,version,apiVersion, andentryfields. - The bundle must externalize
react,react-dom,react-i18next, and@flexweg/cms-runtime— never duplicate React in your build. - Settings page registered via
manifest.settings; the page is mounted at/admin/#/settings/plugin/<id>. - i18n bundles via
manifest.i18n = { en, fr, … }. English is required; other locales are encouraged. - If the plugin uploads to Flexweg, route every write through the dispatcher exports (
uploadFile,deleteFile, …) so the standard error toasts apply.
Theme checklist
- Six templates exported from the manifest:
base,home,single,category,author,notFound. BaseLayoutMUST emit both sentinels:<meta name="x-cms-head-extra" />in<head>and<script type="application/x-cms-body-end" />before</body>. Plugins inject head + body content through these.- Templates accept serializable props only — no Firestore reads, no admin context.
- Multi-language support: read
currentLocaleinBaseLayout, usesite.homePathfor the brand link, prefix internal hard-coded URLs with the locale, and pick per-language menu labels fromResolvedMenuItem.labels.
Naming + licensing
- Use a unique kebab-case id (e.g.
acme-newsletter) — the id is immutable after install. - License under MIT (or any OSI-approved permissive license).
- Add a
README.mdto the bundle with install + configuration notes — admins read it from the Plugins page.