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
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://inputandfs://outputare 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://homeis 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
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
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. Keepnoorle.yaml as the source of truth for a version’s policy — it is the
copy you can review, diff, and re-upload.