# Write nodes using modern tooling

**URL:** <https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739>\
**Category:** Developing Nodes\
**Created:** [19 August 2025 21:19 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739 "2025-08-19T21:19:37Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![AllanOricil](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/allanoricil/32/106911_2.png) [@AllanOricil](https://discourse.nodered.org/u/AllanOricil)\
**Post date:** [19 August 2025 21:19 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/1 "2025-08-19T21:19:37Z")

</div>

> **[GitHub - AllanOricil/node-red-vue-template: Write Node-RED nodes using Vue and Typescript](https://github.com/AllanOricil/node-red-vue-template)**
>
> Write Node-RED nodes using Vue and Typescript

- It has server side validation for configs and messages using json schemas
- node forms can be written using vue

And a lot more...

---

<div class="post-metadata">

**Author:** ![AllanOricil](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/allanoricil/32/106911_2.png) [@AllanOricil](https://discourse.nodered.org/u/AllanOricil)\
**Post date:** [21 August 2025 23:38 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/2 "2025-08-21T23:38:39Z")

</div>

Node-RED core team can adapt my design ideas to the core. I only want the recognition.

@knolleary @dceejay @hardillb

---

<div class="post-metadata">

**Author:** ![dceejay](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dceejay/32/38_2.png) [@dceejay](https://discourse.nodered.org/u/dceejay)\
**Post date:** [26 August 2025 20:02 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/3 "2025-08-26T20:02:31Z")

</div>

Happy to recognise you, but currently we do not use typescript nor Vue in the core - so are unlikely to pull it in directly. Happy for it to exist as part of the eco-system.

---

<div class="post-metadata">

**Author:** ![AllanOricil](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/allanoricil/32/106911_2.png) [@AllanOricil](https://discourse.nodered.org/u/AllanOricil)\
**Post date:** [28 August 2025 22:56 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/4 "2025-08-28T22:56:07Z")

</div>

I wanted to make node-red popular among developers making its dx closer to what people are used to nowadays. Also wanted to get recognized in the community for doing something nobody dared to do yet. Im an attention seeker 😅

---

<div class="post-metadata">

**Author:** ![Sean-McG](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/sean-mcg/32/54677_2.png) [@Sean-McG](https://discourse.nodered.org/u/Sean-McG)\
**Post date:** [28 August 2025 23:19 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/5 "2025-08-28T23:19:18Z")

</div>

Happy Cake day 🥳

---

<div class="post-metadata">

**Author:** ![AllanOricil](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/allanoricil/32/106911_2.png) [@AllanOricil](https://discourse.nodered.org/u/AllanOricil)\
**Post date:** [28 August 2025 23:45 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/6 "2025-08-28T23:45:54Z")

</div>

Thanks @Sean-McG

---

<div class="post-metadata">

**Author:** ![gregorius](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/gregorius/32/73816_2.png) [@gregorius](https://discourse.nodered.org/u/gregorius)\
**Post date:** [29 August 2025 07:05 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/7 "2025-08-29T07:05:10Z")

</div>

> [@AllanOricil](#):
>
> I wanted to make node-red popular among developers

Always remember that there are two distinct Node-RED communities:

- developers that create nodes for a ...
- ... community of users who develop flows based on the nodes developed by "developers"

These two are largely distinct with minimal overlap.

Developers of nodes use Node-RED - of course - but for their purposes. The larger community of "users" who enjoy the drag-drop-link-deploy-rinse-repeat interface of Node-RED to solve their problems don't tend to develop nodes to solve their problems. They might develop sub-flows to encapsulate certain repeated functionality but that's about it.

My aim is to empower the latter community to develop their own node solutions for their problems. Therefore _within_ Node-RED as a flow --\> ta'da --\> [NodeDev](https://flows.nodered.org/node/@gregoriusrippenstein/node-red-contrib-nodedev) --\> and it's not the best solution nor the only possible solution however it is an attempt to address - IMHO - the correct audience for a new concept of node development.

And why is this differentiation important? Because having non-paid developers create solutions for problems they don't have is a dead-end. The "user" community wants everything for "nothing" (in the sense of money) while developers just want to solve their problems. Sure certain things will be done because developers find them interesting or they have a similar problem but they won't be 100% solutions.

Here comes the next issue: hardware - developers mostly don't have access to the hardware for which Node-RED solutions are missing. So then you will need to give developers access to hardware for them to develop node solutions.

Giving developers that are fine with the current method of developing nodes - no matter how inefficient it might seem - new tooling is an uphill battle of convincing folks who already know and more importantly are comfortable with their setup.

There other approaches, for example @BartButenaers brilliant [Blockly](https://flows.nodered.org/node/node-red-contrib-blockly) node that allows code development inside Node-RED using [blockly](https://developers.google.com/blockly/).

---

<div class="post-metadata">

**Author:** ![AllanOricil](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/allanoricil/32/106911_2.png) [@AllanOricil](https://discourse.nodered.org/u/AllanOricil)\
**Post date:** [29 August 2025 11:54 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/8 "2025-08-29T11:54:33Z")

</div>

> [@gregorius](#):
>
> Giving developers that are fine with the current method of developing nodes - no matter how inefficient it might seem - new tooling is an uphill battle of convincing folks who already know and more importantly are comfortable with their setup.

I agree with you. Maybe my creation is useful mostly by conpanies that offer products using Node-RED and that care for code quality (hello Flowforge 😄). Since they make money with it, enforcing code quality and best practices is valuable because developers can fix bugs or release new features faster. New developers can also be onboarded to projects way faster when its source code is modular and organized.

I just wanted to be reminded for improving something. No way I will die without contributing to our evolution, and been noticed by other peers.

> [@gregorius](#):
>
> There other approaches, for example @BartButenaers brilliant [Blockly](https://flows.nodered.org/node/node-red-contrib-blockly) node that allows code development inside Node-RED using [blockly](https://developers.google.com/blockly/).

Really creative indeed!

---

<div class="post-metadata">

**Author:** ![gregorius](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/gregorius/32/73816_2.png) [@gregorius](https://discourse.nodered.org/u/gregorius)\
**Post date:** [29 August 2025 12:21 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/9 "2025-08-29T12:21:03Z")

</div>

A company that I discovered recently was strato automation (Canada based). I discovered them because one of their nodes was downloaded 6000 times - last week! They have incorporated node red into their hardware products.

If you take a look into their node package (there is no source code online) then you’ll see that all their JS code is minified and obfuscated - another requirement for company node code.

EDIT: This package [node-red-contrib-strato-apps-beta-test](https://flows.nodered.org/node/node-red-contrib-strato-apps-beta-test) but only 5k and this [company](https://stratoautomation.com/systems-overview/) - they even reference Node-RED.

---

<div class="post-metadata">

**Author:** ![jbudd](https://avatars.discourse-cdn.com/v4/letter/j/5f8ce5/32.png) [@jbudd](https://discourse.nodered.org/u/jbudd)\
**Post date:** [29 August 2025 12:34 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/10 "2025-08-29T12:34:16Z")

</div>

I fit pretty firmly within @gregorius' second category of users - seems I'm not entitled to self-identify as a developer 🙃

Will your tool help me to extend a pre-existing node?

For example I would like to add an additional action category for the change node: "OS command" which would pass the payload to an OS one-liner.

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/e/5/e5cdb92566ed8ac6ed56299e45847168a081b116.png)

---

<div class="post-metadata">

**Author:** ![gregorius](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/gregorius/32/73816_2.png) [@gregorius](https://discourse.nodered.org/u/gregorius)\
**Post date:** [29 August 2025 12:47 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/11 "2025-08-29T12:47:11Z")

</div>

Checkout the [sidebar](https://github.com/gorenje/node-red-contrib-nodedev?tab=readme-ov-file#importing-existing-packages) of the nodedev package. There you'll find a package importer (factory symbol) where existing packages can be imported - as flows and then can be extended/modified in NodeRed - no editor required!

EDIT: added link to anime gif

---

<div class="post-metadata">

**Author:** ![AllanOricil](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/allanoricil/32/106911_2.png) [@AllanOricil](https://discourse.nodered.org/u/AllanOricil)\
**Post date:** [29 August 2025 12:57 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/12 "2025-08-29T12:57:54Z")

</div>

> [@jbudd](#):
>
> seems I'm not entitled to self-identify as a developer 🙃

I didn't mean to say people who write nodes using node-red aren't developers. Sorry if it sounded like that.

---

<div class="post-metadata">

**Author:** ![Colin](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/colin/32/17040_2.png) [@Colin](https://discourse.nodered.org/u/Colin)\
**Post date:** [29 August 2025 13:00 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/13 "2025-08-29T13:00:32Z")

</div>

> [@gregorius](#):
>
> There you'll find a package importer (factory symbol) where existing packages can be imported

Does this work with node-red core nodes?

---

<div class="post-metadata">

**Author:** ![gregorius](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/gregorius/32/73816_2.png) [@gregorius](https://discourse.nodered.org/u/gregorius)\
**Post date:** [29 August 2025 13:13 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/14 "2025-08-29T13:13:09Z")

</div>

They aren't packages so no.

---

<div class="post-metadata">

**Author:** ![TotallyInformation](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/totallyinformation/32/31_2.png) [@TotallyInformation](https://discourse.nodered.org/u/TotallyInformation)\
**Post date:** [29 August 2025 13:19 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/15 "2025-08-29T13:19:17Z")

</div>

> [@jbudd](#):
>
> I fit pretty firmly within @gregorius' second category of users - seems I'm not entitled to self-identify as a developer

🤣 The first rule of programming is .... There are no rules! Except when there are. Maybe.

---

<div class="post-metadata">

**Author:** ![dceejay](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dceejay/32/38_2.png) [@dceejay](https://discourse.nodered.org/u/dceejay)\
**Post date:** [29 August 2025 13:28 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/16 "2025-08-29T13:28:00Z")

</div>

> [@jbudd](#):
>
> pass the payload to an OS one-liner.

err - isn’t that what the exec node does ? and no we don’t want to extend other nodes to include OS calls - as that is one of the things some organisations don’t like - (executing arbitrary code) - so being able to block the exec node is good… having to extend that to block (parts of) other nodes as well somehow would be a real pain.

---

<div class="post-metadata">

**Author:** ![jbudd](https://avatars.discourse-cdn.com/v4/letter/j/5f8ce5/32.png) [@jbudd](https://discourse.nodered.org/u/jbudd)\
**Post date:** [29 August 2025 13:34 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/17 "2025-08-29T13:34:12Z")

</div>

> [@dceejay](#):
>
> isn’t that what the exec node does ?

There's many ways of doing it, the exec node is only one.  
An organisation that thinks blocking exec is sufficient protection is deluded.

> [@dceejay](#):
>
> and no we don’t want to extend other nodes to include OS calls

I'm well aware of that Dave.  
I have no intention of attempting to modify core nodes except possibly a local copy for my own use.

---

<div class="post-metadata">

**Author:** ![AllanOricil](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/allanoricil/32/106911_2.png) [@AllanOricil](https://discourse.nodered.org/u/AllanOricil)\
**Post date:** [29 August 2025 13:55 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/18 "2025-08-29T13:55:29Z")

</div>

I value consistency and modularity. However, because I know most people dont like following patterns, I started to pretend I don't like either, depending on the environment.

---

<div class="post-metadata">

**Author:** ![dceejay](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dceejay/32/38_2.png) [@dceejay](https://discourse.nodered.org/u/dceejay)\
**Post date:** [29 August 2025 14:11 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/19 "2025-08-29T14:11:58Z")

</div>

> [@AllanOricil](#):
>
> most people dont like following patterns

I think it’s more like music… some people like some patterns, others prefer other types, and some listen to their own patterns 🙂

---

<div class="post-metadata">

**Author:** ![gregorius](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/gregorius/32/73816_2.png) [@gregorius](https://discourse.nodered.org/u/gregorius)\
**Post date:** [29 August 2025 14:13 UTC](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739/20 "2025-08-29T14:13:02Z")

</div>

> [@jbudd](#):
>
> An organisation that thinks blocking exec is sufficient protection is deluded.

An exec node also has spawn mode which is non-blocking.

But totally agree with @dceejay here: if there is something missing then that the exec node should do then perhaps add it there and not in a change node ... having said that ....

what about an `$exec(..)` or `$shell(...)` command in JSONata? That would then allow commands to be executed in inject change and switch .... but psssss I didn't say anything! 🤫

[Next page](https://discourse.nodered.org/t/write-nodes-using-modern-tooling/98739.md?page=2)
