Storage & I/O
The per-server key-value store, encrypted secrets, sandboxed SQL, ephemeral state, outbound HTTP, WebSockets, metrics and logging.
Key-value store
Per-server JSON store. Keys are namespaced to your plugin and the active server — you cannot read another plugin's keys, and your keys for server A are isolated from server B.…
Encrypted secrets
For third-party API keys, signing secrets and webhook tokens use ctx.secrets instead of ctx.kv . Secrets are encrypted at rest (AES-GCM with the platform master key) and stay out…
Sandboxed SQL
For relational data heavier than KV. Each (plugin, server) pair gets its own isolated Postgres schema: your tables for server A and server B are physically separate, so you never…
Ephemeral state
Backed by Redis — fast counters, dedup, cooldowns, and short-lived flags. Don't use this for anything you need durably (eviction policy is LRU under memory pressure). No…
Outbound HTTP
Plugins have --network none in the sandbox — every outbound request goes through the platform proxy. Capability: proxy:http . resp =…
WebSockets
For live feeds a request-per-poll is the wrong shape. ctx.ws keeps a persistent two-way connection open to a host you declared, held by the platform's broker (your sandbox still…
Metrics
Time-series counters with optional tags. Show up on your plugin's dashboard via ctx.metrics.query . ctx.metrics.record("commands_used") # +1 ctx.metrics.record("xp_awarded",…
Logging
Plugin logs land in the dev portal logs viewer with full timestamp, level, and tags. ctx.log("Plugin booted") ctx.log("User joined", level="info", tags=["onboarding"])…
Limits that apply on this tab
Area Limit KV 50,000 keys per (server, plugin), 500,000 per plugin globally; 64 KB values, 512-byte keys; get_many 50 / set_many 25 / list 1000 / list_values 100 per call Secrets…