manifest.plugins: [...] list. There is no such array today.
- TS packages (
@pylonsync/*): installable npm packages that return a manifest fragment (entities, actions, queries, policies) plus handler factories. You compose the fragment into yourbuildManifest()call. Use these to add features the framework binary does not already cover. - Built-in runtime plugins: a small set compiled into the
pylonbinary and wired automatically from your schema or environment. You do not name them anywhere. They activate when the relevant signal is present (atenantIdfield, a.owner()annotation, an env var).
- API keys:
/api/auth/api-keysroutes for mint / list / revoke. See Auth → API keys. - TOTP / 2FA:
/api/auth/totp/*routes for enroll / verify / disable + backup codes. See Auth → TOTP. - Transactional email:
PYLON_EMAIL_PROVIDERenv (sendgrid / resend / stack0 / webhook) +ctx.email.send(). See Integrations → email. - Audit log:
/api/auth/audit+/api/auth/audit/tenantroutes. - Organizations:
Org/OrgMember/OrgInviteentities +/api/auth/orgs/*routes. See Auth → Organizations.
TS packages
Install withbun add, then spread the manifest fragment into buildManifest():
Each package exports a factory (e.g.
stripe({...}), webhooks({...})) that returns { manifest, handlers, ... }. Pylon loads function handlers one-per-file, so you also add one-line wrapper files under functions/. See each package’s page for the exact list.
Built-in runtime plugins
These live incrates/plugin/src/builtin/. The runtime registers them at boot. They are auto-wired, not enabled through a manifest list.
How built-ins hook in
Built-ins observe the request and data path at fixed points. The exact Rust hooks (see Writing your own):on_request), mutate or reject a write (before_*), react after a write lands (after_*), add HTTP routes (routes()), or contribute manifest entities (entities()).
There is no plugins: [] array
Older drafts of these docs described enabling plugins through a pylon.manifest.json plugins list with per-plugin config. That mechanism does not exist. Built-ins are automatic. You influence them through your schema (add a tenantId field, annotate a field .owner()) and environment variables. App-specific cross-cutting logic goes in server functions and policies, not a plugin config block.
pylon plugins list prints a roadmap catalog of plugin names (validation, slugify, versioning, cascade, MCP, and more). These are planned, not installable today. Treat the list as a preview, not an API.
Plugins vs functions
Use a built-in when the behavior applies to every call. Use a function when callers opt in by name.
Writing your own
There is no dynamic plugin loading yet. Add a Rust built-in through a custom runtime; use functions and policies for TypeScript logic. The SDK ships adefinePlugin({ name, entities, hooks }) helper, but the runtime does not consume its output yet. See Writing your own plugin for the current extension points.