Default plugin repository for Tooty CMS.
This repo contains official plugins used by Tooty. Community plugins are welcome.
- Provide stable core/site plugin modules
- Keep plugin behavior behind contracts and capabilities
- Ensure plugin safety and compatibility in CI
Community plugins are welcome via pull request.
Before opening a PR, your plugin must pass CI and follow the required rules below.
- One folder per plugin at repo root, e.g.
my-plugin. - Folder name must match
plugin.json.id. - Each plugin must include
plugin.jsonwith:
idnamedescriptionversionminCoreVersionscope(site|network)distribution(core|community)developerwebsitecapabilities
versionmust be semver-like (example:0.1.0,0.2.2-1).minCoreVersionmust match Tooty range format (example:0.2.x).websitemust be an absolutehttp(s)URL.- If
capabilities.hooks = true, includeindex.mjs. - Add
tests/plugin.test.ts. - Do not bypass auth/routing/schema guards.
- Do not make direct unsafe side effects outside declared plugin contracts.
- No secrets, binaries, malware patterns, or
.DS_Storefiles.
- Create a folder:
my-plugin/
- Add
my-plugin/plugin.json:
{
"id": "my-plugin",
"name": "My Plugin",
"description": "Minimal Tooty plugin.",
"version": "0.1.0",
"minCoreVersion": "0.2.x",
"scope": "site",
"distribution": "community",
"capabilities": {
"hooks": true,
"adminExtensions": false,
"contentTypes": false,
"serverHandlers": false
},
"menu": {
"label": "My Plugin",
"path": "/app/plugins/my-plugin"
},
"settingsFields": [],
"developer": "Your Name",
"website": "https://example.com"
}- Add
my-plugin/index.mjs:
export default function registerPlugin(ctx) {
ctx.hooks?.addAction?.("request:begin", async () => {
// plugin logic
});
}-
Add
my-plugin/tests/plugin.test.ts(minimum contract smoke test). -
Validate locally:
npm run ci- Open PR.
This repo runs GitHub Actions for:
- Plugin contract validation
- Security scan (secrets + suspicious patterns)