🎉 Node-RED 3.0.0-beta.1 released

:tada: The first beta release of Node-RED 3.0 is now available.

Node-RED 3.x requires at least Node 14.x or later. We recommend the current Active LTS release, Node 16.x.

Here are the highlights for this release.

The Change Log has the full list of changes.

Note: if any issues are reported against the beta, we'll update this post to list them here. If you hit a problem, please do check back here before adding a comment.

Known Issues

  • None

Wire Junctions

A new core node type has been added called junction that makes it easier to route the wires in a flow.

There are two ways of adding a Junction to a flow.

  • Shift-RightClick-Drag across the wire(s).


  • Using the Quick-Add dialog (Ctrl-click in the workspace to open)

  • You can move junctions by dragging them around.
  • To add a new wire from a Junction, Ctrl (Cmd) Click on it to start wiring - this will add a wire where the Junction is the source node.

Debug Path Tooltip

When hovering over a node name in the Debug sidebar, a new tooltip shows the full location of the node. This is useful when working with subflows, making it much easier to identify exactly which node generated the message.

Clicking on any item in the list will reveal it in the workspace.


Continuous Search

When searching for things in the editor, a new toolbar in the workspace provides options to quickly jump between the search results.


We've added a pair of new actions to help navigate the results:

  • core:search-previous - shortcut: shift-f
  • core:search-next - shortcut: f

Splitting wires

A new action has been added that will split a wire into a pair of Link nodes:


  • core:split-wire-with-link-nodes

Default node names

The Debug, Function and Link nodes are now given unique default names when they are added to the workspace.


This capability could be added to any node, including contrib nodes, via their onadd function. We chose just this initial set as they were the ones that would most benefit from having a name applied.

A new action has also been added that will apply an appropriate default name to any selected nodes that don't currently have a name:

  • core:generate-node-names

Monaco Text Editor

We added the monaco editor component as an alternative to the default ace editor a year ago in the 2.x release. It has proven to be very stable and provides a much richer user experience.

With 3.0, we have switched over to monaco as the default editor. New installs of Node-RED will pickup the change - existing installs will need to update the codeEditor entry in their settings file.

The ultimate goal will be to remove ace entirely in the 4.0 release in April next year.

Node Updates

Lots of good updates in the nodes:

  • The Debug node has a new option to output to its status a count of how many messages it has received
  • The HTTP Request node now lets you preconfigure HTTP Headers in the node itself
  • The Link Call node can now be dynamically targeted based on the messages it receives
  • Lots of fixes in the MQTT nodes


Be sure to read through the Change Log to see what else is in there.

Installing the beta

If you want to try out the beta, you will need specify node-red@next when you use npm to update. Without the @next you'll still get 2.2.x

So on a Pi you'd do:

sudo npm install -g --unsafe-perm node-red@next

Reporting problems

If you hit any problems, please report them either as a reply on this topic, or in the #core-dev slack channel. Please do not post new topics to the forum regarding the beta as that could confuse users who are not using the beta.

Outstanding work

This release contains pretty much everything we want to get into 3.0. There may be a final few bits and pieces, but nothing on the critical path.

The main work is documenting all these new features.

The goal is to release 3.0 at the end of this month.


Wire junctions don't appear to be working quite as expected?


Windows with node.js v16

Hmm... yes. Looks like an issue with handling Many-To-One. It's working fine in the One-To-Many case.

Sorry, you also can't move a wire from a junction either:


And I don't seem to be able to add a new wire from a junction? I have to wire "backwards" from the target node.

Liking the results though:

1 Like
  • move a wire from a junction either:

That is expected - I will update the description. To wire from a junction, you ctrl-click on it.

1 Like

It looks like you are holding SHIFT down in that sceenshot. Try moving a junction without holding SHIFT.

@TotallyInformation sorry, misunderstood your bit about removing a wire from a junction.

You are right - you cannot (currently) disconnect a wire from a junction like you can from a regular node port by shift-dragging with the wire selected. Will look at adding that in.

Sorry Steve, I was trying to move a wire from one junction to another the way you can when moving a wire from a normal node. Select the wire, hold shift and click on the junction.

Docker builds as nodered/node-red-dev@v3.0.0-beta.1 are available (along with the usual spread of NodeJS versions and minimal)



"The Link Call node can now be dynamically targeted based on the messages"

Wow, that'll make the command object design pattern prettier as I can get rid of the switch node :slight_smile:

Yeah, its a nice feature once its understood.

For anyone reading, this should give you a head start...


[{"id":"86a02eac9c04ee7f","type":"link call","z":"55525a9d18c99b86","name":"","links":[],"linkType":"dynamic","timeout":"30","x":1040,"y":1320,"wires":[["7cf21fdc4ef8c71e"]]},{"id":"dc6ee940a56aa3d5","type":"inject","z":"55525a9d18c99b86","name":"2 => timestwo","props":[{"p":"payload"},{"p":"target","v":"timestwo","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"2","payloadType":"num","x":870,"y":1320,"wires":[["86a02eac9c04ee7f"]]},{"id":"f98510d19a494813","type":"link in","z":"55525a9d18c99b86","name":"timestwo","links":[],"x":840,"y":1200,"wires":[["4f97edec87b5237c"]],"l":true},{"id":"d62020e8f463a0c1","type":"link out","z":"55525a9d18c99b86","name":"link out 1","mode":"return","links":[],"x":1105,"y":1200,"wires":[]},{"id":"4f97edec87b5237c","type":"function","z":"55525a9d18c99b86","name":"payload x 2","func":"msg.payload *= 2\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1000,"y":1200,"wires":[["d62020e8f463a0c1"]]},{"id":"937e65d2527f0e0d","type":"link in","z":"55525a9d18c99b86","name":"timesten","links":[],"x":840,"y":1240,"wires":[["4b6edee7a3a380e0"]],"l":true},{"id":"02b071d73722ce86","type":"link out","z":"55525a9d18c99b86","name":"link out 2","mode":"return","links":[],"x":1105,"y":1240,"wires":[]},{"id":"4b6edee7a3a380e0","type":"function","z":"55525a9d18c99b86","name":"payload x 10","func":"msg.payload *= 10\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1000,"y":1240,"wires":[["02b071d73722ce86"]]},{"id":"e26ddb0930c96ec3","type":"inject","z":"55525a9d18c99b86","name":"2 => timesten","props":[{"p":"payload"},{"p":"target","v":"timesten","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"2","payloadType":"num","x":870,"y":1360,"wires":[["86a02eac9c04ee7f"]]},{"id":"7cf21fdc4ef8c71e","type":"debug","z":"55525a9d18c99b86","name":"","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","x":1070,"y":1360,"wires":[]},{"id":"db8e8f959fac2c15","type":"inject","z":"55525a9d18c99b86","name":"2 => bad-target","props":[{"p":"payload"},{"p":"target","v":"bad-target","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"2","payloadType":"num","x":880,"y":1400,"wires":[["86a02eac9c04ee7f"]]}]

Weirdly, I think this may be one of the most useful changes for my use of Node-RED :slight_smile: and I never even knew I needed/wanted it until it just appeared!


I'm getting some weird errors from npm:

2 info using npm@6.14.16
3 info using node@v14.19.1
756 warn registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning EINTEGRITY: sha512-FqzBfTVlxs1SyslRi+HXReb+bQtJlcPIoEEjKcbEyAERh00
LKxTOpObE1PPlBh6g+KzLN0AjJuxDaMwRTBZO5w== integrity checksum failed when using sha512: wanted sha512-FqzBfTVlxs1SyslRi+HXReb+bQtJlcPIoEEjKcbEyAERh00LKxTOpObE1
PPlBh6g+KzLN0AjJuxDaMwRTBZO5w== but got sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==. (0 bytes)
758 silly fetchPackageMetaData error for uid-safe@~2.1.5 Invalid response body while trying to fetch https://registry.npmjs.org/uid-safe: Integrity verification failed for sha512-FqzBfTVlxs1SyslRi+HXReb+bQtJlcPIoEEjKcbEyAERh00LKxTOpObE1PPlBh6g+KzLN0AjJuxDaMwRTBZO5w== (/root/.npm/_cacache/content-v2/sha512/16/ac/c17d3565c6cd52cac9518be1d745e6fe6d0b4995c3c8a0412329c6c4c80111874d0b2b14cea4e6c4d4f3e5061ea0f8accb37402326ec4368cc114c164ee7)
759 silly fetchPackageMetaData error for on-headers@~1.0.2 Invalid response body while trying to fetch https://registry.npmjs.org/on-headers: Integrity verification failed for sha512-/DLH7n+zPmxJAVBHXx63MhZPfzL3HNvOGXBL8J+oulyIB8ZCgooMAAqBg8BhOQQkJC2wOwOq3WY9Zh4+JbV+8Q== (/root/.npm/_cacache/content-v2/sha512/fc/32/c7ee7fb33e6c490150475f1eb732164f7f32f71cdbce19704bf09fa8ba5c8807c642828a0c000a8183c061390424242db03b03aadd663d661e3e25b57ef1)

Has anyone else seen this?
Any idea, what's going wrong here?

Its an NPM issue on your machine.
Plenty of answers / solutions here: git - npm WARN registry Unexpected warning for https://registry.npmjs.org/: - Stack Overflow

Thank you, @Steve-Mcl - for pointing in the right direction!

sudo npm cache clear --force

... fixed the issue!

1 Like

I've been waiting for more than half a year... an still nothing new about the possibility of limiting the search only for the current flow.

No, sorry @softy2k , it didnt make the cut. And TBH, I cant remember why other items took priority.

Instead, there is "continuous search" which does make it easier to navigate search results. Hopefully that helps a little.

But - if time permits, I'll see if I can squeeze it in.

REF: feature: Allow search to be limited to the current flow · Issue #3419 · node-red/node-red · GitHub

1 Like

I'm so used to install & upgrade using the script. Can it be used for this upgrade as well? Something like below (better ask before jumping...)

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)  --nodered-version="3.0.0-beta.1" --node16

Should do. Probably better to use "next" (for current / most recent beta)...
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) --nodered-version="next" --node16

From NPM...

Please try and let us know.