MQTT, the preinstalled node matrix, Palette management, and the FlowFuse Dashboard 2 extension (optional and not bundled)
MQTT involves more than entering a topic: the broker, protocol version, TLS, credentials (authentication data), authentication (identity verification), authorization (permissions), QoS, retained messages, and sessions each have distinct semantics. The Add-on also comes with 25 direct dependencies whose roles can be identified through an inventory, and it can install additional packages at startup. This chapter performs offline checks only: it does not connect or deploy.
Which Section Should You Read?
| Need | Reading path | You can skip |
|---|---|---|
| MQTT only | Core Concepts, Steps 1–4, MQTT, and Troubleshooting | Full package matrix, Palette, and Dashboard |
| Audit preinstalled nodes | Preinstalled Node Matrix | MQTT and Dashboard details |
| Prepare to install a package | Preinstalled Node Matrix and Palette Management | Dashboard migration details |
| Adopt or migrate a Dashboard | Palette Management and Dashboard Boundary | MQTT details |
First Distinguish Core Protocol Features, Preinstalled Packages, and Optional Packages
Add-on 22.0.1 embeds Node-RED 5.0.2 and HA WebSocket nodes 0.80.3. MQTT In, MQTT Out, and mqtt-broker are part of Node-RED core; the package matrix lists the Add-on image's direct dependencies; Palette Manager and npm_packages add third-party server code; and FlowFuse Dashboard 2 1.30.2 is optional and not bundled. Do not conflate these four layers.
| Layer | Baseline for this chapter | Security concerns |
|---|---|---|
| MQTT core nodes | Node-RED 5.0.2 mqtt in, mqtt out, and mqtt-broker | Broker ACLs, topics, QoS, retained messages, sessions, TLS, credentials, and message size |
| Add-on bundled direct dependencies | Exactly 25 entries in node-red/package.json | Not every entry appears in the Palette; some are runtime, theme, or wrapper support libraries |
| Custom packages | Palette Manager or the Add-on's npm_packages/system_packages | Supply-chain risk, native code, version drift, startup failure, and reconstruction after restoration |
| FlowFuse Dashboard 2 | @flowfuse/[email protected], optional and not bundled | Adds an HTTP route, Socket.IO, browser input, and widgets; its authentication boundary must be managed separately |
The Add-on has host_network: true and uart: true grants and mounts media:rw and share:rw storage. These settings indicate potential reachability or read/write access; they do not mean that MQTT, serial, File, File In, or Watch is in use. For every external connection or file node, pin the destination, topic, device, and path individually. See Chapter 21 for backup and secret-handling guidance.
Make Each MQTT Choice Independently
The broker connection configuration determines the transport, protocol version, and session. MQTT In determines the subscription filter, subscription QoS, and output data type. MQTT Out determines the publication topic, QoS, retained-message setting, and MQTT 5 properties. Selecting a TLS checkbox does not create a topic ACL, and choosing QoS 2 does not make downstream business operations execute “exactly once.”
| Item | Precise meaning | Common misconception |
|---|---|---|
| Topic | A subscription may use +/# filters; a publication topic cannot contain wildcards | Subscribing to the entire # tree does not mean that all its data may be disclosed or processed |
| QoS 0 | At-most-once delivery; messages may be lost | Low overhead does not mean that errors and disconnections can be ignored |
| QoS 1 | At-least-once delivery; duplicates are possible | A broker acknowledgment does not mean that a business side effect runs only once |
| QoS 2 | An exactly-once delivery handshake at the protocol layer | It does not guarantee end-to-end exactly-once behavior for a flow, external API, or device |
| Retain | The broker retains the last retained message for that topic and delivers it to later subscribers | It is not a historical database; an incorrect retained command can continue to affect new clients |
| Session | Clean session/clean start, client ID, session expiry, and broker state determine behavior together | It is not Node-RED Context and does not guarantee that data will never be lost |
| TLS/credentials | TLS protects transport and server identity; a username/password authenticates with the broker | Neither replaces per-client publish/subscribe ACLs |
MQTT 5 adds properties and subscription flags. When you select MQTT 3.1 or 3.1.1, you cannot rely on MQTT 5 features such as response topic, correlation data, content type, message expiry, user properties, no local, retain as published, retain handling, or session expiry. Pin the version supported by the broker before configuring nodes; do not rely on the client to guess.
For high-frequency MQTT and large-payload testing, follow the approach in Chapter 18: debug only allowlisted fields and limit the number of cases. See Chapter 5 for message-shape and data-type fundamentals.
Six Offline Checks Without Establishing a Broker Connection
- Create a topic contract.
For each direction of data flow, record a placeholder topic, publisher, subscriber, payload schema, maximum byte size, permitted frequency, QoS, retained-message setting, and duplicate-handling strategy. Do not enter a real broker, client ID, or credentials.
- Select the protocol and session behavior.
Explicitly record MQTT 3.1, 3.1.1, or 5. Then decide on clean session/clean start, client ID, automatic unsubscription, and MQTT 5 session expiry. Leave fields unsupported by the selected protocol blank.
- Read the example JSON offline.
Open 14-mqtt-in-out.json. Confirm that both MQTT In and MQTT Out have
d:true, that the broker configuration hasautoConnect:false, and that the host, client ID, and topics are complete placeholders with no credentials. - Check TLS and ACLs.
In the written specification, require a controlled TLS configuration, server-certificate verification, separate client credentials, and least-privilege publish/subscribe topic ACLs. Never put secrets in a broker URL, Function node, flow export, or Debug output.
- Conditional: inventory package sources.
Only when auditing preinstalled nodes or evaluating an installation, compare against this chapter's 25-entry bundled matrix. Record the exact npm package and pinned version, maintenance status, license, transitive dependencies, permissions, and removal procedure. This chapter does not install anything; MQTT-only readers may skip this step.
- Conditional: document package or Dashboard failures and recovery.
Only when packages or Dashboard are involved, document package startup failures, route/Socket.IO problems, and recovery procedures. Record broker unreachability, certificate errors, ACL denials, duplicates, stale retained messages, and session recovery in the MQTT topic contract. Keep the relevant nodes disabled and perform no I/O.
Offline MQTT contract (not connection configuration)
broker: PLACEHOLDER_MQTT_BROKER_HOST
client id: PLACEHOLDER_MQTT_CLIENT_ID
subscribe: PLACEHOLDER_MQTT_INPUT_TOPIC
publish: PLACEHOLDER_MQTT_OUTPUT_TOPIC
protocol: PLACEHOLDER_MQTT_VERSION
max payload: PLACEHOLDER_LIMIT
credentials: store only in the controlled credentials store
network action: do not execute
End-of-Chapter Offline Acceptance Check
| Artifact | Expected content | Stop if |
|---|---|---|
| Topic contract | Placeholder topic, publisher/subscriber, payload shape/bytes/frequency, QoS, retained-message setting, ACLs, and duplicate handling | A real broker/client/topic/secret appears, or payload and ACL boundaries remain undefined |
| Protocol/session decision | Pinned MQTT version, clean start/session behavior, client-ID rules, expiry, TLS server verification, and credentials storage location | The design relies on broker auto-detection, shares a client ID, disables certificate verification, or uses fields unsupported by the protocol |
| Disabled-state check | MQTT In/Out have d:true, the broker has autoConnect:false, and no installation, connection, Dashboard, file, or serial action occurs | Any executable node is enabled, connects at startup, or requires broker access to complete acceptance |
Node-RED 5.0.2 MQTT In, MQTT Out, and Broker Fields
MQTT In: Subscriptions and Output Data Types
| Field | 5.0.2 options | Security boundary |
|---|---|---|
| Broker | Required mqtt-broker configuration reference | Select only an approved configuration; do not accept an external broker override |
| Action/Topic | A Static topic has no input; with a Dynamic topic, the node has one input | Prefer a fixed subscription filter; permit dynamic actions only from controlled internal messages |
| QoS | 0, 1, or 2 | This is the requested maximum subscription QoS; you must still handle duplicates and broker downgrades |
| MQTT 5 flags | nl (no local), rap (retain as published), and rh (retain handling 0/1/2) | Shown and effective only for an MQTT 5 broker; define each value explicitly rather than copying defaults |
| Output | auto-detect, legacy auto, buffer, UTF-8 string, parsed JSON, or Base64 | Auto-detected types still require validation; with an explicit schema, prefer a fixed output type |
MQTT In output includes at least msg.topic, msg.payload, msg.qos, and msg.retain. An MQTT 5 packet may also expose responseTopic, correlationData, contentType, messageExpiryInterval, payloadFormatIndicator, reasonString, and userProperties. Treat all of these as untrusted broker/message metadata; never use them directly to select a Home Assistant Action, file path, or HTTP URL.
MQTT Out: Publication Fields and Message Overrides
MQTT Out has Broker, Topic, QoS, and Retain fields. If Topic is blank, it may use msg.topic; if QoS or Retain is blank, it may use the corresponding message value. A topic, QoS, or retained-message setting fixed in the node takes precedence. This flexibility also means that an untrusted message can change publication behavior. Remove or validate msg.topic, msg.qos, and msg.retain on external input.
MQTT 5 also supports User Properties, Response Topic, Correlation Data, Content Type, and Message Expiry. A Response Topic is protocol metadata; it does not create a secure RPC mechanism. Design the reply-topic ACL, correlation uniqueness, timeout, duplicate handling, and late-reply handling separately. A publication topic cannot contain + or #.
mqtt-broker: Connection, Security, Sessions, and Messages
| Tab/group | 5.0.2 fields | Configuration principle |
|---|---|---|
| Connection | Name, Broker, Port, Auto-connect, Use TLS/TLS config, Protocol Version 3/4/5, Client ID, and Keepalive | Enter a host or controlled scheme in Broker; pin the port, verify the server certificate with TLS, and use a unique client ID for each persistent session |
| Session | Clean session (v3/v4) or Clean start (v5), and Auto unsubscribe; v5 also has Session Expiry and User Properties | A non-clean session requires a client ID; impose limits and cleanup policies on offline queues and stale subscriptions |
| Security | Username and Password credentials | Store them in the Node-RED credentials store, not in a broker URL or flow JSON; use broker ACLs to restrict topics in both directions |
| Messages | Birth, Close, and Will each have Topic, Payload, QoS, and Retain fields | Configure them only for an explicit lifecycle requirement; avoid retained commands, and keep payloads fixed and free of secrets |
| MQTT 5 message properties | Content Type, User Properties, Response Topic, Correlation Data, and Expiry; Will also has Delay | Use only with v5; constrain byte size, type, and expiry, and never let external input select a control topic |
When importing an old broker configuration, also inspect the persisted verifyservercert value. The legacy default defined by the 5.0.2 editor is false; if the TLS configuration does not provide rejectUnauthorized, the runtime uses that value as a fallback. Migrate an old configuration to an approved TLS configuration and confirm that the resulting value is rejectUnauthorized=true. Enabling only the TLS toggle indicates encrypted transport; it does not prove that the broker's identity is verified.
Protocol value 3 is MQTT 3.1 compatibility, 4 is MQTT 3.1.1, and 5 is MQTT 5. When auto-connect is disabled, 5.0.2 allows a controlled action message to connect or disconnect. That capability is not an entry point for this chapter: never wire an external payload from MQTT In or HTTP In directly to broker control. Because the Add-on's host_network:true setting may make more local services reachable, a broker allowlist and ACLs are especially important.
d:true. A configuration node does not have a d field, so autoConnect:false prevents it from establishing a connection. The MQTT In/Out broker fields reference only a configuration ID in the same file; the actual host, client ID, input topic, and output topic are all placeholders.Role Summary for the Direct Dependencies in Add-on 22.0.1
The pinned node-red/package.json contains 25 direct dependencies: 19 provide Palette/configuration nodes, 1 is the Node-RED runtime, 1 is an editor theme, and 4 are wrapper/runtime support libraries. This is not the complete transitive dependency tree. Preinstalled means available; it does not mean that any flow has run the package. Readers interested only in MQTT may skip the reference inventory below.
Expand the complete matrix of 25 direct dependencies
| Package/pinned version | Role | Purpose and primary risk |
|---|---|---|
[email protected] | Wrapper support library, not a Palette node | Hashes passwords for HTTP Basic Auth; never expose plaintext or hash input, and do not misrepresent it as an available node |
[email protected] | Wrapper/runtime support library, not a Palette node | Parses YAML; still constrain the byte size, structure, and types of untrusted YAML |
[email protected] | Runtime baseline, not an additional Palette node | Provides the editor, runtime, and core nodes; do not confuse its version with Add-on 22.0.1 |
[email protected] | Palette nodes | Schedules may repeat or trigger downstream actions at the wrong time because of time zones, DST, or restarts |
[email protected] | Palette/configuration nodes | Connects to and controls Cast devices; pin the device, media URL, and network scope |
[email protected] | Palette node | Validate increment/decrement/reset inputs and restart state to prevent an incorrect threshold from triggering an action |
[email protected] | Palette/configuration nodes | Can read HA and perform actions; protect tokens and environment IDs, and constrain side effects node by node |
[email protected] | Palette/configuration nodes | Queries/writes a database; pin query/write shapes, credentials, and retention |
[email protected] | Palette node | Handle out-of-order, missing, and duplicate data, as well as post-deploy state, to avoid incorrect durations |
[email protected] | Palette/configuration nodes | Can read and write OT/physical devices; pin host, unit, address, and function, and keep every write disabled |
[email protected] | Palette node | Pin the time zone, locale, and input format to avoid parsing ambiguity or DST errors |
[email protected] | Palette node | Validate persistent states and transitions; after recovery, confirm state before allowing an action |
[email protected] | Palette node | Location/time-zone data may be sensitive; restarts, DST, and polar-region dates may cause missed or duplicate events |
[email protected] | Palette node | Handle time zones, DST, and midnight crossings explicitly so messages do not enter the wrong side-effect branch |
[email protected] | Palette node | Base64 is encoding, not encryption; its output may still contain secrets |
[email protected] | Palette/configuration nodes | Receiving or sending email creates network and data-exfiltration risks; pin recipients, attachments, and credentials |
[email protected] | Palette node | Fetches an external feed; pin the HTTPS URL, response limit, and timeout, and treat the content as untrusted |
[email protected] | Palette node | Can probe through the host network; pin the host and frequency, and reject dynamic destinations |
[email protected] | Palette node | Does not provide cryptographic randomness; never use it for tokens, passwords, nonces, or authorization decisions |
[email protected] | Palette/configuration nodes | Can read and write physical devices through the UART grant; pin the device path, baud rate, and command, and keep writes disabled |
[email protected] | Palette node | Validate numeric types and limit the sample window to prevent unbounded state or incorrect smoothing |
[email protected] | Palette node | Coordinates reveal sensitive location data; handle time zones, DST, and dates without a valid sunrise or sunset |
@node-red-contrib-themes/[email protected] | Editor theme, not a runtime Palette node | Changes appearance only; it is neither a security control nor a flow feature |
[email protected] | Wrapper/runtime support library, not a Palette node | Processes data line by line; still constrain the size and errors of large or untrusted files |
[email protected] | Stack support library, not a Palette node | Presence in the list does not prove registration; stacks/logs may still expose paths and sensitive data |
Cast, InfluxDB, Modbus, email, feedparser, ping, and serialport can perform network, database, or physical I/O. BigTimer, SunEvents, and suncalc-related nodes may generate messages autonomously based on time. Even apparently pure transformations such as Counter, moment, and smooth can pass an incorrect result to a downstream action. Follow Chapter 17 to separate computation from side effects; do not omit validation merely because a package is bundled.
Palette, npm_packages, and Startup Persistence
Palette Manager installs a node module, whose server-side JavaScript runs with the permissions of the Node-RED process; this is not merely a UI change that adds an editor icon. On every startup, the Add-on processes npm_packages by changing to /opt and running npm install --omit=dev --omit=optional. It first installs system_packages with the Alpine package manager, then processes npm packages, and finally runs eval on each line of init_commands. Any failure aborts initialization.
| Method | Persistence/startup behavior | Key controls |
|---|---|---|
| Image-bundled pins | Provided by the Add-on image, with all 25 direct versions pinned | Compare the package matrix and node behavior when upgrading the Add-on |
| Palette Manager | Manages extra nodes in the Node-RED user directory; the Add-on fixes nodesDir=/config/nodes | Pin version and source before installation; confirm that dependencies can be reconstructed after backup/restore |
npm_packages | The Supervisor option declaration persists, but package installation runs again whenever the Add-on starts | Use a full package name plus an exact version; an unavailable registry or installation error prevents startup |
system_packages | Updates the index and then installs each item on every startup | Native execution surface, architecture, repository availability, and startup time |
init_commands | Runs shell eval line by line after installation | It is not a package manager; never put secrets in it or use it to bypass pinning, and do not run it in this chapter |
Do not record only a package name or a loose semver range. At minimum, retain the exact version, official registry identity, source repository, license, maintainer, publication date, known advisories, Node/Node-RED compatibility, a transitive-tree summary, and a rollback version. Pinning a direct version does not make every transitive dependency immutable. Generate a reproducible lock/inventory in an isolated environment, then update it through the formal process.
Add-on backups explicitly exclude node_modules, so restoration does not reproduce the installation tree byte for byte. Custom declarations, package metadata, and an available registry must be sufficient to reconstruct the same dependencies. Startup-time installation also adds an availability dependency. Do not manage the same package with both Palette Manager and npm_packages, which would make ownership and version ambiguous.
File/File In/Watch and Mounted Storage
Node-RED core also includes File, File In, and Watch. The Add-on's media:rw and share:rw grants give the container potential read/write access; they do not automatically authorize a flow to use any path. If a file name comes from MQTT, Dashboard, or HTTP input, it can enable path traversal, overwriting, or data exfiltration. Pin the base directory, allowlist file names, constrain byte size and frequency, and keep all writes disabled. The same principle applies to serial nodes: uart:true is a grant, not approval for arbitrary device commands.
FlowFuse Dashboard 2 1.30.2: Optional and Not Bundled
The 25-entry dependency list for Add-on 22.0.1 does not include @flowfuse/node-red-dashboard. Pinned package version 1.30.2 declares Node >=14 and Node-RED >=3.0.0. Node-RED 5.0.2 is within those declared ranges, but you must still test it in the target Add-on. The package registers 5 configuration nodes and 22 ui-* widgets—a total of 27 registrations—and adds server code, browser code, an HTTP route, and Socket.IO communication.
| Boundary | 1.30.2 behavior | Required verification |
|---|---|---|
| Package identity | @flowfuse/[email protected] | Use the scoped package and exact version; do not accidentally select the unscoped legacy package |
| Route | The ui-base path defaults to /dashboard and is mounted under Node-RED's httpNodeRoot | The Add-on root is /endpoint; verify the actual external path, proxy rewrites, and conflicts in an isolated environment |
| PWA manifest | /dashboard/manifest.webmanifest is a hard-coded route; a custom ui-base.path does not change it, and it sits outside the route-local Dashboard middleware for the custom path | When using a custom path, explicitly test this fixed route's external path, authentication, authorization, and expected response |
| HTTP authentication | Dashboard has its own optional HTTP middleware; the Add-on editor, Ingress, and direct endpoint are separate layers | Initial HTML, setup, assets, and page routes must all follow the same authentication and authorization policy |
| Socket.IO | The socket path combines httpNodeRoot, the Dashboard path, and socket.io; ioMiddleware can be configured separately | Test the handshake, same-origin policy, session authentication, message-size limits, proxy upgrade/streaming, and reconnection |
| Browser input | Buttons, forms, templates, and other widgets can send data back to a flow | Treat all input as untrusted; enforce schemas, authorization, rate limits, and isolation from downstream side effects |
The Add-on's direct NGINX /endpoint/ path does not pass through the editor's Supervisor auth_request. Ingress accepts only the Supervisor ingress source, but that does not imply that every Dashboard user has widget authorization. Verify whether http_node Basic Auth protects your route and Socket.IO session over the actual proxy path. With a custom Dashboard path, test the custom route and the hard-coded /dashboard/manifest.webmanifest separately for path and authentication behavior. Never assume that the Dashboard page, manifest, assets, and real-time channel are secure merely because the editor requires login.
@flowfuse/node-red-dashboard. This chapter provides neither Palette installation steps nor a directly usable npm_packages value. Before installing any optional package, complete the pinning, supply-chain, routing, and recovery plan described above.Legacy Migration, Not a Drop-In Replacement
The old, unscoped node-red-dashboard is based on Angular v1 and is considered legacy; this chapter does not teach a fresh installation. The former scoped name @flowforge/node-red-dashboard is deprecated and no longer updated. FlowFuse Dashboard 2 is a rewrite. Do not claim that existing ui_* nodes, themes, layouts, custom templates, browser scripts, URLs, authentication, or client state will migrate automatically and unchanged.
First inventory the existing legacy flow's pages/groups/widgets, template code, routes, authentication, CSS, browser dependencies, and message contracts. Then rebuild and compare it page by page in an isolated copy. Running the legacy and new Dashboards in parallel also requires preventing conflicts in routes, Socket.IO, credentials, and duplicate side effects. Do not remove the old package first, and do not connect a new widget to a production action.
Troubleshooting
- MQTT node remains disconnected: Keep In/Out disabled and check, in order, the placeholder, DNS, port, protocol version, TLS chain, server hostname, client ID, credentials, and broker ACL. Do not begin by disabling certificate validation or switching to anonymous access.
- Duplicate messages arrive: QoS 1, reconnection, or a subscriber restart may cause redelivery. Use a stable message ID/business key for bounded deduplication and record the retention period. Do not assume that QoS 2 provides end-to-end exactly-once side effects for HA, email, or a database.
- A new subscription immediately receives an old command: Inspect the packet's retain flag and the broker's retained state. Do not use this chapter's example to publish a clearing message; first have the broker administration process confirm the topic, permissions, and scope of impact.
- Subscriptions behave unexpectedly after a non-clean session: Confirm that the client ID is unique and stable, and check session expiry, automatic unsubscription, broker queue limits, and whether an old client remains online. Never share a client ID across multiple instances.
- JSON output reports a parse error: Confirm the content type, encoding, and publisher schema. Do not switch unparseable bytes to auto-detect and then treat the result as a trusted object. Limit payload byte size and route errors to a bounded Catch path.
- The Add-on fails to start after a custom package is added: Check the exact package, architecture, registry availability, and the fail-fast
system_packages→npm_packages→init_commandssequence. Use the recorded rollback version; do not repeatedly try unpinned versions. - A package appears in the Palette inventory, but the expected node does not: Check the package's role first. bcryptjs, js-yaml, line-by-line, source-map-support, the Node-RED runtime, and the theme collection are not ordinary runtime Palette nodes. Then inspect the package's actual registrations and startup log.
- The Dashboard page opens, but real-time data does not update: Check the external route rewrite, Socket.IO path, HTTP and Socket.IO middleware, proxy streaming/upgrade, same-origin policy, and session separately. Do not expose the direct endpoint or remove authentication for troubleshooting.
- A migrated legacy Dashboard flow has a different layout/template: Dashboard 2 is not a drop-in replacement. Rebuild configuration nodes, widgets, layouts, CSS, templates, and message contracts page by page. Do not freshly install the legacy package or directly interchange the two sets of node names.
Pinned Versions and Official Documentation
This chapter uses exact commits to verify MQTT fields, the 25 direct dependencies, startup installation order, and Dashboard 2 boundaries. External brokers and organizational ACLs are environment-specific policies; this source code does not provide them automatically.
- Home Assistant Community App: Node-RED 22.0.1 pinned commit: 25 direct dependencies, grants, maps,
system_packages,npm_packages, and startup order. - Node-RED 5.0.2 pinned commit: MQTT In/Out/broker, TLS, WebSocket/TCP/UDP, and File/File In/Watch.
- FlowFuse Dashboard 2 1.30.2 pinned commit: package identity, compatibility, 27 registrations, routes, and Socket.IO.
- Official Node-RED documentation: Core nodes.
- Official Node-RED documentation: Adding nodes.
- Official Node-RED documentation: Securing Node-RED.
- Official FlowFuse Dashboard 2 documentation.
- Disabled example on this site: 14-mqtt-in-out.json. Read the safe example guidance before importing.
Frequently Asked Questions
Does QoS 2 guarantee that a Home Assistant Action runs only once?
The broker ACL has not been approved. Can I test with a shared administrator account first?
The example mqtt-broker configuration does not have d:true. Will it connect automatically?
d field. The example fixes autoConnect at false, and both MQTT In/Out nodes have d:true. The host and client ID are also placeholders, so do not replace them, enable the nodes, or deploy.The Add-on preinstalls 25 packages. Does that mean the Palette gains 25 sets of nodes?
Can I enter only a package name in npm_packages and automatically track the latest version?
Does FlowFuse Dashboard 2 come with the Add-on?
@flowfuse/[email protected] is optional and not bundled; it is not one of the 25 bundled direct dependencies. Adding it introduces routes, Socket.IO, and browser input, so it requires separate supply-chain, authentication, and proxy design.Can I freshly install the old node-red-dashboard in a new flow?
node-red-dashboard is an Angular v1 legacy package; the new scoped package is a rewrite, not a drop-in replacement. For existing systems, inventory and migrate in stages rather than creating a new legacy deployment.