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.
| Field | Meaning |
|---|---|
schemaVersion | Manifest shape; new packages use 2. |
id | Immutable publisher/plugin identifier. |
version | Canonical semantic release version. |
apiVersion | Memona plugin API version; currently 0.1.0. |
entry | Must be plugin.wasm in this format. |
networkPorts | Declared port spans for sockets, as { "from": 21, "to": 21 }. |
providers | Stable 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
| Item | Limit |
|---|---|
| Compressed package | 32 MiB |
| Expanded archive total | 128 MiB |
| WASM component | 64 MiB |
| Manifest | 64 KiB |
| README or license | 256 KiB each |
| PNG icon | 1 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.