Module manifest
The platform never inspects your source to discover capabilities — only module.manifest.json is authoritative.
Every install, upgrade, and entitlement check reads the manifest. Keep it semver-versioned and immutable once published; ship breaking changes as a new version entry in Avanora Market.
Required concepts
key— stable identifier (lowercase, hyphens); drives API namespace/api/v1/<key>/*permissions— dotted keys enforced server-side on every routedependencies/conflicts— other modules you require or cannot coexist withevents— typed bus messages you emit or consumeslots— UI extension points without importing peer module codeconfigSchemaPath— JSON Schema for tenant admin configuration UI
Example
{
"key": "my-integration",
"name": "My Integration",
"version": "1.0.0",
"description": "Example third-party module for Avanora Core.",
"category": "integration",
"availabilityType": "PAID_ADDON",
"compatibility": { "core": ">=0.0.1", "node": ">=20.0.0" },
"dependencies": [{ "key": "crm", "version": ">=0.0.1" }],
"permissions": ["my-integration.records:read", "my-integration.records:write"],
"events": {
"emits": ["my-integration.record.created"],
"consumes": ["crm.contact.created"]
},
"slots": {
"provides": ["my-integration.contact.sidebar"],
"consumes": ["crm.contact.detail.tabs"]
},
"routes": ["/api/v1/my-integration"],
"configSchemaPath": "./module.config.schema.json"
}