Skip to content

Plugins and Capabilities

Plystra uses plugins and capabilities to grow beyond Core, but the current implementation is deliberately staged.

AreaCurrent status
Plugin metadata APIImplemented preview routes in Core.
Plugin runtimeNot a stable hot-loaded runtime. Official sidecar/plugin repos are operated independently.
Capability declarationsImplemented in plugin manifests and templates.
Generic capability protocolIndependent capability-contracts repo.
Domain capability contractsIndependent repos, for example email-contracts.
Marketplace/cloud installVision, not current runtime behavior.

Core never treats authorization, audit, identity, resource registry, or admin control as ordinary optional plugins. Those are built-in system capabilities.

MethodPath
POST/api/v1/plugins/validate-manifest
POST/api/v1/plugins/install
GET/api/v1/plugins
GET/api/v1/plugins/{plugin_key}
POST/api/v1/plugins/{plugin_key}/enable
POST/api/v1/plugins/{plugin_key}/disable
POST/api/v1/plugins/{plugin_key}/uninstall
GET, PATCH/api/v1/plugins/{plugin_key}/settings
GET/api/v1/plugins/{plugin_key}/resources
GET/api/v1/plugins/{plugin_key}/permissions
GET/api/v1/plugins/{plugin_key}/audit-events
GET/api/v1/plugins/{plugin_key}/admin-menus

These routes validate and store metadata, expose generated resource/permission/audit/admin-menu views, and toggle lifecycle status. They do not load arbitrary third-party code into Core.

The current manifest validates:

  • reverse-DNS style plugin id, such as plystra.moderation.
  • semantic version-like plugin version.
  • manifest_version and plugin_api_version, both 1.0 for Core v1.0.
  • requires_core version constraint.
  • resource/action definitions.
  • permissions with valid scopes and no global scope grants.
  • audit event keys.
  • admin menu paths under /plugins/.
  • provided capability profiles.
  • required capability profiles.

Capability IDs use dotted names such as email.transactional. Valid capability levels are experimental, standard, and enterprise.

RepositoryOwnsNotes
capability-contractsGeneric capability protocol, profile/requirement validation, checksum helpers, capserver helperDomain-neutral.
email-contractsemail.transactional contract and request validationDomain-specific. Implementations expose POST /contract/v1/email/send.

Do not put domain contracts into the generic contracts repo. Domain contracts should be extracted from real plugin/provider behavior.

Complete Auth does not send email directly in production. It requires a provider that implements email.transactional.

Complete Auth plugin
-> email-contracts: POST /contract/v1/email/send
-> SMTP provider plugin
-> Cloudflare Email Sending provider plugin
ProviderRepoProduction secret handling
SMTPplugin-email-smtpEMAIL_CAPABILITY_TOKEN, SMTP_USERNAME, and SMTP_PASSWORD are secrets. Non-sensitive SMTP host/port/TLS defaults live in plugin_email_smtp_settings.
Cloudflare Email Sendingplugin-email-cloudflareEMAIL_CAPABILITY_TOKEN is a Cloudflare secret; Cloudflare binding config is in Worker config; sender is supplied by contract request.

Both providers reject header injection, client-controlled transport headers, excessive recipient counts, and oversized message bodies.

Core migrations seed official plugin metadata for API keys, webhooks, notifications, and moderation. That metadata demonstrates how plugins declare resources, permissions, audit events, admin menus, and settings. It does not mean those plugins are loaded into Core as arbitrary code.

Templates can require plugins and capabilities. For example:

TemplateRequired pluginRequired capability
internal-adminplystra.api_keys, plystra.webhooksapi_key.credential standard
community-liteplystra.moderationnone
auth-ready-saasplystra.auth_completeemail.transactional standard

Capability resolution is implemented enough for templates and metadata previews. Certified capability conformance remains future work.