Manifest Reference

Every VeloCMS plugin must include a manifest.jsonat its root. The manifest is validated at install time by the tenant's VeloCMS instance, and again during the marketplace review pipeline. Missing required fields cause hard failures; invalid values cause descriptive error messages.

Complete example

{
  "id": "com.example.mailchimp-sync",
  "name": "Mailchimp Sync",
  "version": "1.2.0",
  "description": "Syncs new blog members to a Mailchimp audience automatically.",
  "author": "Example Corp",
  "homepage": "https://example.com/velocms-mailchimp",
  "repository": "https://github.com/example/velocms-mailchimp",
  "license": "MIT",
  "capabilities": ["members:read", "network:fetch"],
  "hooks": ["afterMemberSignup"],
  "network_access": {
    "allowedDomains": ["api.mailchimp.com"],
    "reasoning": "Sync member emails to Mailchimp audience"
  },
  "builtin": false,
  "enabled": true,
  "entry": "./dist/runtime.js"
}

Required fields

FieldTypeConstraints
idstringReverse domain. Pattern: /^[a-z0-9-]+(\.[a-z0-9-]+)*$/. Min 2 segments.
namestringMax 100 chars
versionstringSemver. e.g. "1.0.0", "2.1.0-beta.1"
descriptionstringMax 500 chars
capabilitiesstring[]From PLUGIN_CAPABILITIES allowlist. May be empty.
hooksstring[]From HOOK_NAMES allowlist. May be empty.
builtinbooleanfalse for third-party plugins
enabledbooleantrue = active on install by default

Optional fields

FieldTypeNotes
authorstringMax 100 chars
homepagestringMust be a valid URL
repositorystringMust be a valid URL
licensestringSPDX identifier (e.g. "MIT")
network_access.allowedDomainsstring[]Exact hostnames only. No wildcards.
network_access.reasoningstringShown to tenants in consent dialog
entrystringPath to compiled runtime entry point

ID format rules

Plugin IDs use reverse domain notation. All lowercase, alphanumeric plus hyphens, dot-separated segments, minimum two segments:

// Valid
"com.example.my-plugin"
"org.myorg.analytics"
"io.github.username.plugin-name"

// Invalid
"my-plugin"             // no dots — rejected
"com.example.MyPlugin"  // uppercase — rejected
"com.example.my_plugin" // underscore — rejected