Skip to content

Extending Porulle

When Porulle’s bundled features don’t match your case, you extend the framework rather than fork it. Every extension point is a config-time contribution: hooks intercept operations, custom tables share the schema, plugins compose multiple extensions into one config-transform. No subclassing, no monkey-patching.

These three contracts are normative — every extension must follow them:

  • Plugin Contract — what plugin authors MUST do (actor as required parameter, Result<T>, org scoping, no body-supplied identity)
  • Payment Adapter Contract — accurate amountCaptured, idempotency, timing-safe webhook verification
  • Security Model — the framework’s threat model and adopter-side responsibilities