Documentation

Plugins

Plugins are optional add-ons that extend what your eIOU node does. This page covers what plugins are, what they can and cannot reach, how to install and enable them, and how signature verification works. The CLI commands for plugin management live in System & Advanced; the full technical reference (manifest schema, permission catalog, plugin-authoring contract) lives in Reference › Plugins.

Setting up MCP inference? Follow the MCP Passthrough documentation for node access, providers, client configuration, and a first test call.

What the sandbox blocks

Under those rules, a sandboxed plugin cannot:

  • Read wallet private keys, the BIP39 seed phrase, the master encryption key, or any other wallet secret on the filesystem
  • Read API key plaintext (only hashed identifiers are exposed)
  • Run direct SQL against core tables: contacts, transactions, api_keys, balances, payback_methods, and others are completely invisible to the plugin's database user
  • Read or modify other plugins' tables
  • Persist state anywhere except its own directory and its own database tables
  • Crash the node: a plugin that throws during discovery, registration, or boot is caught, marked failed, and logged, while the rest of the node continues
  • Run shell commands, evaluate arbitrary code through eval, or invoke other restricted PHP functions

What the sandbox does NOT block

The sandbox isolates wallet data; it is not a full PHP execution sandbox. A malicious plugin still runs arbitrary PHP inside its own pool and can:

  • Make outbound network requests within the limits of the container's network access
  • Transmit any data the operator has authorized it to read (see What a plugin can see)
  • Behave maliciously after passing signature verification: signatures attest to the publisher's identity, not to the plugin's behavior

For genuinely hostile plugins, the mitigations are upstream of the sandbox: signature verification, vetted install sources, code review, and the operator's choice not to grant permissions a plugin does not need.

What is deliberately not reachable

  • Plaintext payback-method account identifiers (for example, bank account numbers, Lightning addresses) are not exposed; only capability metadata is
  • API key plaintext is never exposed; only hashed identifiers
  • Wallet keys and the BIP39 seed phrase are not exposed by any service, with or without permissions

Bundled with the image

Plugins authored by eIOU ship inside the official Docker image. On first boot, the startup process seeds them into your plugin directory without overwriting existing operator state. If a later image ships a newer version of a bundled plugin, the auto-upgrade flow installs the newer copy at boot while preserving your enabled or disabled state.

Upload a .zip through the GUI or CLI

The most common path for third-party plugins. From the GUI, navigate to Settings › Plugins and use the upload control. From the CLI:

docker cp my-plugin.zip alice:/tmp/my-plugin.zip
docker exec alice eiou plugin install /tmp/my-plugin.zip

Either path runs the same validation pipeline: zip integrity, no path traversal, allow-listed file types, a single top-level plugin directory, the manifest parses and matches the directory, and (when signature verification is set to require) the plugin is signed by a trusted key.

Install does not enable the plugin. Newly installed plugins land disabled until you explicitly enable them (see Enabling and disabling).

Manual drop-in

If you have shell access to the container, you can copy a plugin directory directly into /etc/eiou/plugins/. The next time the node discovers plugins (at boot or on demand) it will pick it up, disabled by default, subject to the same signature checks as upload installs.

Two layers of trusted keys

The node looks for trusted public keys in two directories.

Baked-in (first-party): /app/eiou/plugins/trusted-keys/ holds eIOU-official keys that ship with every node. Read-only inside the container.

Operator-managed (third-party): /etc/eiou/plugins/trusted-keys/ holds keys you have deliberately added because you trust the publisher to ship plugins for your node. Lives on your config volume.

Adding a key to the operator-managed directory is a meaningful security decision. A trusted key lets the holder ship plugins your node will accept; make sure you actually trust the publisher and have a way to revoke if you change your mind.

Three enforcement modes

Signature checking has three modes, controlled by the PLUGIN_SIGNATURE_MODE environment variable.

off: the verifier does not run. Every plugin loads regardless of signature state. Use this only when you deliberately want to disable signature verification.

warn (default): the verifier runs, signature status is recorded and surfaced in the plugin list, but the plugin still loads even if verification fails. Useful for seeing which plugins would fail under require without breaking anything.

require: the verifier runs and refuses to load any plugin whose signature is missing, malformed, untrusted, or invalid. Recommended for production once every plugin you want to keep running has been signed by a trusted key.

A reasonable rollout is to use the default warn mode to see which of your plugins would fail, sign or re-source whatever needs signing, then switch to require.

The full signature workflow (generating keys, signing plugins, distributing public keys, and what each signature status means) lives in Reference › Plugins › Plugin Signatures.