Skip to content

Plugins

Plugins run inside a WebAssembly (QuickJS) sandbox with time and memory limits. A plugin can only do what its manifest declares (its capabilities), and the admin approves those capabilities in plain language. If a plugin fails to load or breaks its rules, it is turned off; the site keeps working.

A plugin can, if approved:

  • react to content and media events,
  • write content (content.write),
  • send email (email, 10 per minute),
  • read secrets from WUPPY_PLUGIN_<ID>_<NAME> environment variables,
  • call allowed hosts on the internet (every call is logged),
  • serve routes under /api/plugins/<id>/* and add admin pages.

If an update asks for more, the plugin stays off until it is approved again.

  • From a registry: Plugins searches the configured registries, installs, and shows available updates. Packages are signed (Ed25519) and pinned by checksum; each registry has its own trusted keys. A broken registry does not affect the others.
  • From a folder: add it to wuppy.config with the approval hash:
Terminal window
pnpm wuppy plugin hash plugins/search
plugins: [{ dir: "plugins/search", approve: "<hash>" }],

Plugins shows each plugin’s status, version, source, capabilities, last error, logs, call and error counts, and settings. Plugins can be turned on and off, configured, and removed (if installed from a registry).

The wuppy-plugin CLI creates, builds and signs plugins:

Terminal window
wuppy-plugin init my-plugin # manifest.json + plugin.js
wuppy-plugin validate my-plugin # check the manifest
wuppy-plugin build my-plugin # fails if the code uses a capability the manifest does not declare
wuppy-plugin keygen # a new Ed25519 key pair
wuppy-plugin pack my-plugin <key> # a signed registry bundle and index entry