settings.js. Capabilities are the unit of that grant.
How capability strings are structured
Every capability follows the Entity:sub-resource:operation naming scheme:- Entity — the top-level resource group (
node,fs,network, etc.) - Sub-resource — narrows the entity to a specific surface (
credentials,env,wires) - Operation — the action being gated (
read,write,delete,execute)
fs:read has two; node:credentials:read has three; vm:execute has two.
Shorthands exist at each level. node:credentials expands to node:credentials:read + node:credentials:write + node:credentials:delete. The resolver is single-level — nested shorthands must be listed explicitly in parent expansions.
How Sentinel identifies the calling package
Sentinel walks the call stack at runtime and extracts thenode_modules/<package> segment from the nearest frame that does not belong to Node-RED or Sentinel itself. The match is against the npm package name exactly as it appears on disk.
Blocked operation warning format
When Sentinel blocks a call, it logs the following to the Node-RED console:require() time (like vm and worker_threads), the operation throws immediately:
Capability groups
node:*
What a package can do to node objects in the runtime
flows:*
What a package can do to the deployed flow graph
network:*
What outbound network calls a package can make
fs:*
What file system operations a package can perform
process:*
What OS-level operations a package can perform
hooks:*
What message pipeline hooks a package can register
http:*
What HTTP routes and middleware a package can register
events:*
What a package can listen to or emit on the internal event bus
registry:*
What a package can do to the node type registry
settings:*
What a package can do to the runtime settings object
storage:*
What a package can do to the persistent storage layer
vm:*, threads:*, comms:*
VM contexts, worker threads, and the comms channel
All capability groups at a glance
| Group | What it gates |
|---|---|
node | Operations on live node objects obtained via RED.nodes.getNode() |
flows | Reading, writing, and deploying the flow graph via RED.runtime.flows.* |
network | Outbound HTTP, fetch, raw TCP/UDP sockets, DNS lookups, and inbound listeners |
fs | File system reads and writes via require('fs') and its variants |
process | Child process execution, process.env access, and process.exit() |
hooks | Message pipeline hook registration via RED.hooks.add() and .remove() |
http | Route and middleware registration on the admin and node Express instances |
events | Listening to and emitting on the RED.events internal event bus |
registry | Node type registration and lookup via RED.nodes.registerType() / getType() |
settings | Reading and writing RED.settings keys |
storage | Direct access to the persistence layer via RED.runtime.storage.* |
vm | Running code in isolated V8 contexts via require('vm') |
threads | Spawning worker threads via require('worker_threads') |
comms | Publishing to the server-to-editor WebSocket channel via RED.comms.publish() |