Skip to main content
noorle.yaml carries a plugin’s metadata, its permission policy, and its credential declarations. It is optional in the archive; a plugin without one runs under a policy with no network, no storage, and no environment access.

Shape

Two shapes that look right and are not:
  • The filesystem key is storage, not filesystem.
  • resources sits inside permissions, not beside it. A top-level resources: block is silently ignored, and your plugin runs on platform defaults.

schema_version

Required. Must be exactly the string "1.0". Any other value fails validation.

metadata

Optional. Every field inside it is optional. There is no version key. Versions are integers the platform assigns on each upload — see Publishing and versions.

permissions.network

An allowlist of outbound hosts. Absent or empty means no outbound access.
CIDR entries are rejected at validation. - cidr: "10.0.0.0/8" fails the upload with an explicit error; use host patterns.

permissions.storage

Grants access to the platform’s virtual mounts. This is not a host filesystem — each mount is object-store-backed.
access is required on every entry — omit it and the manifest fails to parse. It declares intent rather than setting policy: each mount’s permissions are fixed to the column above, so listing [read, write] on fs://input does not make it writable, and listing [read] on fs://output does not make it read-only. Write down the access your code actually uses. Granting a mount in the policy is necessary but not sufficient — each one also has a runtime precondition:
  • fs://input and fs://output are materialised only when the call carries a session. A caller without one — an anonymous request on a public gateway, for instance — sees neither directory.
  • fs://home is materialised only when the caller is an agent. The policy may grant it on any surface; on a gateway or workflow surface it is skipped silently and the guest sees no /workspace/home.
fs://working is a retired name and is ignored with a warning.

permissions.environment

Allow-only. Only the keys listed here are visible to std::env::var, and only if a value exists for them — set values in the archive’s .env file or in the Portal, per version. Nothing from the host environment reaches the guest. For secrets, prefer credentials below: an environment value is readable by your code, while a credential is injected outside the sandbox and never enters guest memory.

permissions.resources.limits

Quote a memory value only when it carries a suffix. memory: "256Mi" and an unquoted memory: 256 both ask for 256 MB. A quoted, suffix-less memory: "256" asks for 256 bytes — which then clamps up to the 128 MB floor, and is almost certainly not what you meant.
Both are requests, not guarantees — a value outside the platform’s bounds is clamped, not rejected. An account-level override, if one is configured, is applied last and wins. CPU fuel is not settable here. It comes from platform configuration (200,000,000 units by default) plus an optional per-account override. Outbound HTTP volume is not settable here either. Every plugin gets the platform’s cap of 100 outbound HTTP requests per execution.

credentials

Declares secrets your plugin needs and where the platform should inject them into outbound HTTP. Values are stored encrypted and injected at the host boundary — the guest never sees them.

Injection types

Editing configuration after upload

You do not have to rebuild to change policy. In the Portal, open the plugin, go to Versions, and use Edit configuration on a version. The drawer covers allowed network hosts, environment variables and their values, the timeout and memory limits, and any credential slots the version declares. Keep noorle.yaml as the source of truth for a version’s policy — it is the copy you can review, diff, and re-upload.