Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Package format

A .memona-plugin package is a ZIP archive with these root entries:

manifest.json   required
plugin.wasm     required WebAssembly component
README.md       optional UTF-8 text
LICENSE         optional UTF-8 text
icon.png        optional PNG

Version 1 rejects other entries, duplicate paths, directories, symlinks, encrypted archives and paths that could escape the archive root. There are no install hooks or executable frontend assets.

Guide and icon

Include a root-level README.md to provide the guide on the plugin’s public page. Write UTF-8 Markdown and explain setup, required services, connection fields, supported operations and limitations. Keep credentials and other private information out of the guide. A release without a README shows a missing-guide message; the store does not invent documentation from its manifest.

The website renders headings, lists, links, code and tables as selectable text. Raw HTML is disabled and rendered content is sanitized. Links may use HTTP, HTTPS or mailto; remote images become links or descriptive text instead of loading a third-party image. Use fenced code blocks for examples and ordinary links for external diagrams or screenshots.

An optional root-level icon.png supplies the icon on catalog cards and the plugin page. It must be a PNG no larger than 1 MiB. A missing icon uses the plugin’s initial. The store serves the validated package asset from its own origin; a manifest cannot point the icon at another server.

README and icon belong to an immutable release. Publish a new version to change them. Both are extracted through the isolated package validator, including when the store first reads metadata from an older release. Assets and guides from withdrawn releases are unavailable through public release routes.

Manifest

{
  "schemaVersion": 2,
  "id": "your-publisher/my-provider",
  "name": "My filesystem",
  "version": "0.1.0",
  "apiVersion": "0.1.0",
  "description": "Connect to my filesystem service.",
  "license": "MIT",
  "entry": "plugin.wasm",
  "providers": [
    {
      "id": "files",
      "name": "My filesystem",
      "schemes": ["myfiles"],
      "configFields": [
        {"key": "endpoint", "label": "Service URL", "kind": "text", "required": true},
        {"key": "token", "label": "Access token", "kind": "password", "required": true}
      ]
    }
  ]
}

Replace the example publisher with your own. Your verified publisher account must own the publisher portion of the package ID.

FieldMeaning
schemaVersionManifest shape; new packages use 2.
idImmutable publisher/plugin identifier.
versionCanonical semantic release version.
apiVersionMemona plugin API version; currently 0.1.0.
entryMust be plugin.wasm in this format.
networkPortsDeclared port spans for sockets, as { "from": 21, "to": 21 }.
providersStable provider identities and declarative configuration fields.

Publisher/plugin/provider slugs use lowercase ASCII letters, digits and hyphens, begin and end with a letter or digit, and have at most 64 characters. Human names can use other languages. Configuration kind is text, password or boolean. Never place a credential in a manifest or a password default. Publishing rejects a member the catalog does not know, so a typo never ships, while an app older than a member ignores it, so a newer catalog never breaks an installed app.

Plugins can contact any public, LAN, VPN, link-local or loopback host through the host’s HTTP and socket services. There is no host allowlist or private network grant in the manifest or connection configuration. ENS or other name-resolution protocols can contact their RPC nodes and content gateways; the plugin implements resolution before making ordinary network requests.

Current Memona versions also read schema 1 packages, ignoring their obsolete host declarations. New publications use schema 2. The legacy catalog API keeps the old manifest shape for older apps; new clients use /api/v2.

An empty networkPorts list declares no sockets, which is every provider that speaks only HTTP. A protocol that negotiates its data channel at runtime, as FTP does, declares the span it may land in rather than one port. Memona applies these declarations automatically to each connection. At most 16 spans.

Limits and compatibility

ItemLimit
Compressed package32 MiB
Expanded archive total128 MiB
WASM component64 MiB
Manifest64 KiB
README or license256 KiB each
PNG icon1 MiB

The same validation runs on the store and in Memona. Components must implement the full provider interface, including optional-operation methods that may return unsupported, and import only supported host services.

Each published ID/version permanently identifies one byte sequence and SHA-256 digest. Correct a release by incrementing its version. Withdrawing a release prevents new catalog installations; it does not silently remove installed code.