Limits
Every number a plugin author or operator can hit, with its default and where it
comes from. Operator-tunable values name their configuration key. They live in
the plugins: block of the YAML config, described in the
configuration reference. The
configuration reference documents setup_timeout_ms, store_max_keys and
store_max_bytes. The other keys in the tables below are read from the same
block.
Runtime
| Limit | Default | Configuration key | Notes |
|---|---|---|---|
Timeout, on-event and check-health |
5000 ms | plugins.invocation_timeout_ms |
Wall clock. The call is killed when it expires. |
Timeout, on-schedule |
60000 ms | plugins.schedule_timeout_ms |
Checkpoint progress to the store as you go. |
Timeout, setup |
30000 ms | plugins.setup_timeout_ms |
One setup step. |
Timeout, on-http and fill-shelf |
120000 ms | plugins.page_timeout_ms |
A page call ends with 504, a failed fill is recorded as an error. |
| Schedule interval | 5 minutes minimum | none | The manifest's schedule may not ask for less. |
| Pool size | 4 | plugins.pool_size |
Guests running at once, per plugin. |
| Page slots | pool_size - 1, at least 1 |
none | Concurrent page calls per plugin, so one worker stays free for events and schedules. |
| Page slot wait | 2000 ms | none | After that the page answers 503 with Retry-After: 2. |
| Memory | 64 MiB (67,108,864 bytes) | plugins.memory_limit_bytes |
Enforced when the guest is instantiated: a guest whose minimum memory exceeds it is refused. It does not stop a guest from growing past it at runtime. |
| CPU | none | none | There is no fuel metering for components. The wall-clock timeout is the only guard. |
Each call runs in a fresh component instance, so a guest never keeps memory between calls.
Storage
The state:kv store is per plugin instance.
| Limit | Value | Configuration key | Notes |
|---|---|---|---|
| Keys per instance | 1,000,000 | plugins.store_max_keys |
|
| Bytes per instance | 268,435,456 (256 MiB) | plugins.store_max_bytes |
Sum of key and value bytes over every row. |
| Value size | 64 KiB | none | Fixed. |
| Key size | 512 bytes | none | Fixed. An empty key is rejected. |
kv-set-many batch |
500 entries | none | All or nothing. |
kv-list page |
200 entries | none | In key order, with an opaque cursor. |
A write past a quota returns denied. A batch over 500 entries returns
invalid-request.
The host sweeps keys under link/<link-id>/ and the older spelling
conn/<link-id>/ when that account link is deleted. Every other key is opaque
to the host.
Network
| Limit | Event, schedule and setup calls | Page and shelf calls |
|---|---|---|
http-request response size |
1 MiB (1,048,576 bytes) | 4 MiB (4,194,304 bytes) |
http-request timeout |
5 s | plugins.page_http_timeout_ms, default 90000 ms |
An outbound request needs the net:http capability. Its host must be granted,
or its scheme, host and port must exactly match an endpoint the operator
approved for the calling instance. A host the manifest declares but the grant
does not hold is refused either way. See
capabilities.
Data reads
| Limit | Value | Notes |
|---|---|---|
data-list page size |
200 | A larger or missing limit is clamped to 200. Cursors are opaque and last only for one run. |
watch_history page size |
50 maximum, 20 default | No cursor. Page-only namespace. |
propose-accounts |
500 accounts per call | A longer list is refused. |
propose-accounts account name |
200 characters | Longer names are clipped. |
search limit |
25 maximum, 10 default | A larger value is clamped to 25. A missing or non-positive value is 10. |
search, catalog results |
3 provider pages | Paging stops after three pages even if limit is not reached. |
set-link-token token |
1 to 4096 bytes | An empty or longer token is refused, as is one with control characters. |
report-sync-run message |
500 characters | Longer messages are clipped. |
Packages
| Limit | Value | Notes |
|---|---|---|
| Package download | 32 MiB (33,554,432 bytes) | The .wasm fetched from an index or remote source. |
Pages
| Limit | Value | Notes |
|---|---|---|
| Request body | 1 MiB | Over the limit answers 413. Bodies must be UTF-8 text, otherwise 415. |
| Forwarded request headers | content-type, accept, accept-language |
|
| Response headers kept | content-type only |
The host sets the security headers. |
| Invalid response | 502 | |
| Timeout | 504 | plugins.page_timeout_ms. |
| No free page slot | 503 with Retry-After: 2 |
See Runtime. |
The security headers are in Page response headers.
Shelves
| Limit | Value | Notes |
|---|---|---|
| Shelves per plugin | 4 | Keys are unique within the plugin. |
| Shelf key | 1 to 32 characters, a-z, 0-9, _, starting with a letter |
|
| Shelf title | 1 to 40 characters | |
ttl_seconds |
3,600 to 2,592,000 (1 hour to 30 days) | |
placement and scope |
home and user |
The only values accepted. |
limit handed to fill-shelf |
24 | The rail shows 12. |
feedback handed to fill-shelf |
50 entries | Newest first. |
| Candidates resolved per fill | 48 | Four times the 12 shown, taken in the order returned. |
| Candidate resolution | 6 at once, 10 s each | A title that takes longer is dropped. |
| Titles that must survive | 3 | Fewer keeps the previous list and counts the fill as done. |
reason |
140 characters | Collapsed to one line, then clipped. |
| Stored last error | 500 characters | |
| Refresh after an event | At least 1 hour after the last fill | An event marks the shelf stale; it never forces a fill sooner. |
| Backoff after a failed fill | 1 hour, then 6 hours, then the TTL | Never longer than the shelf's TTL. |
| Fill queue | 2 fills at once | Fills for different users run independently. |
| Fill timeout | 120 s | plugins.page_timeout_ms. |