settings.js.
The sentinel.allow map
Grants live in the sentinel.allow map inside settings.js. Each key is an npm package name exactly as it appears in node_modules/; the value is an array of capability strings.
my-package/nodes/foo.js from my-package/nodes/bar.js at the frame level — both resolve to my-package.
Sentinel only applies capability checks to packages loaded from the Node-RED userDir (
{userDir}/node_modules/ or {userDir}/nodes/). Node-RED’s own built-in nodes (inject, debug, function, http request, etc.) are part of the Node-RED installation itself and live outside the userDir, so Sentinel never gates them. You only need to add grants for third-party packages that users install into their userDir.registry:register — required for every node package
Every node package must be granted registry:register so Sentinel allows it to call RED.nodes.registerType() at startup. Without this grant, Sentinel blocks the call, the node type is never registered, and Node-RED logs “Waiting for missing types” indefinitely.
node-red.plugins key in package.json do not call registerType and do not need registry:register.
How Sentinel identifies the calling package
Sentinel identifies the calling package at runtime by walking the call stack and extracting 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.
Common grants
node:credentials:read — reading own credentials
node:credentials:read — reading own credentials
A node that reads
this.credentials directly in its own constructor or message handler.node:list, node:wires:read, flows:read — flow topology inspection
node:list, node:wires:read, flows:read — flow topology inspection
A flow-auditing plugin that needs to inspect the runtime topology.
hooks:on-send, hooks:post-deliver — message pipeline hooks
hooks:on-send, hooks:post-deliver — message pipeline hooks
A tracing or APM plugin that hooks the message pipeline.
hooks:on-send fires before routing; hooks:post-deliver fires after delivery.http:admin, http:node — admin and node HTTP routes
http:admin, http:node — admin and node HTTP routes
A node that registers its own admin UI routes.
http:admin covers httpAdmin; http:node covers httpNode.process:exec — running OS commands
process:exec — running OS commands
A node that genuinely needs to run OS commands.
fs:read — reading files from disk
fs:read — reading files from disk
A node that reads files from disk, for example a CSV reader.
network:http — outbound HTTP calls
network:http — outbound HTTP calls
A node that makes outbound HTTP calls.
network:http covers http.request/https.request. Add specific URLs to sentinel.networkPolicy.allowlist to restrict further.events:listen — listening to runtime events
events:listen — listening to runtime events
A plugin (no node types) that listens to runtime events. Plugins registered via the
node-red.plugins key in package.json do not call registerType, so no registry:register is needed.The blocked-operation warning format
When Sentinel blocks a call, it prints a warning to the Node-RED console that tells you exactly which grant to add:Using .sentinel-grants.json for UI-managed grants
Sentinel also looks for a .sentinel-grants.json file in the userDir (next to settings.js). This file is the backing store for the Sentinel editor panel — the Node-RED UI exposes admin API routes that read and write it directly, so operators can manage grants through the browser without touching settings.js.
This separation is intentional. In hardened deployments settings.js is mounted read-only so it cannot be modified at runtime. .sentinel-grants.json lives in the writable userDir, giving the UI panel a place to persist changes. The two files have different ownership: settings.js is managed by deployment tooling; .sentinel-grants.json is managed by the UI.
The file has two top-level sections:
packages— dynamic caller grants, equivalent tosettings.sentinel.allow. Entries here are merged withsettings.jsat runtime.nodeTypes— per-node-type target permissions. Keyed on the target node’s type, each entry lists which caller packages are allowed to perform a given operation on nodes of that type.