Connect to edge devices to quickly assess and update logic. Debug one device and roll out improvements to your fleet in minutes. All securely without requiring full device access for your whole organisation.
Device Groups enables users to logically group their devices assigned to an application. Additionally, Device Groups can be integrated into the DevOps Pipeline.
Connect to edge devices to quickly assess and update logic. Debug one device and roll out improvements to your fleet in minutes. All securely without requiring full device access for your whole organisation.
Easily manage and create MQTT clients to transport data for efficient messaging and communication within your applications. The Team Tier includes 5 clients at no extra cost, while the Enterprise Tier includes 20 clients for free as part of your existing plan, with purchase additional clients as needed in the future.
Setup standard nodes and flows that can be shared with all team members.
"
+ info: "
Easily manage and create MQTT clients to transport data for efficient messaging and communication within your applications. The Enterprise Tier includes 20 clients for free as part of your existing plan, with purchase additional clients as needed in the future.
Device Groups enables users to logically group their devices assigned to an application. Additionally, Device Groups can be integrated into the DevOps Pipeline.
FlowFuse can be configured to run with your own Single Sign-On (SSO) provider. Allow users to access FlowFuse with a single set of login credentials, improving security, user experience, and save them time.
Ensure FlowFuse properly safeguards protected health information (PHI) they handle on your business's behalf, mitigating the risk of data breaches and potential HIPAA violations.
"
+ - label: Collaborate
+ rows:
+ - id: teams
+ label: Number of Teams
+ selfHostedValues: [ '5', 'Unlimited' ]
+ tags: [ 'self-hosted' ]
+ info: "
FlowFuse allows multiple team members to collaborate on the same Node-RED flows.
Explore FlowFuse Blueprints, choose templates for quick setups, perfect for learning and fast solution-building. Customizable for unique needs. Simplify your Node-RED projects with FlowFuse Blueprints!
-
+{% extends 'layouts/catalog.njk' %}
-
+{% block title %}
+Blueprint Library
+{% endblock %}
+
+{% block description %}
+Explore FlowFuse Blueprints, choose templates for quick setups, perfect for learning and fast solution-building. Customizable for unique needs. Simplify your Node-RED projects with FlowFuse Blueprints!
+{% endblock %}
+
+{% block actions %}
+Submit Your Own
+{% endblock %}
+
+{% block content %}
+
+
{%- asyncEach item in blueprints -%}
- {% include "blueprints/blueprints.njk" %}
+ {% include "blueprints/blueprint-card.njk" %}
{%- endeach -%}
{% include "blog/pagination.njk" %}
{% include "contact-us-cta-line.njk" %}
-
\ No newline at end of file
+
+{% endblock %}
\ No newline at end of file
diff --git a/src/_includes/changelog/template.njk b/src/_includes/changelog/template.njk
index c94d32a6e9..0f2544d5e5 100644
--- a/src/_includes/changelog/template.njk
+++ b/src/_includes/changelog/template.njk
@@ -1,9 +1,12 @@
Our managed hosted solution, maintained and supported by the FlowFuse team. Experience flexibility, scalability, and expert assistance to drive your business forward.
+ {% include "components/icons/building-office-2.svg" %}
+
+
On Premise
+
Deploy FlowFuse on your hardware for enhanced flexibility. Opt for self-hosted deployment with FlowFuse, enabling on-premises installation and full control over your deployment process.
\ No newline at end of file
diff --git a/src/_includes/layouts/common-js.njk b/src/_includes/layouts/common-js.njk
index cf157a413b..a7ec709142 100644
--- a/src/_includes/layouts/common-js.njk
+++ b/src/_includes/layouts/common-js.njk
@@ -7,29 +7,131 @@
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@10.0.0/dist/mermaid.esm.mjs";
mermaid.initialize({
securityLevel: 'loose',
- startOnLoad:true
+ startOnLoad : true
});
-
+
{% initClipboardJS %}
-
-
-
-
-
-
+
+
+
diff --git a/src/_includes/layouts/documentation.njk b/src/_includes/layouts/documentation.njk
index 22f10f8a75..c9e5c21322 100644
--- a/src/_includes/layouts/documentation.njk
+++ b/src/_includes/layouts/documentation.njk
@@ -13,7 +13,7 @@ date: git Last Modified
-
+
{% if version %}
v{{ version }}
{% endif %}
@@ -21,7 +21,7 @@ date: git Last Modified
{{ page.url | handbookBreadcrumbs | safe }}
{% endif %}
-
+
@@ -52,23 +52,12 @@ date: git Last Modified
{% if nav == 'docs' %}
{% include "components/docs-banner.njk" %}
{% endif %}
- {% if nav == 'node-red' %}
-
-{% include "./common-js.njk" %}
\ No newline at end of file
+{% include "./common-js.njk" %}
+
+
+{% include "medium-zoom.min.njk" %}
\ No newline at end of file
diff --git a/src/_includes/layouts/page.njk b/src/_includes/layouts/page.njk
index d641cb35e0..cf28c999a3 100644
--- a/src/_includes/layouts/page.njk
+++ b/src/_includes/layouts/page.njk
@@ -29,10 +29,10 @@ layout: layouts/base.njk
{% endif %}
{% else %}
-
+
{{ title }}
{{ subtitle | safe }}
-
{{ description | safe }}
+
{{ description | safe }}
{% endif %}
diff --git a/src/_includes/layouts/right-nav.njk b/src/_includes/layouts/right-nav.njk
index ef832fde8a..b615f42611 100644
--- a/src/_includes/layouts/right-nav.njk
+++ b/src/_includes/layouts/right-nav.njk
@@ -3,38 +3,36 @@
let toc = document.getElementById("toc")
let currentTag = "";
- let currentToc = toc;
- let currentItem;
- let activeTier = 0 // which index to read from the depth
- let depth = [1, 1, 1, 1] // tracks the active number to render at each depth
+ let indentation = 0 // how much to indent the current item
+ const STEP = 4 // how much to indent at each level
- document.querySelectorAll(".main-content > h2, .main-content > h3, .main-content > h4").forEach(function(n) {
+ document.querySelectorAll(".main-content > h2, .main-content > h3, .main-content > h4").forEach(function(n, i) {
// which level of "H_" are we working with, and which one did we see most recently
const level = parseInt(n.nodeName[1])
const prevLevel = currentTag.length > 1 ? parseInt(currentTag[1]) : 0
+ currentTag = n.nodeName;
- // Render Table of Contents
- if (prevLevel > 0 && level - prevLevel < 0) {
- // we are moving left with our indent
- currentToc = toc;
- } else if (prevLevel > 0 && level - prevLevel > 0) {
- // we are creating a new, nested `
\ No newline at end of file
diff --git a/src/ask-me-anything/ask-me-anything.json b/src/ask-me-anything/ask-me-anything.json
index 9ff27de041..0c99814e89 100644
--- a/src/ask-me-anything/ask-me-anything.json
+++ b/src/ask-me-anything/ask-me-anything.json
@@ -2,5 +2,7 @@
"tags": [
"ama", "event"
],
- "layout": "layouts/webinar.njk"
-}
\ No newline at end of file
+ "layout": "layouts/webinar.njk",
+ "nav": "ama",
+ "searchTitle": "Ask Me Anything"
+}
diff --git a/src/blog.njk b/src/blog.njk
index 9e27c79ec4..c899170b7e 100644
--- a/src/blog.njk
+++ b/src/blog.njk
@@ -8,6 +8,8 @@ pagination:
reverse: true
meta:
title: Blog
+searchTitle: Blog
+nav: blog
---
-{% include "blog/template.njk" %}
\ No newline at end of file
+{% include "blog/template.njk" %}
diff --git a/src/blog/2021/2021.json b/src/blog/2021/2021.json
index 75541c8441..281a18fae9 100644
--- a/src/blog/2021/2021.json
+++ b/src/blog/2021/2021.json
@@ -2,5 +2,7 @@
"tags": [
"posts"
],
- "layout": "layouts/post.njk"
-}
\ No newline at end of file
+ "layout": "layouts/post.njk",
+ "nav": "blog",
+ "searchTitle": "Blog"
+}
diff --git a/src/blog/2022/01/community-news-01.md b/src/blog/2022/01/community-news-01.md
index afa223ffbf..f0a83d75df 100644
--- a/src/blog/2022/01/community-news-01.md
+++ b/src/blog/2022/01/community-news-01.md
@@ -15,7 +15,7 @@ Welcome to the first FlowFuse newsletter, we’re going to publish this as a reg
If you’ve got something that you’d like us to share please email [contact@flowfuse.com](mailto:contact@flowfuse.com).
-[FlowFuse 0.1 Released](/blog/flowforge-01-released)
+[FlowFuse 0.1 Released](/blog/2022/01/flowforge-01-released/)
First up we are really pleased to ship the first version of our platform, this is a very early release but hopefully will give you an idea of the direction we’re going in.
[Node-RED 2.2](https://nodered.org/blog/2022/01/27/version-2-2-released)
@@ -28,7 +28,7 @@ Ben Mawby wrote a guide on connecting Golioth's WebSocket endpoints to Grafana u
Sam Machin rebuilt an app on Node-RED allowing you to talk to Alexa through the browser. And he has published a new [node](https://flows.nodered.org/node/@sammachin/node-red-alexa-voice-service) to use the Alexa Voice Service within your own flows.
[New Team Members](/blog)
-We welcomed 2 new members of the FlowFuse team this month [ZJ](/blog/welcome-zj) joins as our CEO and [Steve](/blog/welcome-steve) has come onboard to work on the Node-RED project
+We welcomed 2 new members of the FlowFuse team this month [ZJ](/blog/2022/01/welcome-zj/) joins as our CEO and [Steve](/blog/2022/01/welcome-steve/) has come onboard to work on the Node-RED project
[We are Hiring]( https://boards.greenhouse.io/flowfuse/jobs/4312861004)
We're looking for the next member of our team, If you're a Node.JS developer and want to work with us take a look at the link.
diff --git a/src/blog/2022/03/community-news-02.md b/src/blog/2022/03/community-news-02.md
index 08d3fdbbc9..6a23fb2b17 100644
--- a/src/blog/2022/03/community-news-02.md
+++ b/src/blog/2022/03/community-news-02.md
@@ -15,16 +15,16 @@ Welcome to the FlowFuse newsletter, a regular roundup of what\`s happening with
If you've got something that you'd like us to share please email [contact@flowfuse.com](mailto:contact@flowfuse.com).
-[Announcing FlowFuse Cloud](/blog/announcing-flowforge-cloud/)
+[Announcing FlowFuse Cloud](/blog/2022/02/announcing-flowforge-cloud/)
We are excited to announce FlowFuse Cloud, a hosted Node-RED as a service offering and today we are opening the waitlist.
-[FlowFuse 0.2](/blog/flowforge-02-released/)
+[FlowFuse 0.2](/blog/2022/02/flowforge-02-released/)
We continue to iterate with our 4 weekly releases of the FlowFuse platform.
[Node-RED 2.2.2](https://discourse.nodered.org/t/node-red-2-2-2-released/58606)
The 2.2 release of Node-RED (last month) has received 2 maintenance releases to fix bugs with duplicate wires in the editor and MQTT.
-[New Team Members](/blog/welcome-joe/)
+[New Team Members](/blog/2022/02/welcome-joe/)
FlowFuse is now up to 6 people, Joe Pavitt has joined the team
[We still are Hiring](https://boards.greenhouse.io/flowfuse/jobs/4312861004)
diff --git a/src/blog/2022/03/flowforge-03-released.md b/src/blog/2022/03/flowforge-03-released.md
index 29fdfe304e..e584052e2d 100644
--- a/src/blog/2022/03/flowforge-03-released.md
+++ b/src/blog/2022/03/flowforge-03-released.md
@@ -104,6 +104,6 @@ Our regular release cycle puts the next release on Thursday 14th April.
We're still in planning stage for the release, but we'll also be beginning to invite
people from the waiting list to sign-up to FlowFuse Cloud.
-For more information, check out the [annoucement blog post](/blog/announcing-flowforge-cloud/).
+For more information, check out the [annoucement blog post](/blog/2022/02/announcing-flowforge-cloud/).
You can also sign up to our general mailing list below if you want to hear more
about the work we're doing.
diff --git a/src/blog/2022/04/flowforge-04-released.md b/src/blog/2022/04/flowforge-04-released.md
index db229b5952..20b1cc09c6 100644
--- a/src/blog/2022/04/flowforge-04-released.md
+++ b/src/blog/2022/04/flowforge-04-released.md
@@ -75,7 +75,7 @@ We also have a `#flowfuse` channel on the [Node-RED Slack workspace](https://nod
Our regular release cycle puts the next release on Thursday 12th May.
We will be building on features in the last few releases around managing your projects and using templates, we're also setting the foundations of our work to [manage Node-RED on your own devices running at the Edge](https://github.com/FlowFuse/flowfuse/issues/446).
-For more information, check out the [announcement blog post](/blog/announcing-flowforge-cloud/).
+For more information, check out the [announcement blog post](/blog/2022/02/announcing-flowforge-cloud/).
You can also sign up to our general mailing list below if you want to hear more
about the work we're doing.
diff --git a/src/blog/2022/04/flowforge-accepting-customers.md b/src/blog/2022/04/flowforge-accepting-customers.md
index 5261647450..f6e798e540 100644
--- a/src/blog/2022/04/flowforge-accepting-customers.md
+++ b/src/blog/2022/04/flowforge-accepting-customers.md
@@ -34,4 +34,4 @@ instance to connect virtually any online service. Multiple users will have
access to the same flows and can collaborate. Further, once Node-RED 3.0 has
been released, the platform will provide a pain-free way to upgrade and keep
your projects up to date. There's many more exciting features right around the
-corner on our [roadmap](/product/roadmap/)
+corner on our [roadmap](/changelog/)
diff --git a/src/blog/2022/06/flowforge-06-released.md b/src/blog/2022/06/flowforge-06-released.md
index 2e43ce2c63..cbc66c0c42 100644
--- a/src/blog/2022/06/flowforge-06-released.md
+++ b/src/blog/2022/06/flowforge-06-released.md
@@ -36,7 +36,7 @@ it uses an HTTP polling approach to check for updates. That was a pragmatic choi
to get something working - but it isn't our long term strategy. We'll be working
towards a more IoT-native MQTT/WebSocket appoach in the coming releases.
- - [Devices documentation](/docs/user/devices/)
+ - [Devices documentation](/docs/device-agent/introduction/)
- [Epic #446 - Devices](https://github.com/FlowFuse/flowfuse/issues/446)
### Snapshots
diff --git a/src/blog/2022/2022.json b/src/blog/2022/2022.json
index 75541c8441..281a18fae9 100644
--- a/src/blog/2022/2022.json
+++ b/src/blog/2022/2022.json
@@ -2,5 +2,7 @@
"tags": [
"posts"
],
- "layout": "layouts/post.njk"
-}
\ No newline at end of file
+ "layout": "layouts/post.njk",
+ "nav": "blog",
+ "searchTitle": "Blog"
+}
diff --git a/src/blog/2023/01/environment-variables-in-node-red.md b/src/blog/2023/01/environment-variables-in-node-red.md
index 83afb2d166..c69705b7f3 100644
--- a/src/blog/2023/01/environment-variables-in-node-red.md
+++ b/src/blog/2023/01/environment-variables-in-node-red.md
@@ -27,7 +27,7 @@ Node-RED allows you to set environment variables, but not to change them when ex
Our first example was using a predefined variable, exposed by Node-RED. As of 3.0 it exposes a few environment variables among which `NR_NODE_NAME`, `NR_GROUP_NAME`, and `NR_FLOW_NAME`.
-[FlowFuse](/) extends this list with for example a `FF_PROJECT_ID` allowing you to for example understand what group of instances sent a certain message, but also sets them for each [device agent](/docs/user/devices/). This allows users to pinpoint which device sent a message, for example to update a dashboard accordingly.
+[FlowFuse](/) extends this list with for example a `FF_PROJECT_ID` allowing you to for example understand what group of instances sent a certain message, but also sets them for each [device agent](/docs/device-agent/introduction/). This allows users to pinpoint which device sent a message, for example to update a dashboard accordingly.
### Managing environments variables
diff --git a/src/blog/2023/03/comparing-node-red-dashboards.md b/src/blog/2023/03/comparing-node-red-dashboards.md
index f6e3ff027e..48d803f2bc 100644
--- a/src/blog/2023/03/comparing-node-red-dashboards.md
+++ b/src/blog/2023/03/comparing-node-red-dashboards.md
@@ -5,11 +5,12 @@ description: Explore a thorough comparison of Node-RED dashboard solutions, cove
date: 2023-03-13
authors: ["rob-marcer"]
image: /images/blog/db-comparison.jpg
+keywords: node red dashboard, node-red dashboard, node red ui builder, ui builder node red, flexdash, node red dashboard alternative, node red alternative dashboard
tags:
- - posts
+ - post
- node-red
- - community
- dashboard
+ - comparing node-red dashboards
---
Dashboards are a great feature of Node-RED, allowing you to easily expose data visualisations and interactive elements of your flows to users via a web browser. I often see discussions in the community about which dashboard option is best for any given scenario, I wanted to compare the most popular options as they stand in early 2023.
diff --git a/src/blog/2023/04/3-quick-node-red-tips-6.md b/src/blog/2023/04/3-quick-node-red-tips-6.md
index 4169e7e350..a274c4996f 100644
--- a/src/blog/2023/04/3-quick-node-red-tips-6.md
+++ b/src/blog/2023/04/3-quick-node-red-tips-6.md
@@ -6,8 +6,8 @@ date: 2023-04-20 12:00:00
authors: ["rob-marcer"]
image: /images/blog/nr-quicktips.jpg
tags:
- - posts
- node-red
+ - node-red subflow
- how-to
---
diff --git a/src/blog/2023/05/flowforge-1-7-released.md b/src/blog/2023/05/flowforge-1-7-released.md
index 2e84b39998..b97cd3e06a 100644
--- a/src/blog/2023/05/flowforge-1-7-released.md
+++ b/src/blog/2023/05/flowforge-1-7-released.md
@@ -61,7 +61,7 @@ As an open-source project, we welcome community involvement in what we're buildi
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2023/06/community-news-06.md b/src/blog/2023/06/community-news-06.md
index 3ce13a6e35..c56e513275 100644
--- a/src/blog/2023/06/community-news-06.md
+++ b/src/blog/2023/06/community-news-06.md
@@ -37,7 +37,7 @@ On June 27, FlowFuse is doing a webinar with our friends at InfluxDB. A great op
- [Bringing High Availability to Node-RED](/blog/2023/05/bringing-high-availability-to-node-red/) - FlowFuse CTO discusses the strategy for delivering high availability in the FlowFuse platform.
- Two articles featuring how to connect Modbus data with Node-RED:
- - [Using Node-RED to Visualize Industrial Production Data via Modbus](/blog/2023/05/visualize-production-data-via-modbus-in-node-red/)
+ - [Using Node-RED to Visualize Industrial Production Data via Modbus](/node-red/protocol/modbus/)
- [Best Practices Integrating a Modbus Device With Node-RED](/blog/2023/05/integrating modbus with node-red/)
- [Node-RED Tips - Dashboard Edition](/blog/2023/06/3-quick-node-red-tips-7/) - A new set of Node-RED quick tips that are focused on using Node-RED Dashboard.
diff --git a/src/blog/2023/06/flowforge-1-8-released.md b/src/blog/2023/06/flowforge-1-8-released.md
index 1818bce52a..0fd6ea2849 100644
--- a/src/blog/2023/06/flowforge-1-8-released.md
+++ b/src/blog/2023/06/flowforge-1-8-released.md
@@ -38,7 +38,7 @@ In our previous release, we introduced [Editor Access for Devices](../../05/flow
Imagine this: Your industrial equipment arrives with the Device Agent preinstalled. In the past, you might have faced challenges in configuring and connecting your device with FlowFuse, particularly if you had no direct shell access. But not any more.
-With the newly introduced UI, you can easily set up and connect your device with FlowFuse without needing to access the command line interface directly. This simplifies the process significantly and saves you time. For more details, see our [documentation](/docs/user/devices/).
+With the newly introduced UI, you can easily set up and connect your device with FlowFuse without needing to access the command line interface directly. This simplifies the process significantly and saves you time. For more details, see our [documentation](/docs/device-agent/introduction/).
## Node-RED 3.1 Beta 3 Available
@@ -54,7 +54,7 @@ We're making great strides on our journey towards SOC2 certification, striving t
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page](/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2023/07/community-news-07.md b/src/blog/2023/07/community-news-07.md
index 57bc3956cb..18b96e470a 100644
--- a/src/blog/2023/07/community-news-07.md
+++ b/src/blog/2023/07/community-news-07.md
@@ -39,7 +39,7 @@ Our next webinar will be focused on the device management capabilities in the Fl
- Two new Node-RED Nodes Explained articles
- [Nodes explained: Split](/node-red/core-nodes/split/)
- - [Nodes explained: Filter](/node-red/core-nodes/rbe/)
+ - [Nodes explained: Filter](/node-red/core-nodes/filter/)
## From the Community
diff --git a/src/blog/2023/07/flowforge-1-9-3-release.md b/src/blog/2023/07/flowforge-1-9-3-release.md
index dfb2ab9a75..9f42028657 100644
--- a/src/blog/2023/07/flowforge-1-9-3-release.md
+++ b/src/blog/2023/07/flowforge-1-9-3-release.md
@@ -35,7 +35,7 @@ With the FlowFuse 1.9.3 release, now running FlowFuse Cloud, along with the late
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page](/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2023/07/flowforge-1-9-release.md b/src/blog/2023/07/flowforge-1-9-release.md
index 394df690a5..9a098633f5 100644
--- a/src/blog/2023/07/flowforge-1-9-release.md
+++ b/src/blog/2023/07/flowforge-1-9-release.md
@@ -61,7 +61,7 @@ Thanks to our community members for their contributions to this release.
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page](/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md b/src/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md
index 439ccf2fa0..737e287832 100644
--- a/src/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md
+++ b/src/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red.md
@@ -11,7 +11,7 @@ tags:
- node-red
- OPC-UA
---
-This article is the third and final part of our OPC UA content series. In the [first article](/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red/), we cover some OPC UA fundamentals and walk through an example OPC UA Server flow. In the [second article](/node-red/protocol/opa-ua/), we built a SSL-secured OPC UA server using data from an Allen Bradley PLC as a source.
+This article is the third and final part of our OPC UA content series. In the [first article](/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red/), we cover some OPC UA fundamentals and walk through an example OPC UA Server flow. In the [second article](/node-red/protocol/opc-ua/), we built a SSL-secured OPC UA server using data from an Allen Bradley PLC as a source.
In this article, we show how to build an OPC Client in Node-RED that communicates with a 3rd party OPC UA Server and utilizes an interactive dashboard.
diff --git a/src/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md b/src/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md
index d3076bf800..508bd8aa97 100644
--- a/src/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md
+++ b/src/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red.md
@@ -5,11 +5,12 @@ description: Introduction to OPC-UA and how to deploy a Node-RED server flow.
date: 2023-07-13
authors: ["richard-meyer"]
image: blog/2023/07/images/opc-ua-1/opc-ua-1-title-image.png
+keywords: opc ua server, opc ua server free, opc ua gateway, opc ua example, node-red-contrib-opcua, nodered opcua, node red opcua, node-red opcua, opcua node red, opcua nodered
tags:
- - posts
- - flowfuse
- - node-red
- - OPC-UA
+ - posts
+ - node-red
+ - opcua
+ - how-to
---
This article is the first part of a series of OPC-UA content. Here, we will explain some basic concepts of OPC-UA as they apply to building a server in Node-RED, then walk through and deploy an example OPC-UA Server.
diff --git a/src/blog/2023/08/community-news-08.md b/src/blog/2023/08/community-news-08.md
index f9f53fe7b1..8a6342e6c3 100644
--- a/src/blog/2023/08/community-news-08.md
+++ b/src/blog/2023/08/community-news-08.md
@@ -31,7 +31,7 @@ OPC-UA is a popular communication protocol used to communicate industrial data b
- Our developer advocate, Richard Meyer, published a series of articles on OPC-UA:
- Part 1: [How to Deploy a Basic OPC-UA Server in Node-RED](/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red/)
- - Part 2: [How to Build a Secure OPC-UA Server for PLCs in Node-RED](/node-red/protocol/opa-ua/)
+ - Part 2: [How to Build a Secure OPC-UA Server for PLCs in Node-RED](/node-red/protocol/opc-ua/)
- Part 3: [How to Build an OPC UA Client Dashboard in Node-RED](/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red/)
diff --git a/src/blog/2023/08/flowforge-1-10-release.md b/src/blog/2023/08/flowforge-1-10-release.md
index 3fea807cd4..6083ccbbe2 100644
--- a/src/blog/2023/08/flowforge-1-10-release.md
+++ b/src/blog/2023/08/flowforge-1-10-release.md
@@ -50,7 +50,7 @@ Thanks to our community members for their contributions to this release.
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page](/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2023/08/flowfuse-1-11-release.md b/src/blog/2023/08/flowfuse-1-11-release.md
index 296f8f721a..8bf73ad36c 100644
--- a/src/blog/2023/08/flowfuse-1-11-release.md
+++ b/src/blog/2023/08/flowfuse-1-11-release.md
@@ -51,7 +51,7 @@ Earlier in August, [FlowForge announced](/blog/2023/08/flowforge-is-now-flowfuse
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page](/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2023/09/modernize-your-legacy-industrial-data-part2.md b/src/blog/2023/09/modernize-your-legacy-industrial-data-part2.md
index 5ac4853436..7a5ca41f1e 100644
--- a/src/blog/2023/09/modernize-your-legacy-industrial-data-part2.md
+++ b/src/blog/2023/09/modernize-your-legacy-industrial-data-part2.md
@@ -125,6 +125,14 @@ But lets be smarter about this. We know that the data is consistent and we know
_Image 6: block reads, smart processing, no-code solution_
![image showing 1 modbus poll with smart processing](images/industrial-legacy-data-pt2-1poll-extensible.gif)
+## Node-RED in Production
+
+Node-RED is a powerful tool widely used in IoT and IIoT industries, including manufacturing, automotive, textiles, and building management. It excels at collecting, transforming, visualizing, and analyzing data. While integrating Node-RED into production environments offers numerous benefits, it often involves complex tasks such as deploying the server, managing security, and ensuring scalability. These initial setup challenges can be overwhelming and time-consuming.
+
+FlowFuse simplifies these tasks by providing a unified platform for managing all Node-RED instances. It enhances collaboration, ensures security, and supports scalability, making deployment and management more efficient. With features like [snapshots](/docs/user/snapshots/), team collaboration tools, one-click deployment, and [multi-factor authentication](/docs/user/user-settings/#security), FlowFuse streamlines the process and enhances the operational capabilities of Node-RED in production settings.
+
+**[Sign up](https://app.flowfuse.com/account/create/) now for a free trial and experience FlowFuse's features**
+
## Wrap up
I hope this article has given you some food for thought and some ideas on not only simplifying your journey to IIoT but also the pitfalls to avoid along the way.
diff --git a/src/blog/2023/09/modernize-your-legacy-industrial-data.md b/src/blog/2023/09/modernize-your-legacy-industrial-data.md
index c4de2a39ae..f1ab73b739 100644
--- a/src/blog/2023/09/modernize-your-legacy-industrial-data.md
+++ b/src/blog/2023/09/modernize-your-legacy-industrial-data.md
@@ -11,10 +11,10 @@ tags:
- community
---
-In today's rapidly evolving industrial landscape, the ability to collect, analyse, and act upon data is more critical than ever.
-The Industrial Internet of Things (IIoT) has ushered in a new era of connectivity and automation, but what about the wealth of data locked away in legacy industrial protocols like Modbus?
-How can we unlock and make sense of this valuable information in _any_ data, e.g. serial comms with no protocol, Siemens S7, Omron Fins, Mitsubishi MC-Protocol, or Allen Bradley DF1, etc.
-in the IIoT era? That's where tools like Node-RED and `node-red-contrib-buffer-parser` come into play.
+Industrial systems generate valuable data, but legacy protocols like Modbus or non-IIoT standards often make it hard to use. Bridging this gap is essential to connect traditional systems with the modern Industrial Internet of Things (IIoT).
+
+Whether it’s Modbus registers, serial communication without a protocol, or standards like Siemens S7 and Mitsubishi MC-Protocol, the challenge lies in making sense of this raw information. With tools like Node-RED and the node-red-contrib-buffer-parser, you can turn complex, outdated data streams into usable formats that power IIoT innovation.
+
@@ -79,6 +79,15 @@ Converting an array of 16-bit unsigned integers to String, Float and a scaled in
#### Example 3: Modbus data on a dashboard
Converting an array of 16-bit unsigned integers to String, Float and a scaled integer for publishing to a dashboard!
![Legacy data to dashboard](images/industrial-legacy-data-to-dashboard.png)
+
+### Simplify Your Node-RED Operations with FlowFuse
+
+While Node-RED is a fantastic tool for data collection, transformation, and analysis, integrating it into a production environment can sometimes feel like navigating a maze. Whether you’re deploying Node-RED on a server, ensuring secure remote access for your team, or managing a sprawling network of thousands of instances, it’s easy to feel overwhelmed.
+
+That’s where FlowFuse steps in to make your life easier. FlowFuse is designed to tackle these challenges head-on. It enhances Node-RED with features that simplify collaboration, strengthen security, and provide scalable deployment options. Imagine having a robust system that not only keeps your Node-RED applications running smoothly but also scales effortlessly with your needs. With FlowFuse, you gain access to a comprehensive suite of production-ready [features](/product/features/) designed to streamline your Node-RED workflows and boost overall performance.
+
+**[Sign up](https://app.flowfuse.com/account/create/) now for a free trial and experience FlowFuse's features**
+
### Learn More
We will be publishing follow-up blog posts with more details, best practices and examples on how to use Node-RED to make sense of your industrial data. In the meantime, you can learn more about these tools by visiting the following links:
diff --git a/src/blog/2023/10/mes-build-buy.md b/src/blog/2023/10/mes-build-buy.md
index c6ffe483fa..d7cd415f8a 100644
--- a/src/blog/2023/10/mes-build-buy.md
+++ b/src/blog/2023/10/mes-build-buy.md
@@ -13,7 +13,7 @@ tags:
---
-In today's fast-paced manufacturing landscape, the question of whether to build or buy Manufacturing Execution System (MES) solutions is more pertinent than ever. Traditional practices often involve outsourcing MES development to system integration (SI) companies or purchasing a software MES package, leaving manufacturing engineers with limited control and flexibility. However, a shift toward a hybrid approach, combining the strengths of both building and buying, is revolutionizing the way we approach MES systems. This article explores the advantages of using Node-RED in combination with FlowFuse for MES deployment and how it can empower manufacturing companies to achieve new levels of efficiency and adaptability.
+Manufacturing companies often struggle to choose between building custom MES solutions or buying ready-made software. Both options have their strengths, but they can fall short of providing the flexibility and control engineers need. A hybrid approach—combining the best of both worlds—is changing the game. In this article, we’ll explore how Node-RED and FlowFuse make it easier to create MES systems that are efficient, adaptable, and perfectly suited to your needs.
diff --git a/src/blog/2023/12/ai-use-cases.md b/src/blog/2023/12/ai-use-cases.md
index 32b3f18500..2175e2d698 100644
--- a/src/blog/2023/12/ai-use-cases.md
+++ b/src/blog/2023/12/ai-use-cases.md
@@ -15,7 +15,7 @@ Are we standing on the brink of a Fifth Industrial Revolution? The manufacturing
But the question lingers for many plant managers and decision makers: in which AI-powered capabilities should one invest to bring about transformative changes in the manufacturing environment?
-As we navigate this question, I want to focus on three AI uses that are not only ripe for investment but also pivotal in driving manufacturing success in today's competitive market.
+As we navigate this question, I want to focus on three AI uses that are not only ripe for investment but also pivotal in driving manufacturing success in this competitive market.
## Empowering Citizen Developer Strategy with AI
The concept of citizen development stands as one of the most significant fields in my opinion, a sentiment I've detailed in my [previous article](/blog/2023/10/citizen-development/) about Citizen Developers. This approach is revolutionizing the manner in which applications are crafted and deployed across various industries. By empowering individuals—irrespective of their coding knowledge—to create applications, AI is dramatically hastening this process.
@@ -33,4 +33,4 @@ For decision makers, investing in AI for demand forecasting means significantly
Unplanned downtime and quality inconsistencies are two of the biggest profit drains in manufacturing. AI's predictive capabilities are setting new standards in both maintenance and quality control protocols. By continuously monitoring equipment performance and production processes, AI can predict and identify machinery failures before they occur and detect quality deviations in real-time—allowing for immediate correction. Investing here means less downtime, reduced maintenance costs, improved product quality, and ultimately, an enhanced bottom line.
## Your Digital Infrastructure & Architecture is key
-While understanding where concrete Use Caes are is crucial, it’s equally important to ensure that your digital strategy and architecture can support and quickly adapt to these advanced AI implementations. See also [my article](/blog/2023/08/uns-article/) about the Unified Namespace. A flexible system that integrates a unified namespace is critical for seamless data exchange across various systems and applications. Moreover, fostering a citizen developer environment is fundamental in ensuring that these AI investments are maximally utilized, empowering your workforce to contribute actively to the company's innovation cycle.
+While understanding where concrete Use Cases are is crucial, it’s equally important to ensure that your digital strategy and architecture can support and quickly adapt to these advanced AI implementations. See also [my article](/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace/) about the Unified Namespace. A flexible system that integrates a Unified Namespace is critical for seamless data exchange across various systems and applications. Moreover, fostering a citizen developer environment is fundamental in ensuring that these AI investments are maximally utilized, empowering your workforce to contribute actively to the company's innovation cycle.
diff --git a/src/blog/2023/12/introduction-to-unified-namespace.md b/src/blog/2023/12/introduction-to-unified-namespace.md
index 6eed189a2d..36c9c4d784 100644
--- a/src/blog/2023/12/introduction-to-unified-namespace.md
+++ b/src/blog/2023/12/introduction-to-unified-namespace.md
@@ -60,3 +60,15 @@ schema which both the producer and consumer can read and validate each event
against. As such a common Schema Definition Language (SDL) is chosen to provide
clarity of how the data is structured, how it can be parsed, and in some cases
also what it means for the developer.
+
+## How Node-RED Fits In
+
+Node-RED excels in implementing a Unified Namespace with its flexible and powerful capabilities. It can act as both a central hub and a data consumer within a hub-and-spokes model, simplifying the integration of various data sources and consumers. By leveraging Node-RED's extensive library of nodes and its easy-to-use flow-based programming interface, organizations can efficiently manage data ingestion, transformation, and distribution.
+
+Node-RED also supports structured data through its support for JSON, XML, and other standard formats, allowing for clear and consistent data schemas. With its built-in nodes for MQTT, HTTP, and other protocols, Node-RED can seamlessly integrate with existing systems, enabling real-time data exchange and visualization. This makes it an ideal tool for operationalizing the Unified Namespace, ensuring that data flows efficiently and is readily available to all relevant stakeholders.
+
+### How FlowFuse Can Help
+
+While Node-RED is highly effective for implementing UNS, managing and deploying it can be complex. FlowFuse provides a unified platform that simplifies deployment with one-click operations, secure management, and scalable Node-RED applications. It also includes features that enhance collaboration, alongside offering centralized management of all Node-RED instances to ensure streamlined operations and increased efficiency.
+
+**[Sign up](https://app.flowfuse.com/account/create/) now for a free trial and experience FlowFuse's features**
\ No newline at end of file
diff --git a/src/blog/2023/2023.json b/src/blog/2023/2023.json
index 75541c8441..281a18fae9 100644
--- a/src/blog/2023/2023.json
+++ b/src/blog/2023/2023.json
@@ -2,5 +2,7 @@
"tags": [
"posts"
],
- "layout": "layouts/post.njk"
-}
\ No newline at end of file
+ "layout": "layouts/post.njk",
+ "nav": "blog",
+ "searchTitle": "Blog"
+}
diff --git a/src/blog/2024/01/flowfuse-release-2-0.md b/src/blog/2024/01/flowfuse-release-2-0.md
index ac794ac67c..5c0cafd1b5 100644
--- a/src/blog/2024/01/flowfuse-release-2-0.md
+++ b/src/blog/2024/01/flowfuse-release-2-0.md
@@ -35,7 +35,7 @@ Node-RED team development is made possible with FlowFuse. Different development
## Looking Ahead
-At FlowFuse, our mission is to empower bottom-up innovation and enable organizations to transform their workflows into business-critical applications with unprecedented efficiency. As we move forward, we are excited to invite our users to actively engage with our future developments. Our [Roadmap](/product/roadmap/) lays out the advancements we're targeting, offering a glimpse into the features and enhancements that are on the horizon. We also encourage our users to stay informed and involved by checking out our latest updates in our detailed [changelog](/changelog/). Your insights and feedback are crucial to us; they fuel our commitment to continuous improvement and innovation. We warmly invite you to [share your thoughts and suggestions](/contact-us/), as your input is a vital part of our journey in shaping the next steps for FlowFuse.
+At FlowFuse, our mission is to empower bottom-up innovation and enable organizations to transform their workflows into business-critical applications with unprecedented efficiency. As we move forward, we are excited to invite our users to actively engage with our future developments. Our [Roadmap](/changelog/) lays out the advancements we're targeting, offering a glimpse into the features and enhancements that are on the horizon. We also encourage our users to stay informed and involved by checking out our latest updates in our detailed [changelog](/changelog/). Your insights and feedback are crucial to us; they fuel our commitment to continuous improvement and innovation. We warmly invite you to [share your thoughts and suggestions](/contact-us/), as your input is a vital part of our journey in shaping the next steps for FlowFuse.
## How to get started
diff --git a/src/blog/2024/01/images/broker-for-uns.png b/src/blog/2024/01/images/broker-for-uns.png
index f020e88e19..593630842c 100644
Binary files a/src/blog/2024/01/images/broker-for-uns.png and b/src/blog/2024/01/images/broker-for-uns.png differ
diff --git a/src/blog/2024/01/unified-namespace-what-broker.md b/src/blog/2024/01/unified-namespace-what-broker.md
index 540a7f4d0d..4e17a7b394 100644
--- a/src/blog/2024/01/unified-namespace-what-broker.md
+++ b/src/blog/2024/01/unified-namespace-what-broker.md
@@ -19,7 +19,7 @@ When starting to roll out a new data distribution architecture for the unified n
### Two protocols frontrunners
-Currently, there are two protocols that are front runners for becoming the de facto data transfer choice in (industrial) IoT: MQTT or Kafka. They’ve been designed for different use cases and have different properties. At this time, MQTT is more often deployed as a broker in the unified namespace and is generally the best choice when starting to implement a unified namespace, it also features better support from hardware vendors.
+Currently, there are two protocols that are front runners for becoming the de facto data transfer choice in (industrial) IoT: [MQTT](/blog/2024/06/how-to-use-mqtt-in-node-red/) or [Kafka](/blog/2024/03/using-kafka-with-node-red/). They’ve been designed for different use cases and have different properties. At this time, MQTT is more often deployed as a broker in the unified namespace and is generally the best choice when starting to implement a unified namespace, it also features better support from hardware vendors.
First and foremost, MQTT has been designed to enable IoT use cases. The main design objectives were to be lightweight to enable low-bandwidth communication, enable low-power devices, and handle unreliable networks. MQTT enables a large number of data producers and consumers to collaborate.
@@ -39,13 +39,20 @@ In addition to vendor lock-in, cloud message queue brokers also introduce relian
### Exotic options
-RabbitMQ is a widely used open-source message broker that’s mostly used as an event message bus for web applications. It can also function as a hub in a unified namespace. The broker primarily supports the AMQP (Advanced Message Queuing Protocol), considered the industry standard for high-performance messaging systems. It also supports STOMP (Streaming Text Oriented Messaging Protocol) and MQTT (MQ Telemetry Transport), catering to various messaging needs.
+RabbitMQ is a widely used open-source message broker that’s mostly used as an event message bus for web applications. It can also function as a hub in a unified namespace. The broker primarily supports the [AMQP](/node-red/protocol/amqp/) (Advanced Message Queuing Protocol), considered the industry standard for high-performance messaging systems. It also supports STOMP (Streaming Text Oriented Messaging Protocol) and MQTT (MQ Telemetry Transport), catering to various messaging needs.
NATS, short for Network Agnostic Messaging System, is another open-source message broker that is designed for simplicity and reliability. NATS implements its own protocols, making it harder to be interoperable with hardware and software previously purchased. NATS has requirements on message structure too, which creates another barrier to adoption for IoT use cases.
+## How Node-RED Helps
+
+Node-RED provides a powerful and flexible way to integrate with various brokers, supporting protocols such as [MQTT](/blog/2024/06/how-to-use-mqtt-in-node-red/), [Kafka](/blog/2024/03/using-kafka-with-node-red/), and [AMQP](/node-red/protocol/amqp/). It allows you to build and manage workflows that interact with your chosen broker, seamlessly connecting different data sources and systems.
+
+However, using Node-RED alone in production environments requires additional considerations, such as server deployment, instance management, security implementation, and scalability. This is where FlowFuse enhances Node-RED's capabilities by adding production-ready features. FlowFuse simplifies managing and deploying Node-RED applications, providing essential functionalities like scalability, robust security, and efficient collaboration tools.
+
+**[Sign up](https://app.flowfuse.com/account/create/) now for a free trial and experience how FlowFuse can streamline your Node-RED deployments and management.**
## Conclusion
An MQTT broker is currently recommended as a broker solution for your unified namespace. There are many different implementations of the protocol available. At FlowFuse, we’re using [Mosquitto](https://mosquitto.org/), due to its efficiency on resources and flexible authentication layer. Further, our customers are reporting to be happy with [EMqX](https://www.emqx.io/), which is written in Erlang – itself a messaging-oriented programming language – and has been put through its paces in practice. If you’re dipping your toes into the unified namespace, either of those or another MQTT broker is currently recommended.
-Note that it’s recommended to allow yourself flexibility in the broker, and treat it as a message-passing system, and your organization will be able to easily swap it out later if any other broker is a better fit later on.
+Note that it’s recommended to allow yourself flexibility in the broker, and treat it as a message-passing system, and your organization will be able to easily swap it out later if any other broker is a better fit later on.
\ No newline at end of file
diff --git a/src/blog/2024/02/node-red-perfect-adapter-middleware-uns.md b/src/blog/2024/02/node-red-perfect-adapter-middleware-uns.md
index 80ee545575..cf61d39881 100644
--- a/src/blog/2024/02/node-red-perfect-adapter-middleware-uns.md
+++ b/src/blog/2024/02/node-red-perfect-adapter-middleware-uns.md
@@ -42,3 +42,9 @@ A swiss-army knife as both data sender and receiver is not just a nice-to-have,
While there are other tools available that can adapt to a few protocols, or parse a handful of data formats, there’s no alternative for Node-REDs breadth and depth of integration level. This is why many organizations have already adopted Node-RED for their edge cases, which their current standard solution doesn’t handle.
There’s no situation where a vendor provided, off-the-shelf solution handles protocols and formats across vendors, modern and legacy OT, that also satisfies the IT requirements unless the extensibility is handled through an Open-Source community, with compliance and security controls from a professional entity surrounding the open source project.
+
+### How FlowFuse Enhances Node-RED
+
+While Node-RED is powerful for implementing UNS, its management and deployment can be complex. FlowFuse simplifies this process with a unified platform that offers one-click deployment, secure management, and scalability for Node-RED applications. It enhances collaboration through centralized management of all Node-RED instances, ensuring streamlined operations and increased efficiency.
+
+**[Sign up](https://app.flowfuse.com/account/create/) now for a free trial and explore how FlowFuse can transform your Node-RED experience.**
\ No newline at end of file
diff --git a/src/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md b/src/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md
index e7aae14b3d..2b5b8bb9f0 100644
--- a/src/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md
+++ b/src/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2.md
@@ -96,5 +96,5 @@ If you want to learn more about FlowFuse multiuser addon and personalize the mul
- [Personalised Multi-user Dashboards with Node-RED Dashboard 2.0](/blog/2024/01/dashboard-2-multi-user/) - This article explores the process of building multi-user Dashboards secured with FlowFuse Cloud.
- [Displaying logged-in users on Dashboard 2.0](/blog/2024/04/displaying-logged-in-users-on-dashboard/) - This detailed guide demonstrates how to display logged-in users on Dashboard 2.0 which using the FlowFuse Multiuser addon and FlowFuse.
-- [Multi-User Dashboard for Ticket/Task Management](/blueprints/flowfuse-dashboard/multi-user-dashboard/#multi-user-dashboard-for-ticket%2Ftask-management) blueprint, which allows you to utilize templates to develop Personalize multi-user dashboard quickly.
+- [Multi-User Dashboard for Ticket/Task Management](/blueprints/flowfuse-dashboard/multi-user-dashboard/) blueprint, which allows you to utilize templates to develop Personalize multi-user dashboard quickly.
diff --git a/src/blog/2024/04/displaying-logged-in-users-on-dashboard.md b/src/blog/2024/04/displaying-logged-in-users-on-dashboard.md
index b7b0b654c9..cae6c79a7b 100644
--- a/src/blog/2024/04/displaying-logged-in-users-on-dashboard.md
+++ b/src/blog/2024/04/displaying-logged-in-users-on-dashboard.md
@@ -141,7 +141,7 @@ If you want to learn more about the FlowFuse Multiuser addon and Personalize Mul
- [Webinar](/webinars/2024/node-red-dashboard-multi-user/) - This webinar provides an in-depth discussion of the Personalised Multi-User Dashboards feature and offers guidance on how to get started with it.
- [Personalised Multi-user Dashboards with Node-RED Dashboard 2.0](/blog/2024/01/dashboard-2-multi-user/) - This article explores the process of building multi-user Dashboards secured with FlowFuse Cloud.
-- [Multi-User Dashboard for Ticket/Task Management](/blueprints/flowfuse-dashboard/multi-user-dashboard/#multi-user-dashboard-for-ticket%2Ftask-management) blueprint, which allows you to quickly utilize templates to develope Personalize multi-user dashboard.
+- [Multi-User Dashboard for Ticket/Task Management](/blueprints/flowfuse-dashboard/multi-user-dashboard/) blueprint, which allows you to quickly utilize templates to develope Personalize multi-user dashboard.
## Conclusion
diff --git a/src/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md b/src/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md
index 9d6c294abc..4d8e4bd9d4 100644
--- a/src/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md
+++ b/src/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2.md
@@ -221,4 +221,4 @@ If you want to enhance this simple application by adding more features, consider
- [How to Build an Admin Dashboard with Node-RED Dashboard 2.0](/blog/2024/04/building-an-admin-panel-in-node-red-with-dashboard-2/) - This detailed guide demonstrates how to build a secure admin page in Node-RED Dashboard 2.0.
-- [Multi-User Dashboard for Ticket/Task Management](/blueprints/flowfuse-dashboard/multi-user-dashboard/#multi-user-dashboard-for-ticket%2Ftask-management) blueprint, which allows you to utilize templates to develop a personalized multi-user dashboard quickly. This Task management blueprint has all features such as adding, updating, and deleting tasks, user profiles, and admin dashboard.
+- [Multi-User Dashboard for Ticket/Task Management](/blueprints/flowfuse-dashboard/multi-user-dashboard/) blueprint, which allows you to utilize templates to develop a personalized multi-user dashboard quickly. This Task management blueprint has all features such as adding, updating, and deleting tasks, user profiles, and admin dashboard.
diff --git a/src/blog/2024/04/node-red-architecture.md b/src/blog/2024/04/node-red-architecture.md
index 958d052052..fb67736b59 100644
--- a/src/blog/2024/04/node-red-architecture.md
+++ b/src/blog/2024/04/node-red-architecture.md
@@ -12,11 +12,10 @@ tags:
- manufacturing
- perdue model
- ISA 99
- - UNS
- - Unified Namespace
+ - unified-namespace
---
-The architecture of a factory's Node-RED infrastructure is a common topic of discussion and inquiry. Fundamentally, my response to such queries unfolds in two parts. Initially, the focus must be on data organization. I champion a structure centered around a [Unified Namespace](/unified-namespace/), a concept I explore in depth in this article ["Node-RED in a Unified Namespace Architecture."](/blog/2024/02/node-red-unified-namespace-architecture/) However, this is only one part of the inquiry. The other part of the question delves into the positioning of FlowFuse and Node-RED within the network infrastructure.
+The architecture of a factory's Node-RED infrastructure is a common topic of discussion and inquiry. Fundamentally, my response to such queries unfolds in two parts. Initially, the focus must be on data organization. I champion a structure centered around a [Unified Namespace](/solutions/uns/), a concept I explore in depth in this article ["Node-RED in a Unified Namespace Architecture."](/blog/2024/02/node-red-unified-namespace-architecture/) However, this is only one part of the inquiry. The other part of the question delves into the positioning of FlowFuse and Node-RED within the network infrastructure.
diff --git a/src/blog/2024/05/exploring-node-red-dashboard-2-widgets.md b/src/blog/2024/05/exploring-node-red-dashboard-2-widgets.md
index 140486b13c..6abe519f63 100644
--- a/src/blog/2024/05/exploring-node-red-dashboard-2-widgets.md
+++ b/src/blog/2024/05/exploring-node-red-dashboard-2-widgets.md
@@ -239,4 +239,4 @@ If you want to enhance this simple application by adding more features or want t
- [How to Build An Application With Node-RED Dashboard 2.0](/blog/2024/04/how-to-build-an-application-with-node-red-dashboard-2/) - This guide, covers how you can build personalize multiuser dashboard using flow fuse multi-user addon.
-- [Multi-User Dashboard for Ticket/Task Management blueprint](/blueprints/flowfuse-dashboard/multi-user-dashboard/#multi-user-dashboard-for-ticket%2Ftask-management) - this blueprint allows you to utilize templates to develop a personalized multi-user dashboard quickly. This Task management blueprint has all features such as adding, updating, and deleting tasks, user profiles, and admin dashboard.
+- [Multi-User Dashboard for Ticket/Task Management blueprint](/blueprints/flowfuse-dashboard/multi-user-dashboard/) - this blueprint allows you to utilize templates to develop a personalized multi-user dashboard quickly. This Task management blueprint has all features such as adding, updating, and deleting tasks, user profiles, and admin dashboard.
diff --git a/src/blog/2024/05/flowfuse-2-4-release.md b/src/blog/2024/05/flowfuse-2-4-release.md
index f6ea8b4d85..8ee3d463cb 100644
--- a/src/blog/2024/05/flowfuse-2-4-release.md
+++ b/src/blog/2024/05/flowfuse-2-4-release.md
@@ -48,7 +48,7 @@ We also regularly release updates to [FlowFuse Cloud]({{ site.appURL }}) in betw
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page](/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2024/05/why-you-need-a-low-code-platform.md b/src/blog/2024/05/why-you-need-a-low-code-platform.md
index 5ef3a54962..467bd63352 100644
--- a/src/blog/2024/05/why-you-need-a-low-code-platform.md
+++ b/src/blog/2024/05/why-you-need-a-low-code-platform.md
@@ -5,14 +5,10 @@ description: Discover how low-code platforms like FlowFuse empower domain expert
date: 2024-05-22
authors: ["grey-dziuba"]
image: /blog/2024/05/images/why-you-need-a-low-code-platform.png
+keywords: low-code, digital Transformation, app development, Citizen Development
tags:
- - posts
- flowfuse
- low-code
- - digital Transformation
- - app development
- - Node-RED
- - Citizen Development
---
Digital transformation is a series of technological advancements that aim to simplify complex tasks. From calculators and graphical user interfaces (GUIs) to new programming languages, these advancements have enabled individuals to create value that was once beyond their reach. The key is to understand that these tools are not meant to replace expertise but to enhance it, making complex tasks more manageable, speeding up development time, and empowering more people.
diff --git a/src/blog/2024/06/flowfuse-2-5-release.md b/src/blog/2024/06/flowfuse-2-5-release.md
index b3563a1323..49f86eb29d 100644
--- a/src/blog/2024/06/flowfuse-2-5-release.md
+++ b/src/blog/2024/06/flowfuse-2-5-release.md
@@ -51,7 +51,7 @@ We also regularly release updates to [FlowFuse Cloud]({{ site.appURL }}) in betw
We're always working to enhance your experience with FlowFuse. Here's how you can stay informed and contribute:
-- **Roadmap Overview**: Check out our [Product Roadmap Page](/product/roadmap/) to see what we're planning for future updates.
+- **Roadmap Overview**: Check out our [Product Roadmap Page](/changelog/) to see what we're planning for future updates.
- **Entire Roadmap**: Visit our [Roadmap on GitHub](https://github.com/orgs/FlowFuse/projects/5) to follow our progress and contribute your ideas.
- **Feedback**: We're interested in your thoughts about FlowFuse. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
diff --git a/src/blog/2024/06/how-to-use-mqtt-in-node-red.md b/src/blog/2024/06/how-to-use-mqtt-in-node-red.md
index 0d0af8969b..e1986e56c5 100644
--- a/src/blog/2024/06/how-to-use-mqtt-in-node-red.md
+++ b/src/blog/2024/06/how-to-use-mqtt-in-node-red.md
@@ -26,7 +26,9 @@ On the other hand, Node-RED is an open-source visual programming tool used for w
### Setting up your MQTT Environment
-In this guide, we will utilize the [HiveMQ Cloud MQTT broker](https://www.hivemq.com/mqtt-cloud-broker/), a fully managed MQTT broker service platform provided by HiveMQ. We will use their free trial as we are learning, but if you want to use it for your project, make sure to use their correct cluster according to your needs. If you prefer to use another cloud platform such as Mosquito, or EMqX, feel free to do so.
+In this guide, we will utilize the [HiveMQ Cloud MQTT broker](https://www.hivemq.com/mqtt-cloud-broker/). We will use their free trial as we are learning, but if you want to use it for your project, make sure to use their correct cluster according to your needs. If you prefer to use another cloud platform such as Mosquito, or EMqX, feel free to do so.
+
+FlowFuse has also launched an MQTT broker service that is integrated directly into platform, making it easy to use MQTT with Node-RED. For more information, check out [FlowFuse's MQTT Broker Announcement](/blog/2024/10/announcement-mqtt-broker/).
1. Create your account with HiveMQ and log in.
2. After logging in, you will be asked to select a cluster. Choose the **Starter** cluster, then select the **AWS Cloud** provider and set the tier to **Production S**. Make sure to select the correct region and proceed to create the cluster.
@@ -131,7 +133,7 @@ Now, create a new instance in which we will receive the temperature data by subs
Now, you will see the temperature data printed in the debug tab in the sidebar. Additionally, you can display this data on a chart using Dashboard 2.0 or store it in a database. For more details refer to the following guides:
-- [Sending data to influxDB](/blog/2023/07/connect-node-red-to-influxdb/)
+- [Sending data to influxDB](/node-red/database/influxdb/)
- [Charting Data in on Dashboard 2.0](/node-red/integration-technologies/rest/)
## Best Practices
diff --git a/src/blog/2024/07/calling-python-script-from-node-red.md b/src/blog/2024/07/calling-python-script-from-node-red.md
index 49d398c079..802fbe5bff 100644
--- a/src/blog/2024/07/calling-python-script-from-node-red.md
+++ b/src/blog/2024/07/calling-python-script-from-node-red.md
@@ -5,19 +5,11 @@ description: Learn how to seamlessly execute a Python script from Node-RED for a
date: 2024-07-10
authors: ["sumit-shinde"]
image: /blog/2024/07/images/calling-python-script-from-node-red.png
+keywords: node red and python, node red call python script, node red exec node python script, node red execute python script, node red for python,node red python example, node red python script, node red run python script, node red with python, python in node red
tags:
- post
- node-red
- - node red and python
- - node red call python script
- - node red exec node python script
- - node red execute python script
- - node red for python
- - node red python example
- - node red python script
- - node red run python script
- - node red with python
- - python in node red
+ - node red python
---
Python's robust data processing capabilities and extensive libraries are well-known in programming. When combined with Node-RED, these technologies can synergize to elevate data analytics and automation. This guide walks you through integrating Python scripts with Node-RED. You'll gain practical insights, troubleshooting tips, and effective techniques for executing scripts, enabling you to leverage this powerful combination for your IoT projects.
diff --git a/src/blog/2024/07/deploying-flowfuse-with-docker.md b/src/blog/2024/07/deploying-flowfuse-with-docker.md
index 5358f4ed66..988f6de2fb 100644
--- a/src/blog/2024/07/deploying-flowfuse-with-docker.md
+++ b/src/blog/2024/07/deploying-flowfuse-with-docker.md
@@ -5,17 +5,19 @@ description: Learn to deploy the FlowFuse on your Ubuntu server with Docker, fro
date: 2024-07-15
authors: ["sumit-shinde"]
image: /blog/2024/07/images/deploying-flowfuse.png
+keywords: nodered docker, flowfuse docker, node red docker, docker nodered, install node red docker
tags:
- - node-red
+ - post
- flowfuse
- self hosted
- - docker
---
With Node-RED's increasing role in IoT, FlowFuse Cloud has become a favored platform for deploying production Node-RED applications. It offers [extensive features](/product/features/) at a low cost, reducing operational overhead. However, the cloud is not the only option we provide; we also offer a self-hosted option for users who prefer to deploy FlowFuse on their servers. This guide demonstrates how to deploy FlowFuse on your Ubuntu server using Docker, covering key aspects such as domain setup, email, SSL, and more for real-world production scenarios
+*Note: While the approach provided in this article is an older method for deploying FlowFuse and still works, I recommend following the newer, simpler, and quicker approach. For more details, refer to the official [Docker documentation](/docs/install/docker/).*
+
## What is Docker?
[Docker](https://docs.docker.com/guides/docker-concepts/the-basics/what-is-an-image/) is an open-source platform that simplifies how applications are deployed, scaled, and managed through containerization. It enables you to package all components required by your project such as code, libraries, and dependencies into a single, portable unit known as a [Docker container](https://docs.docker.com/guides/docker-concepts/the-basics/what-is-a-container/). These containers ensure consistency in application environments and ease deployment by ensuring that applications run predictably across different computing environments, whether on a developer's laptop, a server, or a cloud platform.
@@ -82,7 +84,7 @@ wget
The `flowforge.yml` file was updated to include our domain in key fields: `domain`, `base_url`, and `broker.public_url`. These adjustments ensure that instance names on Docker platforms incorporate your domain, provide accurate URLs for accessing the platform, and specify the correct URL for devices to connect to the broker if different from `broker.url`. Additionally, in the `docker-compose.yml` file, we configured `VIRTUAL_HOST` and `LETSENCRYPT_HOST` to reflect our domain.
-For more details on these configuration changes, refer to the [documentation](/docs/install/docker/#configuring-flowfuse).
+For more details on these configuration changes, refer to the [documentation](/docs/install/configuration/#configuring-flowfuse).
### Securing Communication with SSL
diff --git a/src/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md b/src/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md
index acfd782710..ad71b91e4d 100644
--- a/src/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md
+++ b/src/blog/2024/07/evolution-of-technology-impact-on-job-roles-and-companies.md
@@ -6,13 +6,10 @@ date: 2024-07-23
authors: ["sumit-shinde"]
image: /blog/2024/07/images/evolution-of-technology.png
tags:
- - node-red
- - post
- - flowfuse
- - ai
- - nodered jobs
- - low-code
- - no-code
+ - posts
+ - flowfuse
+ - low-code
+ - ai
---
Throughout history, technology has continuously transformed industries, job roles, and entire companies. While these changes often evoke fear and resistance, they also create new jobs, opportunities for innovation and growth. This post will explore how historical technological advancements have reshaped both individual job roles and entire companies, examine current trends like AI and low-code tools, and discuss the critical importance of adaptability for both individuals and businesses in navigating technological disruption, Importantly, we will address the pressing question of our time: ***"How can AI and low-code tools both enhance and challenge human capabilities, creativity, and the job market, and is this the next frontier in manufacturing or just hype"***
@@ -39,7 +36,7 @@ Furthermore, AI and low-code tools disrupt traditional job roles and create new
Historically, individuals and businesses that fail to adapt to technological change or embrace innovation risk becoming obsolete in competitive markets. A notable example is Nokia, once a dominant player in the mobile phone industry. Nokia initially thrived by pioneering mobile technology and establishing a strong market presence. However, the company's reluctance to embrace the shift to smartphones and its adherence to outdated business models ultimately led to its decline. In contrast, competitors like Apple and Samsung seized opportunities in the smartphone market, leveraging innovation and consumer-centric strategies to surpass Nokia in market share and profitability. There are numerous such examples, one being Xerox. Watch this short video where Steve Jobs, founder of Apple, explains [Why Xerox failed](https://www.youtube.com/watch?v=X3NASGb5m8s&t=2s).
-In today's business landscape, the strategic adoption of AI and low-code tools is critical for maintaining competitive advantage and driving sustainable growth. While concerns about AI ethics and reliability are valid, businesses that implement AI technologies responsibly can enhance operational efficiency, improve decision-making processes, and deliver superior customer experiences. Similarly, companies that embrace low-code development platforms can accelerate time-to-market for new applications, reduce development costs, and empower business units to innovate and iterate more rapidly. Amazon, for instance, exemplifies this adaptability by evolving from an online bookstore to a global leader in e-commerce and cloud computing through strategic technology integration.
+The strategic adoption of AI and low-code tools is critical for maintaining competitive advantage and driving sustainable growth. While concerns about AI ethics and reliability are valid, businesses that implement AI technologies responsibly can enhance operational efficiency, improve decision-making processes, and deliver superior customer experiences. Similarly, companies that embrace low-code development platforms can accelerate time-to-market for new applications, reduce development costs, and empower business units to innovate and iterate more rapidly. Amazon, for instance, exemplifies this adaptability by evolving from an online bookstore to a global leader in e-commerce and cloud computing through strategic technology integration.
## FlowFuse: The perfect combo of Low-code and AI
diff --git a/src/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md b/src/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md
index 1c29119dc9..d7af4b9c84 100644
--- a/src/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md
+++ b/src/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red.md
@@ -5,14 +5,12 @@ description: Learn how to configure SSO LDAP for your self-hosted FlowFuse platf
date: 2024-07-29
authors: ["sumit-shinde"]
image: /blog/2024/07/images/how-to-set-up-sso-ldap-for-node-red.png
+keywords: node red security, node red security, sso with node red nodered security, secure node red, securing node red
tags:
- post
- - node-red
- - nodered
- flowfuse
+ - flowfuse features
- sso
- - ldap
- - openldap
---
A few days ago, we published a [blog](/blog/2024/07/how-to-setup-sso-saml-for-the-node-red/) explaining SSO and how to set up SAML for your self-hosted FlowFuse. Now, in this guide, we will walk you through the process of setting up SSO with LDAP for your self-hosted FlowFuse. We will use OpenLDAP as the provider and cover everything from introducing LDAP, how it works, installing and configuring OpenLDAP, managing users (create, delete, update), and finally setting up FlowFuse for SSO with LDAP.
diff --git a/src/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md b/src/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md
index 89212bdd3e..1f09e80dc8 100644
--- a/src/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md
+++ b/src/blog/2024/07/how-to-setup-sso-saml-for-the-node-red.md
@@ -5,12 +5,12 @@ description: Learn how to configure SSO SAML for your self-hosted FlowFuse platf
date: 2024-07-17
authors: ["sumit-shinde"]
image: /blog/2024/07/images/sso-saml-with-node-red.png
+keywords: node red security, node red security, sso with node red nodered security, secure node red, securing node red
tags:
- post
- node-red
+ - node-red security
- sso
- - saml
- - google workspace
---
SSO plays a crucial role in modern enterprise environments by simplifying user authentication across multiple applications. At FlowFuse, we recognize the significance of SSO and offer robust support for integrating it with your self-hosted platform. In this comprehensive guide, we will focus on configuring SSO SAML, specifically using Google as the Identity Provider (IdP). We also support SSO with LDAP. For more information, refer to [Setting up LDAP SSO for your Self-Hosted FlowFuse](/docs/admin/sso/ldap/).
diff --git a/src/blog/2024/08/comparing-dashboard-2-with-uibuilder.md b/src/blog/2024/08/comparing-dashboard-2-with-uibuilder.md
index 7abc35bd1a..dc58e334ea 100644
--- a/src/blog/2024/08/comparing-dashboard-2-with-uibuilder.md
+++ b/src/blog/2024/08/comparing-dashboard-2-with-uibuilder.md
@@ -5,13 +5,12 @@ description: Compare FlowFuse Dashboard and UI-Builder. Discover their installat
date: 2024-08-06
authors: ["sumit-shinde"]
image: /blog/2024/08/images/dashboard-2-vs-ui-builder.png
+keywords: node red dashboard, node-red dashboard, node red ui builder, ui builder node red, flexdash, node red dashboard alternative, node red alternative dashboard, flowfuse dashboard
tags:
- - node-red dashboard
- - flowfuse
- - ui-builder
- - comparison
+ - post
+ - node-red
- dashboard
-
+ - comparing node-red dashboards
---
When choosing a dashboard solution for Node-RED, two popular options are FlowFuse Dashboard (also known as Dashboard 2.0) and UI-Builder. This article compares these tools across several key areas, including installation, ease of use, development activity, and customizability, to help you decide which one best suits your needs.
diff --git a/src/blog/2024/08/customise-theming-in-your-dashboards.md b/src/blog/2024/08/customise-theming-in-your-dashboards.md
index e5859b1ee5..e067692171 100644
--- a/src/blog/2024/08/customise-theming-in-your-dashboards.md
+++ b/src/blog/2024/08/customise-theming-in-your-dashboards.md
@@ -8,8 +8,7 @@ image: /blog/2024/08/images/customize-theming-flowfuse-dashboard.png
tags:
- posts
- dashboard
- - flowfuse dashboard
- - customizing dashboard
+ - dashboard theming
---
A recent release of FlowFuse Dashboard (Dashboard 2.0) has taken customization to the next level.
diff --git a/src/blog/2024/08/images/mqtt-out-node-config.png b/src/blog/2024/08/images/mqtt-out-node-config.png
index d869f2c1d0..74d44cdc5a 100644
Binary files a/src/blog/2024/08/images/mqtt-out-node-config.png and b/src/blog/2024/08/images/mqtt-out-node-config.png differ
diff --git a/src/blog/2024/08/opc-ua-to-mqtt-with-node-red.md b/src/blog/2024/08/opc-ua-to-mqtt-with-node-red.md
index bf8a50527a..11bece05e6 100644
--- a/src/blog/2024/08/opc-ua-to-mqtt-with-node-red.md
+++ b/src/blog/2024/08/opc-ua-to-mqtt-with-node-red.md
@@ -5,14 +5,12 @@ description: Learn how to bridge OPC UA data to MQTT using Node-RED for seamless
date: 2024-08-13
authors: ["sumit-shinde"]
image: /blog/2024/08/images/brdging-opcua-to-mqtt.png
+keywords: opc ua gateway, opc ua example, node-red-contrib-opcua, nodered opcua, opc ua mqtt, opc ua over mqtt, opc ua to mqtt gateway, mqtt to opc ua, mqtt and opc ua, opc ua and mqtt, opc ua via mqtt, opcua to mqtt
tags:
- posts
- - flowfuse
- - node-red opc ua to mqtt integration
- - bridging opc ua data to mqtt
- - node-red mqtt protocol conversion
- - unified name space
- - digital tranformation
+ - node-red
+ - mqtt
+ - opcua
---
Have you ever found yourself trying to connect old industrial systems with new IoT tools? This is a common scenario when trying to digitally transform while setting up your Unified Name Space. Maybe you have machinery that uses OPC UA, but your data is sent through MQTT. How do you make these systems work together smoothly?
@@ -40,8 +38,12 @@ In this section, I'll demonstrate how to bridge OPC UA data to MQTT using Node-R
- OPC UA Server: Make sure you have an OPC UA server configured and running with the necessary data. For this blog, we'll use the Prosys OPC UA Simulation Server, which simulates data from CNC machines designed for testing OPC UA client applications and learning the technology. You can download it from [here](https://prosysopc.com/products/opc-ua-simulation-server/).
+- FlowFuse Account: A FlowFuse account lets you quickly create, deploy, and manage Node-RED instances in the cloud. [sign up now](https://app.flowfuse.com/account/create).
+
- [node-red-contrib-opcua](https://flows.nodered.org/node/node-red-contrib-opcua): install the node-red contrib package that will enable integration of opcua in Node-RED.
+- MQTT Broker: We’ll need an MQTT broker for data communication. FlowFuse offers an integrated MQTT Broker Service within Platform for easy setup. For more details, check out [FlowFuse's MQTT Broker Announcement](/blog/2024/10/announcement-mqtt-broker/).
+
### Retrieving Data from the OPC UA Server
To begin retrieving data from your OPC UA server using Node-RED, follow these steps:
@@ -89,7 +91,7 @@ _Setting the msg.topic with the change node to retrieve data from the OPC UA ser
Now, in this section, we will show you how to send the collected data to an MQTT broker:
1. Drag the **mqtt out** node onto the canvas.
-2. Double-click on it and configure it with your MQTT broker details. For this guide, I am using the [free HiveMQ public broker](https://www.hivemq.com/mqtt/public-mqtt-broker/), which is specially designed for testing and learning purposes.
+2. Double-click on it and configure it with your MQTT broker details.
![Configuring the mqtt out node with broker information](./images/mqtt-out-node-config.png){data-zoomable}
_Configuring the mqtt out node with broker information_
@@ -125,17 +127,17 @@ _Image showing the successful bridging of OPC UA data to MQTT_
### Up Next
-- [Using MQTT with Node-RED](https://flowfuse.com/blog/2023/07/using-mqtt-with-node-red/)
+- [Using MQTT with Node-RED](/node-red/protocol/mqtt/)
Learn how to integrate MQTT with Node-RED to enhance your IoT solutions with real-time data messaging.
-- [How to Build an OPC UA Client Dashboard in Node-RED](https://flowfuse.com/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red/)
+- [How to Build an OPC UA Client Dashboard in Node-RED](/blog/2023/07/how-to-build-a-opc-client-dashboard-in-node-red/)
Follow a step-by-step guide to create a comprehensive OPC UA client dashboard in Node-RED for effective monitoring and control.
-- [Building a Secure OPC UA Server in Node-RED](https://flowfuse.com/node-red/protocol/opa-ua/)
+- [Building a Secure OPC UA Server in Node-RED](/node-red/protocol/opc-ua/)
Explore best practices for configuring a secure OPC UA server in Node-RED to ensure safe and reliable data exchange.
-- [How to Deploy a Basic OPC UA Server in Node-RED](https://flowfuse.com/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red/)
+- [How to Deploy a Basic OPC UA Server in Node-RED](/blog/2023/07/how-to-deploy-a-basic-opc-ua-server-in-node-red/)
Learn how to quickly deploy a basic OPC UA server in Node-RED for testing and development purposes.
-- [Node-RED as a No-Code EtherNet/IP to S7 Protocol Converter](https://flowfuse.com/blog/2023/06/node-red-as-a-no-code-ethernet_ip-to-s7-protocol-converter/)
+- [Node-RED as a No-Code EtherNet/IP to S7 Protocol Converter](/blog/2023/06/node-red-as-a-no-code-ethernet_ip-to-s7-protocol-converter/)
Discover how to use Node-RED to seamlessly convert EtherNet/IP to S7 protocols with Node-RED.
diff --git a/src/blog/2024/08/opentelemetry-with-node-red.md b/src/blog/2024/08/opentelemetry-with-node-red.md
index 11a957b358..2371e4de17 100644
--- a/src/blog/2024/08/opentelemetry-with-node-red.md
+++ b/src/blog/2024/08/opentelemetry-with-node-red.md
@@ -5,12 +5,11 @@ description: Learn to integrate Open Telemetry with Node-RED to track and optimi
date: 2024-08-15
authors: ["sumit-shinde"]
image: /blog/2024/08/images/opentelemetry-with-node-red.png
+keywords: nodered opentelemetry node opentelemetry, opentelemetry nodejs example, opentelemetry node, open telemetry nodejs
tags:
- - posts
- - flowfuse
- - distributed tracing in node-red
- - open telemetry with node-red
- - how to optimize the performance of node-red flows
+ - post
+ - node-red
+ - node-red tips
---
Have you ever found yourself frustrated by unexpected delays in your Node-RED flows, wondering where the bottlenecks are hiding? Even small latency issues can have a big impact on your system's performance. That's where Open Telemetry comes in. With its powerful distributed tracing capabilities, you can finally take control and get a clear view of how your flows are performing in real time.
@@ -89,6 +88,15 @@ _Image showing the total duration taken by the flow after fixing the issue_
Throughout this guide, we’ve interacted with an exporter which is running locally. However, by deploying and setting up your exporter on a server, you can remotely monitor the performance of your Node-RED flows. This setup enables you to oversee your system's performance from anywhere, making it easier to detect and address issues promptly.
+## Enhancing Monitoring and Optimization with FlowFuse
+
+While OpenTelemetry excels at tracing and optimizing Node-RED flows, FlowFuse offers a powerful solution for managing and monitoring Node-RED instances. It streamlines the creation, deployment, and management of instances, allowing you to deploy your applications with a single click and minimizing deployment complexity and errors.
+
+FlowFuse also boosts collaboration and security through features like team management, role-based access control, multi-factor authentication, and snapshot recovery. These capabilities ensure effective management, secure access, and easy recovery from changes, making FlowFuse an essential tool for optimizing and overseeing your Node-RED deployments.
+
+**[Sign up](https://app.flowfuse.com/account/create/) now for a free trial and discover how FlowFuse can simplify your Node-RED management and deployment.**
+
## Conclusion
-Using Open Telemetry with Node-RED helps you spot and fix delays in your flows quickly. By tracking data through your system, you can see where things slow down and make improvements. This makes your IoT applications run smoother and more efficiently. With the steps in this guide, you're now ready to use distributed tracing to keep your Node-RED flows performing at their best.
+Integrating OpenTelemetry with Node-RED enables you to efficiently trace and resolve delays in your flows, ensuring smoother and more efficient operation of your IoT applications. By following the steps outlined in this guide, you can leverage distributed tracing to identify performance bottlenecks and optimize your flows effectively. With OpenTelemetry's detailed insights and FlowFuse's robust features, you'll be well-equipped to maintain peak performance and manage your Node-RED environment seamlessly.
+
diff --git a/src/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md b/src/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md
index 33a56d14f6..8d5d8034a6 100644
--- a/src/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md
+++ b/src/blog/2024/08/using-mqtt-sparkplugb-with-node-red.md
@@ -5,13 +5,12 @@ description: Explore how MQTT Sparkplug B enhances MQTT with standardized data f
date: 2024-08-22
authors: ["sumit-shinde"]
image: /blog/2024/08/images/using-sparkplug-with-node-red.png
+keywords: node red mqtt sparkplug, sparkplug mqtt, mqtt sparkplug b, sparkplug b mqtt, mqtt sparkplug b specification, sparkplug mqtt specification, mqtt sparkplug specification, mqtt sparkplug example, mqtt spark plug
tags:
- - post
- - nodered
- - MQTT sparkplug B with Node-RED
- - mqtt sparkplug b message
- - MQTT Sparkplug B example
- - node red sparkplug b
+ - posts
+ - node-red
+ - mqtt
+ - sparkplug
---
Connected devices can generate a lot of data, but without a standardized format, managing and consuming it can be tricky. MQTT certainly simplifies getting your messages delivered but it does not enforce any structure. This is where MQTT Sparkplug B helps by providing a clear, standardized format for data. In this guide, we’ll show you how to use MQTT Sparkplug B with Node-RED to make managing your device data easier and more organized.
@@ -86,9 +85,10 @@ In this section, we'll explore an example where Machine1 on the factory floor se
Before you begin, ensure you have the following:
+- FlowFuse Account: This will allow you to create and deploy Node-RED instances securely on the cloud with a single click, collaborate on your Node-RED projects with your team, manage and program your edge devices remotely, If you haven’t created an account yet, [sign up now](https://app.flowfuse.com/account/create).
- [node-red-contrib-mqtt-sparkplug-plus](https://flows.nodered.org/node/node-red-contrib-mqtt-sparkplug-plus): Install this Node-RED package for Sparkplug B support via palette manager.
-- MQTT Broker: Make sure you have your MQTT broker configuration details ready.
--
+- MQTT Broker: You’ll need an MQTT broker to send and receive messages. If you don’t have one set up, FlowFuse also offers an integrated MQTT broker service, simplifying the process of using MQTT with Node-RED without needing an external broker. For more details, check out [FlowFuse's MQTT Broker Announcement](/blog/2024/10/announcement-mqtt-broker/).
+
### Configuring Node-RED for MQTT Sparkplug B
1. Drag any mqtt sparkplug node onto the canvas.
diff --git a/src/blog/2024/09/how-to-scrape-web-data-with-node-red.md b/src/blog/2024/09/how-to-scrape-web-data-with-node-red.md
index 82bf00b5a7..ea0e38b49d 100644
--- a/src/blog/2024/09/how-to-scrape-web-data-with-node-red.md
+++ b/src/blog/2024/09/how-to-scrape-web-data-with-node-red.md
@@ -5,17 +5,10 @@ description: Learn how to use Node-RED for web scraping to efficiently collect,
date: 2024-09-16
authors: ["sumit-shinde"]
image: /blog/2024/09/images/webscraping-with-node-red.png
+keywords: node red webscraping, websrcaping with node-red, node red https request, online web scraper free, online web scraper free, custom web scraper, automated web scraping, web scraping solutions, data scraper easy web scraping
tags:
- - post
- - nodered
- - how to quickly scrap data from the web
- - Web scraping with Node-RED
- - web scraping low-code tool
- - web scraping solutions
- - simple web scraper
- - best way to web scrape
- - free web scrapping
- - automated web scraping
+ - node-red
+ - how-to
---
Web scraping has become an indispensable tool for monitoring news, tracking competitors, and gathering insights. In this guide, you'll learn how to harness the power of Node-RED for efficient web scraping, allowing you to extract and manage data from various websites with ease that are not exposed through an API.
diff --git a/src/blog/2024/09/how-to-use-subflow-in-node-red.md b/src/blog/2024/09/how-to-use-subflow-in-node-red.md
index 6177c62943..dc205a0594 100644
--- a/src/blog/2024/09/how-to-use-subflow-in-node-red.md
+++ b/src/blog/2024/09/how-to-use-subflow-in-node-red.md
@@ -5,12 +5,10 @@ description: Learn how to effectively use subflows in Node-RED with this compreh
date: 2024-09-13
authors: ["sumit-shinde"]
image: /blog/2024/09/images/subflow-in-node-red.png
+keywords: node red subflow, nodered subflow, node red subflow environment variables, node red create subflow, node red subflows
tags:
- - post
- - nodered
- - nodered subflow
- - subflow node red
- - how to use subflow in nodered
+ - node-red
+ - how-to
---
In traditional programming, managing complex and repetitive tasks can quickly lead to a tangled mess of code that’s hard to maintain and update. To tackle this issue, developers use libraries or modules—reusable chunks of code that help organize functionality, minimize duplication, and keep codebases clean and manageable.
diff --git a/src/blog/2024/09/images/recreate-sequence-option.png b/src/blog/2024/09/images/recreate-sequence-option.png
new file mode 100644
index 0000000000..5e91398cf6
Binary files /dev/null and b/src/blog/2024/09/images/recreate-sequence-option.png differ
diff --git a/src/blog/2024/09/node-red-version-control-with-snapshots.md b/src/blog/2024/09/node-red-version-control-with-snapshots.md
index 07ac41056d..3ac02e12fa 100644
--- a/src/blog/2024/09/node-red-version-control-with-snapshots.md
+++ b/src/blog/2024/09/node-red-version-control-with-snapshots.md
@@ -5,11 +5,9 @@ description: Learn how to use snapshots for version control in Node-RED with Flo
date: 2024-09-26
authors: ["sumit-shinde", "stephen-mclaughlin"]
image: /blog/2024/09/images/snapshot-with-node-red-ff.png
+keywords: node red version control, node-red flows, node red backup, node red flow backup
tags:
- - posts
- - node red version control
- - nodered version control
- - node-red flow backup
+ - flowfuse
---
Version control is essential, especially when multiple people are working on the same Node-RED project. Without it, changes can easily overlap, or worse — accidental updates could break critical flows. FlowFuse solves this challenge with snapshots, allowing you to create backups of your flows, restore previous versions, and safeguard your project from unexpected issues.
diff --git a/src/blog/2024/10/announcement-mqtt-broker.md b/src/blog/2024/10/announcement-mqtt-broker.md
new file mode 100644
index 0000000000..36943278af
--- /dev/null
+++ b/src/blog/2024/10/announcement-mqtt-broker.md
@@ -0,0 +1,85 @@
+---
+title: "MQTT Service Now Available on FlowFuse"
+subtitle: We are thrilled to announce a significant milestone for FlowFuse, we now offer our very own MQTT service, built-in and ready to use with your node-RED applications.
+description: We are thrilled to announce a significant milestone for FlowFuse, we now offer our very own MQTT service, built-in and ready to use with your node-RED applications.
+date: 2024-10-31
+authors: ["joe-pavitt"]
+image: /blog/2024/10/images/ff-mqtt.png
+tags:
+ - posts
+ - news
+ - flowfuse
+ - node-red
+---
+
+In our [recent product update](/blog/2024/10/flowfuse-release-2-10) we have added our very own MQTT service, built-in and ready to use alongside your Node-RED applications. We are always engaging with users and prospective customers and this has been a highly requested feature, and so we are delighted to announce that this is now live on FlowFuse Cloud for our Team and Enterprise teams.
+
+
+
+The MQTT Service is available now on [FlowFuse Cloud](https://flowfuse.com/product/cloud/). FlowFuse permits you to setup your own secure clients to begin publishing and subscribing to your own topics.
+
+You can now use FlowFuse to manage your own MQTT Clients alongside your Node-RED instances, making it easier to build full-stack, event-driven applications within FlowFuse.
+
+## Use Cases
+FlowFuse MQTT Service simplifies access to real-time data, an important element in optimizing industrial processes. With the power of FlowFuse, Node-RED and the MQTT service, your integrations are now even easier. Here are some typical uses cases:
+* Connect your MQTT enabled PLCs (like Omron N Series, Siemens S7, etc) to your Node-RED instance to open up such possibilities like:
+ * Data collection and analysis, Predictive Maintenance, OEE, Condition Based Monitoring.
+ * Triggering actions like sending Emails or alerting your engineers about an event.
+ * Realtime production monitoring of your facility.
+* Make use of modern IIoT devices on legacy systems by bridging the gap with MQTT.
+* Connect disparate systems together where Node-RED and FlowFuse act as the central hub for data processing and routing. This gives you the advantage of transforming data on the fly, applying extra contextual data from other systems, apply routing rules, and much more.
+
+## Pricing
+
+If you're on the Team or Enterprise tiers of FlowFuse Cloud, then you don't have to pay any extra to get started with the MQTT Service.
+
+- **Team Tier:** Includes **5 clients for free** as part of your existing plan
+- **Enterprise Tier:** Includes **20 clients for free** as part of your existing plan
+
+In the near future we'll be publishing extra packages of clients that you can add to your team, beyond the amounts included with the base tiers.
+
+## Getting Started
+
+To get started with your own MQTT Clients, navigate to [FlowFuse Cloud](https://app.flowfuse.com), and Sign In.
+
+1. Click the new "Broker" option in the left navigation menu
+2. Click "Create Client"
+
+![Screenshot of FlowFuse's "Create Client" interface](./images/mqtt-broker-add-client.png){data-zoomable}
+_Screenshot of FlowFuse's "Create Client" interface_
+
+3. Fill out the client's credentials (Username + Password)
+4. Define the "Access Control Rules" (see more below)
+5. Click "Confirm"
+
+With your client created, you can then, in Node-RED, use the MQTT nodes to connect to your new client.
+
+Setting up a new broker in Node-RED, you can use your credentials accordingly:
+
+![Screenshot of the MQTT Config, "Connection" tab in the Node-RED Editor](./images/mqtt-broker-config.png){data-zoomable}{width=400}
+_Screenshot of the MQTT Config, "Connection" tab in the Node-RED Editor_
+
+And the respective "Security" tab:
+
+![Screenshot of the MQTT Config, "Security" tab in the Node-RED Editor](./images/mqtt-broker-security.png){data-zoomable}{width=440}
+_Screenshot of the MQTT Config, "Security" tab in the Node-RED Editor_
+
+### Access Control Rules
+
+In MQTT, you can publish and subscribe to _topics_.
+
+These topics are strings that you can use to organise your data. In the Access Control Rules, you can define which topics your client can publish and subscribe to.
+
+For example, in a flow deployed to many PLCs on your factory floor, you might be publishing to the topics `factory/body-shop/plc/1`, `factory/body-shop/plc/2`, etc.
+
+![Simplified example of MQTT data flow for a Factory Floor](./images/mqtt-factory-architecture.jpg){data-zoomable}
+_Simplified example of MQTT data flow for a Factory Floor_
+
+Then, in a Cloud-Hosted flow, you can subscribe to `factory/body-shop/plc/#` to receive all messages from all PLCs in the body shop, and display relevant data into a Dashboard.
+
+Each client that you create can be constrained in two ways:
+
+- **Action**: You can limit clients to whether than can _only_ subscribe, _only_ publish, or conduct both actions.
+- **Topic**: You can control which topics a given client can interact with.
+
+These constraints are particularly useful to ensure security throughout your MQTT network, and to ensure that data is only being sent and received by the correct components.
\ No newline at end of file
diff --git a/src/blog/2024/10/dashboard-new-group-type-app-icon-and-charts.md b/src/blog/2024/10/dashboard-new-group-type-app-icon-and-charts.md
new file mode 100644
index 0000000000..4c7ad98217
--- /dev/null
+++ b/src/blog/2024/10/dashboard-new-group-type-app-icon-and-charts.md
@@ -0,0 +1,70 @@
+---
+title: Dialogs, Customizable Icons and Histograms Now Available in FlowFuse Dashboard
+subtitle: Our latest update for FlowFuse Dashboard introduces a new group type, Dialog, a new chart variation, Histogram and customization support for the application icon.
+description: Our latest update for FlowFuse Dashboard introduces a new group type, Dialog, a new chart variation, Histogram and customization support for the application icon.
+date: 2024-10-11
+authors: ["gayan-sandamal"]
+image: /blog/2024/10/images/dashboard-1-18-0-blog-tile.png
+tags:
+ - posts
+ - news
+ - flowfuse
+ - dashboard
+---
+
+This update introduces new ways to enhance data visualization and customization in your dashboards. With key improvements, including a new chart type, customizable app icon support and a dialog feature for groups, this release helps tailor dashboards for better user interaction and flexibility.
+
+
+
+## New Chart Type: Histogram
+
+Histograms are an essential tool for data analysis, offering a clear way to visualize distributions. The latest Dashboard update introduces a fully customizable histogram chart type, allowing you to present frequency distributions for your data.
+
+Whether analyzing performance metrics or user activity, histograms can give you a clear view of how data points are distributed across predefined ranges. You can now easily group data and control the range, providing deeper insights at a glance.
+
+![Screenshot showing the new Histogram chart type](./images/chart-histogram.png){data-zoomable}
+_Screenshot showing the new Histogram chart type_
+
+The real advantage of this new Histogram chart type is that it simplifies the process for you. Just pass in the raw data, and the histogram will automatically organize it into meaningful ranges, then display how often each range occurs. This makes it incredibly easy to extract valuable insights without the need for manual data processing.
+
+You can see an example flow for the Histogram chart type [here](https://dashboard.flowfuse.com/nodes/widgets/ui-chart.html#histograms) in our documentation.
+
+## Customizable App Icon
+
+Branding is an essential part of any user experience and with this new feature, you can customize your dashboard's app icon. The Node-Red Dashboard 2.0 now allows users to provide their own application icon, which appears in the browser tab and when the dashboard is installed as a Progressive Web App (PWA). This customization helps reinforce your brand, whether you’re developing IoT solutions, monitoring systems or creating dashboards for end-users.
+
+![Screenshot showing the customizable app icon in browser and as a PWA](./images/app-icon-installation.png){data-zoomable style="max-width: 400px; margin: auto;"}
+_Screenshot showing the customizable app icon in browser and as a PWA_
+
+You can configure the icon by navigating to the base UI settings (ui-base) and providing an icon URL.
+
+You can read more about how to use this feature in the [App Icon Documentation](https://dashboard.flowfuse.com/nodes/config/ui-base.html#application-icon)
+
+## Building Dialogs
+
+Organizing data on dashboards has become more efficient with the new "Dialog/Modal" feature. Groups in Dashboard now have a new ["Type"](https://dashboard.flowfuse.com/nodes/config/ui-group.html#type) property, so they can be rendered inline as before, or instead rendered as a Dialog. The display of the dialog groups can be controlled (opened/closed) via the [Control](https://dashboard.flowfuse.com/nodes/widgets/ui-control.html#show-hide) node.
+
+This removes the need for building custom modals and dialogs in a Template node, and makes the entire experience of building your dialogs low-code.
+
+![Screenshot showing groups rendered as dialogs in the dashboard](./images/ui-group-type-dialog.png){data-zoomable}
+_Screenshot showing groups rendered as dialogs in the dashboard_
+
+By utilizing groups as dialogs, users can maintain a clean dashboard while still having quick access to detailed data when required.
+
+You can read more about the new property, and see an example flow in the [UI Group Documentation](https://dashboard.flowfuse.com/nodes/config/ui-group.html#type)
+
+## What else is new?
+
+You can find the full 1.18.0 Release Notes [here](https://github.com/FlowFuse/node-red-dashboard/releases/tag/v1.18.0).
+
+Just to highlight a few, particularly valuable, updates and fixes:
+ - UI Chart - Group tooltips for line chart.
+ - UI Button Group
+ - Show node status
+ - Add pointerdown/pointerup event handling and fix button theming bug
+ - UI Table - Support key type option for entering fixed strings as item labels
+ - UI Switch - Layout Switching with Dynamic Configuration Support
+
+## What's Next?
+
+Work has already begun on the next release, `1.19.0`, you can see what items we have queued up [here](https://github.com/orgs/FlowFuse/projects/15/views/1), if you've got any feedback or suggestions, please do let us know, and feel free to open new issues on our [GitHub](https://github.com/FlowFuse/node-red-dashboard/issues)
\ No newline at end of file
diff --git a/src/blog/2024/10/exploring-flowfuse-project-nodes.md b/src/blog/2024/10/exploring-flowfuse-project-nodes.md
new file mode 100644
index 0000000000..578a5dc704
--- /dev/null
+++ b/src/blog/2024/10/exploring-flowfuse-project-nodes.md
@@ -0,0 +1,210 @@
+---
+title: Using FlowFuse Project Nodes for Faster and More Efficient Communication
+subtitle: Easy Communication Between Node-RED Instances with FlowFuse
+description: Learn how to use FlowFuse project nodes for quick and efficient communication between Node-RED instances, making monitoring and data requests easier.
+date: 2024-10-07
+authors: ["sumit-shinde"]
+image: /blog/2024/10/images/exploring-flowfuse-project-nodes.png
+tags:
+ - post
+ - flowfuse project nodes
+ - node-red mqtt
+ - node red mqtt
+ - node red communication protocols
+---
+
+Node-RED is a powerful tool for IoT application development, connecting various services and devices. However, establishing communication between different Node-RED instances—whether for monitoring or control—can be complex. This often requires detailed configurations and protocols like MQTT, HTTP, or CoAP, despite its seamless integration with many protocols.
+
+FlowFuse addresses this challenge with project nodes designed for easy and efficient communication between Node-RED instances. This guide will show you how to use FlowFuse project nodes to enhance communication and integration, complete with practical demonstrations.
+
+## What Are FlowFuse Project Nodes?
+
+[FlowFuse](/) is a platform that helps manage multiple Node-RED instances in one place. This centralized management makes it easier for teams to collaborate and share resources while simplifying scaling and enhancing project security.
+
+To facilitate communication between these centrally organized instances, FlowFuse introduces specific project nodes that enable easy and secure message exchange without complex setup. Behind the scenes, these project nodes utilize MQTT, ensuring that communication is lightweight and fast.
+
+These project nodes include three main types:
+
+![Image: Project nodes.](./images/project-nodes.png){data-zoomable}
+_Left :Project-in node, Middle: Project-out node, Right: Project-call node_
+
+- **Project In**: Listens for messages being broadcast by other Node-RED instances or for messages sent directly to this instance.
+- **Project Out**: Sends messages to other Node-RED instances.
+- **Project Call**:Sends messages to other Node-RED instances to trigger specific flows and waits for a response that can be sent using the project out node.
+
+## Using FlowFuse Project nodes
+
+In this section, we will explore how to use the FlowFuse project nodes. We’ll begin by explaining the Project In and Project Out nodes, followed by a detailed look at the Project Call node.
+
+### Using Project in and out nodes
+To demostrate this nodes, we will use an example where a central instance monitors the CPU performance of multiple Node-RED instances every 10 seconds.
+
+Before we start, let’s understand their configurations:
+
+#### Project In Node
+
+- **Name**: A descriptive label for the node.
+- **Source**:
+ - **Receive**: Select this option to receive messages sent specifically to this instance.
+ - **Receive Broadcast From**: Choose this option to listen for messages broadcast from other instances. A dropdown will include the names of all instances within your team.
+- **Topic**: This field allows you to specify a topic, similar to MQTT, to categorize the messages.
+
+#### Project Out Node
+
+- **Name**: A descriptive label for the node.
+- **Mode**:
+ - **Send Specified Project Node**: This option allows you to send a specific message or payload to the selected instance. Use this for one-way communication.
+ - **Return Project Link Call**: This option sends used to sent response back using a Project Out node project call node.
+- **Target**:
+ - **Send Message To Instance**: A dropdown to select the instance.
+ - **Broadcast Messages**: Option to send messages to all instances.
+- **Topic**: This field allows you to specify a topic, similar to MQTT, to categorize the messages.
+
+## Example: Monitoring CPU Performance Of Node-RED Instances
+
+## Prerequisites
+
+Before we begin, ensure you have installed the following nodes via the Palette Manager:
+
+- **node-red-contrib-cpu**: This node is essential for monitoring CPU performance. Install it on the instances that you want to monitor.
+- **@flowfuse/node-red-dashboard**: This node is used for creating a dashboard interface. Install it on the central instance, as we will be visualizing the CPU performance data collected from the monitored instances.
+
+### Creating the Flow on the Instances to Monitor
+
+In this section, we will learn how to create a flow that monitors CPU performance and sends data using **Project out**. We will also discuss how to make this flow reusable, allowing you to apply the same setup across multiple instances without editing the flow each time.
+
+1. Drag the **Inject** node onto the canvas and set the repeat interval to "2 seconds". This will trigger the flow after every 2 seconds.
+2. Drag the **CPU** node onto the canvas. Double-click it to configure, enable the option "Send message for overall usage," and click "Done".
+3. Drag the **Change** node onto the canvas. Configure it to add metadata, including the instance name, instance ID, using default environment variablesand and the CPU data received from the CPU node.
+4. Drag the **Project Out** node onto the canvas. Double-click it to set the Mode to "Send to specified project node." For the Target, select "Send message to instance" and choose the name of your centralized instance.
+5. Next, Enter the topic as "cpu-performance".
+6. Connect the output of the **Inject** node to the input of the **CPU** node, the output of the **CPU** node to the input of the **Change** node, and finally, connect the **Change** node to the **Project Out** node.
+
+{% renderFlow %}
+[{"id":"dd182fedce6c532a","type":"inject","z":"fe61f54c8563279d","name":"","props":[{"p":"payload"}],"repeat":"1","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":190,"y":200,"wires":[["c47bc42f8a6f6884"]]},{"id":"e0dd915a7b37af2b","type":"project link out","z":"fe61f54c8563279d","name":"project out 1","mode":"link","broadcast":false,"project":"054bb5cf-20df-431f-a00b-29b28e160b27","topic":"cpu-performance","x":770,"y":200,"wires":[]},{"id":"05a9ec7b2ae57cc0","type":"change","z":"fe61f54c8563279d","name":"","rules":[{"t":"set","p":"data.name","pt":"msg","to":"FF_INSTANCE_NAME","tot":"env"},{"t":"set","p":"data.cpu","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":200,"wires":[["e0dd915a7b37af2b"]]},{"id":"c47bc42f8a6f6884","type":"cpu","z":"fe61f54c8563279d","name":"","msgCore":false,"msgOverall":true,"msgArray":false,"msgTemp":false,"x":370,"y":200,"wires":[["05a9ec7b2ae57cc0"]]}]
+{% endrenderFlow %}
+
+By utilizing environment variables, this flow becomes reusable, allowing you to copy and paste flow to monitor multple instances.
+
+### Receiving Data to Monitor and Visualize
+
+![Image: Line chart visualizing CPU performance of all instances.](./images/device-monitoring-chart.gif){data-zoomable}
+_Image: Line chart visualizing CPU performance of all instances._
+
+To receive the CPU data from monitored instances, follow these steps in your centralized Node-RED instance:
+
+1. Open the editor for your central instance.
+2. Drag the **Project In** node onto the canvas.
+3. Double-click the **Project In** node and set the **Source** to "Listen for broadcast messages from." Select the name of the instances you want to monitor from the dropdown. If you want data from all instances, select "All instances and devices."
+4. Enter the **Topic** as "cpu-performance" (or the topic you configured in the Project Out nodes).
+5. Drag a **ui-chart** widget onto the canvas. Set the chart type to "line" and configure the series to `msg.payload`.
+6. Connect the output of the **Project In** node to the input of the **ui-chart** node.
+7. Click the "deploy" button.
+
+{% renderFlow %}
+[{"id":"2d681b19eb5799b7","type":"change","z":"d382bd2b5733a3a9","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"data.cpu","tot":"msg"},{"t":"set","p":"topic","pt":"msg","to":"data.name","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":400,"y":220,"wires":[["307d9c5913509557"]]},{"id":"307d9c5913509557","type":"ui-chart","z":"d382bd2b5733a3a9","group":"d0dbd4016c7aac21","name":"","label":"chart","order":1,"chartType":"line","category":"topic","categoryType":"msg","xAxisLabel":"","xAxisProperty":"","xAxisPropertyType":"property","xAxisType":"time","xAxisFormat":"","xAxisFormatType":"auto","yAxisLabel":"","yAxisProperty":"","ymin":"","ymax":"","action":"append","stackSeries":false,"pointShape":"cross","pointRadius":4,"showLegend":true,"removeOlder":1,"removeOlderUnit":"3600","removeOlderPoints":"","colors":["#0095ff","#ff0000","#ff7f0e","#2ca02c","#a347e1","#d62728","#ff9896","#9467bd","#c5b0d5"],"textColor":["#666666"],"textColorDefault":true,"gridColor":["#e5e5e5"],"gridColorDefault":true,"width":"12","height":8,"className":"","x":630,"y":220,"wires":[[]]},{"id":"465ee550bf9d101d","type":"project link in","z":"d382bd2b5733a3a9","name":"project in 1","project":"all","broadcast":false,"topic":"cpu-performance","x":180,"y":220,"wires":[["2d681b19eb5799b7"]]},{"id":"d0dbd4016c7aac21","type":"ui-group","name":"Device Monitoring Chart","page":"39fae809f6f7fc7b","width":"12","height":"1","order":1,"showTitle":true,"className":"","visible":"true","disabled":"false"},{"id":"39fae809f6f7fc7b","type":"ui-page","name":"Device Monitoring","ui":"ded86f3820342985","path":"/charts-example","icon":"chart-box-outline","layout":"grid","theme":"5075a7d8e4947586","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"ded86f3820342985","type":"ui-base","name":"My Dashboard","path":"/dashboard","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"showPageTitle":true,"navigationStyle":"default","titleBarStyle":"default"},{"id":"5075a7d8e4947586","type":"ui-theme","name":"Default Theme","colors":{"surface":"#ffffff","primary":"#0094CE","bgPage":"#eeeeee","groupBg":"#ffffff","groupOutline":"#cccccc"},"sizes":{"pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}}]
+{% endrenderFlow %}
+
+Once deployed, open the dashboard to view an interactive live line chart displaying the CPU performance of all monitored devices.
+
+#### Visualizing Data for Specific Devices
+
+![Image: Gauges visualizing the CPU performance of different devices.](./images/device-monitoring-gauges.gif){data-zoomable}
+_Image: Gauges visualizing the CPU performance of different devices._
+
+To visualize CPU data for specific devices separately, configure the **Project In** node to "Listen for broadcast messages from" and select the desired instance name that you want to monitor.
+
+In the instance sending the CPU data for monitoring, set the **Project Out** node to "Broadcast messages." This will send CPU data to all instances within your team, allowing the centralized instance to capture and display the information.
+
+If you prefer not to use broadcasting, configure the **Project Out** node with specific topics. This will ensure that receiving nodes capture only specific instance data based on the topic. You can then connect these nodes to gauge nodes to distinctly display the CPU performance for each instance.
+
+{% renderFlow %}
+[{"id":"c0021ca894dd3e17","type":"change","z":"d382bd2b5733a3a9","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"data.cpu","tot":"msg"},{"t":"set","p":"ui_update.label","pt":"msg","to":"data.name","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":140,"wires":[["932a6733d53ab87d"]]},{"id":"426925e74d8e30f5","type":"project link in","z":"d382bd2b5733a3a9","name":"project in 1","project":"04175120-ebeb-4813-8910-03f92f8ed429","broadcast":true,"topic":"cpu-performance","x":140,"y":140,"wires":[["c0021ca894dd3e17"]]},{"id":"932a6733d53ab87d","type":"ui-gauge","z":"d382bd2b5733a3a9","name":"","group":"087559f9b99f047a","order":1,"width":"4","height":"4","gtype":"gauge-half","gstyle":"needle","title":"gauge","units":"units","icon":"","prefix":"","suffix":"","segments":[{"from":"0","color":"#5cd65c"},{"from":"4","color":"#ffc800"},{"from":"7","color":"#ea5353"}],"min":0,"max":10,"sizeThickness":16,"sizeGap":4,"sizeKeyThickness":8,"styleRounded":true,"styleGlow":false,"className":"","x":590,"y":140,"wires":[]},{"id":"38539dc4bfdbf6be","type":"change","z":"d382bd2b5733a3a9","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"data.cpu","tot":"msg"},{"t":"set","p":"ui_update.label","pt":"msg","to":"data.name","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":240,"wires":[["bdbcd5f9f8ac610c"]]},{"id":"e36b12aa51d365fe","type":"project link in","z":"d382bd2b5733a3a9","name":"project in 2","project":"04175120-ebeb-4813-8910-03f92f8ed429","broadcast":true,"topic":"cpu-performance","x":140,"y":240,"wires":[["38539dc4bfdbf6be"]]},{"id":"bdbcd5f9f8ac610c","type":"ui-gauge","z":"d382bd2b5733a3a9","name":"","group":"6cf5326fe928c9cf","order":1,"width":"4","height":"4","gtype":"gauge-half","gstyle":"needle","title":"gauge","units":"units","icon":"","prefix":"","suffix":"","segments":[{"from":"0","color":"#5cd65c"},{"from":"4","color":"#ffc800"},{"from":"7","color":"#ea5353"}],"min":0,"max":10,"sizeThickness":16,"sizeGap":4,"sizeKeyThickness":8,"styleRounded":true,"styleGlow":false,"className":"","x":590,"y":240,"wires":[]},{"id":"a2e1fba0e9cd985a","type":"change","z":"d382bd2b5733a3a9","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"data.cpu","tot":"msg"},{"t":"set","p":"ui_update.label","pt":"msg","to":"data.name","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":340,"wires":[["c298b64b260df708"]]},{"id":"dcfe73c16e17648a","type":"project link in","z":"d382bd2b5733a3a9","name":"project in 3","project":"8a611136-6e3f-447e-9436-34b2d00eac8e","broadcast":true,"topic":"cpu-performance","x":140,"y":340,"wires":[["a2e1fba0e9cd985a"]]},{"id":"c298b64b260df708","type":"ui-gauge","z":"d382bd2b5733a3a9","name":"","group":"ee5fc3eb29a7ee4b","order":1,"width":"4","height":"4","gtype":"gauge-half","gstyle":"needle","title":"gauge","units":"units","icon":"","prefix":"","suffix":"","segments":[{"from":"0","color":"#5cd65c"},{"from":"4","color":"#ffc800"},{"from":"7","color":"#ea5353"}],"min":0,"max":10,"sizeThickness":16,"sizeGap":4,"sizeKeyThickness":8,"styleRounded":true,"styleGlow":false,"className":"","x":590,"y":340,"wires":[]},{"id":"087559f9b99f047a","type":"ui-group","name":"Device Group 1","page":"39fae809f6f7fc7b","width":"4","height":"2","order":3,"showTitle":false,"className":"","visible":"true","disabled":"false"},{"id":"6cf5326fe928c9cf","type":"ui-group","name":"Device Group 2","page":"39fae809f6f7fc7b","width":"4","height":"2","order":2,"showTitle":false,"className":"","visible":"true","disabled":"false"},{"id":"ee5fc3eb29a7ee4b","type":"ui-group","name":"Device Group 3","page":"39fae809f6f7fc7b","width":"4","height":"2","order":1,"showTitle":false,"className":"","visible":"true","disabled":"false"},{"id":"39fae809f6f7fc7b","type":"ui-page","name":"Device Monitoring","ui":"ded86f3820342985","path":"/charts-example","icon":"chart-box-outline","layout":"grid","theme":"5075a7d8e4947586","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"ded86f3820342985","type":"ui-base","name":"My Dashboard","path":"/dashboard","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"showPageTitle":true,"navigationStyle":"default","titleBarStyle":"default"},{"id":"5075a7d8e4947586","type":"ui-theme","name":"Default Theme","colors":{"surface":"#ffffff","primary":"#0094CE","bgPage":"#eeeeee","groupBg":"#ffffff","groupOutline":"#cccccc"},"sizes":{"pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}}]
+{% endrenderFlow %}
+
+This example showcases one of many powerful use cases for FlowFuse project nodes. By utilizing these capabilities, you can transform how your Node-RED instances communicate, enabling efficient workflows and innovative solutions.
+
+## Using Project Call Nodes
+
+**Project Call** nodes are ideal for triggering flows deployed on another Node-RED instance and retrieving the final result as a response. While they function similarly to [webhooks](/node-red/integration-technologies/webhook/), they utilize [MQTT](/node-red/protocol/mqtt/) as their underlying mechanism instead of HTTP. In this section, we will demonstrate the use of a **Project Call** node through an example of making an on-demand temperature request.
+
+### How Project Call Nodes Work
+
+The **Project Call** node does not operate in isolation; it requires both **Project In** and **Project Out** nodes to function properly. The **Project Call** node triggers the **Project In** node deployed on the specified target instance, while the **Project Out** node handles the response. This means the flow that needs to be triggered should start with a **Project In** node and end with a **Project Out** node.
+
+### Example: On-Demand Temperature Request
+
+In this example, we will trigger a flow on a Raspberry Pi instance that reads the temperature using a DHT11 sensor and sends the response back to the instance where we use the **Project Call** node.
+
+Before we start, let’s review the configuration options for the **Project Call** node:
+
+#### Project Call Node Configuration
+
+- **Name**: A descriptive label for the node.
+- **Timeout**: Set the duration to wait for a response before timing out.
+- **Target**: Specify the target instance where the flow is deployed.
+- **Topic**: This field allows you to specify a topic, similar to MQTT, to categorize the messages.
+
+#### Prerequisites
+
+Before we begin, ensure you have the following prepared:
+
+- **node-red-contrib-dht-sensor**: Install this node via the palette manager. This node is used to manage the connection to a DHT11 or DHT22 sensor on a Raspberry Pi.
+- **FlowFuse Device Agent Setup**: Ensure you have set up and are running the FlowFuse device agent on your Raspberry Pi, and it is connected to the platform.
+
+#### Developing a Flow to Handle On-Demand Data Requests
+
+Throughout this section, we will explore how to utilize the **Project Call** node along with **Project In** and **Project Out** nodes to trigger a flow that retrieves temperature readings from a Raspberry Pi on demand.
+
+***Note**: Before proceeding, make sure your device is assigned to an instance. If the device is assigned to an application, you cannot use Project nodes, as they are designed to work with instances.*
+
+{% renderFlow %}
+[{"id":"bdb27b9ab0d94897","type":"inject","z":"b152a914653d9fce","name":"Trigger","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"5","crontab":"","once":true,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":260,"y":380,"wires":[["8a4fe9cf342b6156"]]},{"id":"4ece54ca3c91f7ff","type":"debug","z":"b152a914653d9fce","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":680,"y":380,"wires":[]},{"id":"8a4fe9cf342b6156","type":"rpi-dht22","z":"b152a914653d9fce","name":"","topic":"rpi-dht22","dht":"11","pintype":"0","pin":4,"x":460,"y":380,"wires":[["4ece54ca3c91f7ff"]]}]
+{% endrenderFlow %}
+
+1. Copy/download the flow above and import/upload it into your Raspberry Pi Node-RED instance. Ensure you have correctly interfaced the DHT11 sensor with your Raspberry Pi. For more information, refer to our guide on [Setting Up Node-RED on Raspberry Pi 4](/node-red/hardware/raspberry-pi-4/), which explains how to install the device agent on the Raspberry Pi and read temperature data from the DHT11 sensor.
+2. Deploy the flow.
+
+Once you deploy the flow, you will see the temperature data displayed on the Debug panel if everything was done correctly. Now, let’s add the project nodes to trigger the temperature reading flow on demand and retrieve the data accordingly.
+
+3. Drag the **Project In** node onto the canvas, double-click on it, and set the source to "Receive messages sent to this instance." Next, enter the topic.
+4. Replace the **Inject** node with the **Project In** node.
+5. Next, you can add a **Change** node to format the data received by the **DHT** node.
+6. Drag the **Project Out** node onto the canvas, double-click on it, and set the mode to "Return to project link call."
+
+Once the flow is ready, deploy it. The final flow should look like the one below:
+
+{% renderFlow %}
+[{"id":"020ede0bf68cf063","type":"change","z":"fe61f54c8563279d","name":"","rules":[{"t":"set","p":"data.temperature","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"data.humidity","pt":"msg","to":"humidity","tot":"msg"},{"t":"delete","p":"payload","pt":"msg"},{"t":"delete","p":"humidity","pt":"msg"},{"t":"set","p":"topic","pt":"msg","to":"rpi-dht11","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":560,"y":220,"wires":[["1a592414ab69f1d8"]]},{"id":"a39fcfcd133ecaae","type":"project link in","z":"fe61f54c8563279d","name":"project in 1","project":"all","broadcast":false,"topic":"temperature","x":160,"y":220,"wires":[["16e8a24545d3258f"]]},{"id":"1a592414ab69f1d8","type":"project link out","z":"fe61f54c8563279d","name":"project out 1","mode":"return","broadcast":false,"project":"b1dd1d7d-556e-4dd4-9b8f-d78ffe3f510d","topic":"","x":790,"y":220,"wires":[]},{"id":"16e8a24545d3258f","type":"rpi-dht22","z":"fe61f54c8563279d","name":"","topic":"rpi-dht11","dht":"11","pintype":"0","pin":4,"x":340,"y":220,"wires":[["020ede0bf68cf063"]]}]
+{% endrenderFlow %}
+
+Now that we have added the **Project In** and **Project Out** nodes, the flow can be triggered to read the temperature from any Node-RED instance within your team using the **Project Call** node and receive the response.
+
+#### Triggering the Flow and Receiving Temperature Data
+
+In this section, we will explore how to trigger the flow we created in the previous step and receive the on-demand temperature data.
+
+1. Navigate to the instance within your team where you want to receive the data.
+2. Drag the **Project Call** node onto the canvas. Double-click it to set the timeout according to your preference, then set the target to the instance where your flow needs to be triggered. Next, enter the topic you configured in the **Project In** node previously.
+3. Drag an **Inject** node onto the canvas and connect it to the input of the **Project Call** node. This will allow you to trigger the **Project Call** node manually.
+4. Finally, drag a **Debug** node onto the canvas and connect it to the output of the **Project Call** node. This will help you view the response received from the triggered flow in the Debug panel.
+5. Deploy the flow.
+
+{% renderFlow %}
+[{"id":"8276fba516f3697b","type":"project link call","z":"d382bd2b5733a3a9","name":"","project":"d1b6cf3a-70fc-4ec4-b30c-e207338b2cc4","topic":"temperature","timeout":"30","x":530,"y":200,"wires":[["9ef6638382d7e9d5"]]},{"id":"0abdbf43350eb362","type":"inject","z":"d382bd2b5733a3a9","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":320,"y":200,"wires":[["8276fba516f3697b"]]},{"id":"9ef6638382d7e9d5","type":"debug","z":"d382bd2b5733a3a9","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":740,"y":200,"wires":[]}]
+{% endrenderFlow %}
+
+Now, once you click the **Inject** button, you will see the response that includes the temperature in the debug panel, which is read by the flow deployed on the Raspberry Pi.
+
+![Image showing the project call node triggering the flow to read the temperature data](./images/project-out-node-triggering-flow.gif){data-zoomable}
+_Image showing the project call node triggering the flow deployed on the device to read the temperature data._
+
+Now that you understand how to use FlowFuse project nodes, you can significantly improve the way your Node-RED instances communicate with one another.
+
+**Try the FlowFuse platform with its Project Node today to enhance your Node-RED instance management, streamline collaboration, improve security, and effortlessly scale your projects. Accelerate inter-instance communication with Project Nodes—start your [free trial](https://app.flowfuse.com/account/create) now!**
+
+If you are an educator or student, we offer support and provide free licenses. Contact us for more information [here](/education/).
+
+## Conclusion
+
+FlowFuse project nodes streamline communication between Node-RED instances. By using these nodes, you can easily monitor performance, request data, and more. This makes your workflows smoother and more efficient. Start using [FlowFuse](https://app.flowfuse.com/account/create) to enhance your Node-RED projects today!
diff --git a/src/blog/2024/10/exploring-flowfuse-sbom-feature.md b/src/blog/2024/10/exploring-flowfuse-sbom-feature.md
new file mode 100644
index 0000000000..6b05637329
--- /dev/null
+++ b/src/blog/2024/10/exploring-flowfuse-sbom-feature.md
@@ -0,0 +1,70 @@
+---
+title: FlowFuse's Software bills of material helps enhance Application Security and Management
+subtitle: Enhancing the Security and Compliance of Your Solutions
+description: Learn how FlowFuse SBoM improves the security and management of Node-RED solutions by tracking dependencies and identifying vulnerabilities.
+date: 2024-10-14
+authors: ["sumit-shinde"]
+image: /blog/2024/10/images/flowfuse-sbom.png
+tags:
+ - post
+ - flowfuse
+ - enhancing node-red security
+ - flowfuse software bills of material
+ - Sbom in the industrial applications
+ - sbom open source
+---
+
+FlowFuse recently launched Software Bill of Materials (SBoM) for enterprise customers. This powerful tool enhances security and management within projects, particularly in the Node-RED ecosystem. As open-source libraries and software continue to play a pivotal role in the industry, monitoring third-party components used in projects becomes essential. The SBoM enables organizations to track dependencies and identify vulnerabilities, ensuring compliance and mitigating risks.
+
+
+
+## What is an SBoM, and How Does It Enhance Security?
+
+A Software Bill of Materials (SBoM) is a detailed list of all the components that make up a software application. Just as a bill of materials for a physical product lists every part used in its construction, an SBoM provides a breakdown of all the software libraries, packages, and dependencies in a project.
+
+This transparency is crucial for security, allowing developers and organizations to track what’s inside their software. By knowing precisely what components are in use, you can quickly identify outdated or vulnerable dependencies that may pose security risks. An SBoM helps you monitor third-party nodes, ensuring that any related security issues can be addressed promptly and reducing the chance of vulnerabilities being exploited.
+
+## How You Can Use SBoM to Enhance Security in Your Node-RED Applications
+
+Here are some effective strategies for leveraging SBoM in your Node-RED applications:
+
+1. **Regular Monitoring**: Frequently review your SBoM to identify outdated or vulnerable packages. Proactive monitoring helps catch potential security threats early.
+
+2. **Timely Upgrades**: When you spot vulnerabilities in your packages, prioritize upgrading them. Keeping dependencies up to date is crucial for maintaining security and performance.
+
+3. **Evaluate Third-Party Nodes**: Assess the third-party nodes in your application. If any appear unmaintained or outdated, consider alternatives to ensure ongoing security.
+
+By integrating these practices into your workflow, you can effectively manage dependencies and strengthen the security of your Node-RED solutions.
+
+## Exploring the FlowFuse SBoM Feature
+
+To support the effective monitoring and assessment of your dependencies, FlowFuse provides a dedicated Software Bill of Materials (SBoM) interface in the platform. For those who may not be familiar, **[FlowFuse](/)** offers a comprehensive platform that enables engineers to effectively build, manage, and secure their applications. By integrating IT and operational technology (OT) environments, FlowFuse streamlines the process of connecting, collecting, transforming, and visualizing industrial data.
+
+### Accessing FlowFuse SBoM Interface
+
+The Software Bill of Materials (SBoM) interface is available at the application level. For more information on the application, refer to the [Documentation](https://flowfuse.com/docs/user/concepts/#application). To access it:
+
+1. Navigate to your Node-RED application within the FlowFuse platform.
+
+![Image showing the 'Applications' option in the FlowFuse platform](./images/applications-options-in-the-ff.png){data-zoomable}
+_Image showing the 'Applications' option in the FlowFuse platform._
+
+2. Click the **Dependencies** option at the top to switch to the SBoM interface.
+
+![Image showing the 'Dependencies' option in the FlowFuse platform for the SBoM interface.](./images/dependencies-tab-option.png){data-zoomable}
+_Image showing the 'Dependencies' option in the FlowFuse platform for the SBoM interface._
+
+*Note: This feature is only available for FlowFuse Enterprise customers.*
+
+### Understanding What the SBoM Interface Shows
+
+Once you navigate the tab, you will see a list of all the packages installed within your Node-RED Cloud instances and devices associated with that application. This includes the package names and versions, the number of devices and instances using each version, and additional details such as the latest available version of each package and the time since its release.
+
+![Image showing the Dependencies tab along with the detailed notes of each item displayed.](./images/the-dependency-tab-info.png){data-zoomable}
+_Image showing the Dependencies tab along with the detailed notes of each item displayed._
+
+Incorporating a Software Bill of Materials into your development process not only enhances security but also fosters a culture of accountability and transparency within your team. By understanding your dependencies, you can make informed decisions that protect your applications and ensure compliance with industry standards.
+
+**Try FlowFuse today with a free trial! Discover how you can enhance your Node-RED projects and accelerate your production processes. [Sign up now](https://app.flowfuse.com/account/create)!**
+
+*If you are an educator or student, we offer support and provide free licenses. Contact us for more information [here](/education/).*
diff --git a/src/blog/2024/10/exploring-flowfuse-security-features.md b/src/blog/2024/10/exploring-flowfuse-security-features.md
new file mode 100644
index 0000000000..04334db120
--- /dev/null
+++ b/src/blog/2024/10/exploring-flowfuse-security-features.md
@@ -0,0 +1,153 @@
+---
+title: FlowFuse Security Features You Didn’t Know You Needed
+subtitle: Powerful Security Features That Enhance Your Node-RED applications
+description: Discover essential FlowFuse security features that enhance protection and ensure secure Node-RED deployments. Explore tools you didn't know you needed for robust security.
+date: 2024-10-24
+authors: ["sumit-shinde"]
+image: /blog/2024/10/images/flowfuse-security-features.png
+keywords: node-red security, node red security, how to secure node-red solutions, secured solution for manufacturing, iot vulnerabilities, iot security concerns, iot and security
+tags:
+ - post
+ - flowfuse
+ - flowfuse features
+ - node-red security
+---
+
+When it comes to securing Node-RED applications and its editor, ensuring that your flows and data are protected from unauthorized access can feel like a daunting task. Even after investing considerable time, achieving the right level of security often remains a complex challenge. For enterprises, this goes far beyond access control— security is a cornerstone of protecting sensitive data, maintaining operational continuity, and meeting strict regulatory requirements. A robust security framework not only prevents breaches but also safeguards intellectual property, preserves trust, and shields the organization from costly cyber threats.
+
+
+
+Here are 9 ways FlowFuse simplifies and strengthens your Node-RED deployments, ensuring you’re fully protected without the hassle.
+
+## Default Security Measures to Keep Your Environment Safe
+
+Securing your Node-RED applications is essential to protect sensitive data, proprietary business logic, and critical systems from unauthorized access or cyberattacks. Without proper safeguards, the risks of data loss, operational disruptions, and reputational damage are significant. FlowFuse implements robust security measures right from the start, ensuring your deployments remain safe. Data is encrypted during transmission, and rate limiting prevents traffic overloads, ensuring smooth operations. Additionally, secure tunnelling facilitates safe communication between your edge devices and the FlowFuse platform. To ensure that only authorized personnel have access to your FlowFuse team, we’ve implemented strong login authentication measures, which can be further enhanced with multi-factor authentication as needed.
+
+Here’s the best part- we don’t just offer default protections; we empower you to fine-tune your security defences. FlowFuse features a user-friendly interface that allows you to customize your security settings and design a strategy tailored to your needs. Rest easy knowing that we've laid a solid security foundation while giving you the flexibility to enhance your defences.
+
+If you're interested in learning more about how we safeguard your data privacy and security, we invite you to read our detailed [security statement](/product/security/). Additionally, we are proud to announce that [FlowFuse has achieved SOC 2 Type 1 compliance](/blog/2024/01/soc2/), demonstrating our commitment to maintaining the highest standards in security and data protection.
+
+### Single Sign-On (SSO) Integration
+
+Every organization relies on various tools and platforms to enhance productivity and efficiency. Providing seamless access to these resources is vital for optimizing workflows. That’s where Single Sign-On (SSO) comes in, it simplifies the onboarding and offboarding processes.
+
+With SSO, team members can log in using their existing credentials, eliminating the hassle of remembering multiple passwords. This streamlines their login experience and enables them to be productive from day one.
+
+To implement SSO for your self-hosted FlowFuse, refer to the following resources:
+
+- [How to Set Up SSO SAML for Node-RED](/blog/2024/07/how-to-setup-sso-saml-for-the-node-red/)
+- [How to Set Up SSO LDAP for Node-RED](/blog/2024/07/how-to-setup-sso-ldap-for-the-node-red/)
+
+If you are using FlowFuse Cloud, please get in touch with us for configuration assistance.
+
+### Two-Factor Authentication (2FA)
+
+We've all been there, managing countless passwords, hoping they're strong enough to protect against security threats. But in today’s digital world, passwords alone aren’t sufficient. That’s why Two-Factor Authentication (2FA) has become essential.
+
+FlowFuse understands this need. By enabling 2FA, even if someone gets hold of your password, they'll still require a second form of verification—like a code sent to your phone—to access your account. This simple yet powerful layer of security ensures your data is much safer from unauthorized access. However, when Single Sign-On (SSO) is enabled, 2FA will be replaced by SSO's authentication process.
+
+To set up 2FA in FlowFuse, you’ll need to head over to **User Settings > Security > Two-Factor Authentication**. It’s as simple as clicking the "Enable Two-Factor Authentication" button, scanning the QR code displayed on the platform with your authenticator app, and then entering the code from your app back into FlowFuse. Once you've done that, 2FA will be up and running, adding that extra layer of security to your account!
+
+![Two-Factor Authentication](./images/2f-auth.png){data-zoomable}
+_Flowfuse: Two Factor Authentication_
+
+## Granular Role-Based Access Management
+
+With collaboration at its core, FlowFuse allows you to create teams and invite members to collaborate on projects. However, not all team members require access to every feature. Effective management is essential, as some members might feel overwhelmed by unnecessary options, and there's a risk of accidental changes being made by those who are unfamiliar with the configurations and settings.
+
+To address this, FlowFuse offers [Role-Based Access Control (RBAC)](/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse/). When inviting team members, you can assign specific roles that provide the appropriate level of access for their work:
+
+- **Owner**: Has full control over the team settings, applications, instances, and flows. Can invite users and change their roles.
+- **Member**: Can access applications and instances and modify flows, but with limited permissions compared to the Owner. Cannot manage team, application, or instance settings or invite users.
+- **Viewer**: Can view instances and flows but cannot make any changes. Ideal for users who need to monitor without editing capabilities.
+- **Dashboard Only**: Restricted to accessing the dashboard or HTTP endpoint. This role is for users who only need to monitor status without making any changes.
+
+![Role Base Accesss control](./images/rbac.png){data-zoomable}
+_Flowfuse: Role Base Accesss control_
+
+Additionally, you can later change the roles of team members in the "members" page. This helps prevent unauthorized changes and ensures a more secure and efficient workflow.
+
+### Comprehensive Activity Audit Logs
+
+Today, many organizations prioritize a culture of openness and transparency, but security remains a top concern. Our **Audit Logs** feature supports this dual focus by maintaining a comprehensive record of all actions in the platform. These logs detail who made changes, what was changed, and when it occurred, ensuring accountability and enabling teams to quickly identify any unauthorized access or mistakes that could jeopardize security.
+
+We provide audit logs at three different levels: **instance level**, where all action logs related to a specific instance are recorded; **application level**, which groups logs from instances created within a particular application; and **team level**, where all platform activities are documented but visible only to admins. This layered approach helps organizations maintain secure workflows and demonstrates their commitment to transparency, ensuring that security concerns are effectively addressed without sacrificing openness.
+
+To access the audit logs:
+
+- For **instance-level logs**, choose the specific instance you want to see and go to **Audit Logs**.
+
+![Instance-level Audit Logs](./images/instance-audit-logs.png){data-zoomable}
+_FlowFuse: Instance-level Audit Logs_
+
+- For **application-level logs**, select the application you want to view and navigate to **Audit Logs**.
+
+![Application-level Audit Logs](./images/application-audit-logs.png){data-zoomable}
+_Flowfuse: Application-level Audit Logs_
+
+- For **team-level logs**, there will be an option labeled **"Audit Logs"** in the left sidebar, accessible only to admins.
+
+![Team-level Audit Logs](./images/team-audit-logs.png){data-zoomable}
+_Flowfuse: Team-level Audit Logs_
+
+For more information refer to the [Documentation](/docs/user/logs/#audit-log)
+
+### Instance Protection Mode
+
+Imagine your Node-RED application running smoothly on the production line, seamlessly handling critical tasks and data flows. Now, picture the chaos that could ensue if someone from your team accidentally modified a flow. While we offer the [snapshot](/blog/2024/09/node-red-version-control-with-snapshots/) feature to recover previous changes, accidental modifications may not be identified quickly. Even when they are discovered, and the snapshot is used to restore the previous state, it can still take seconds or even minutes to recover, resulting in costly downtime.
+
+To prevent such scenarios, we provide a feature called **Instance Protection Mode**. This mode allows you to set flows within your Node-RED instances to read-only, ensuring that modifications can only occur through a [DevOps pipeline](/blog/2024/10/how-to-build-automate-devops-pipelines-node-red-deployments/). This process guarantees that even the most critical flows can only be altered with thorough testing and approval.
+
+![Option to Enable the Instance Protection Mode](./images/instance-protection.png){data-zoomable}
+_Flowfuse: Option to Enable the Instance Protection Mode_
+
+With Instance Protection Mode activated, team members can still view flows, but any attempts to modify them are blocked, providing an additional layer of security. This approach protects the integrity of your applications and fosters a controlled environment for making changes safely.
+
+### Secure HTTP Nodes Endpoints
+
+HTTP is one of the most widely used protocols for enabling communication between different applications and services. In Node-RED, you can quickly create these APIs using HTTP-In nodes, which allow for communication. However, while this convenience is excellent, ensuring that only authorized users can access your APIs is essential.
+
+FlowFuse provides robust options for securing all HTTP endpoints served by Flow and the Node-RED Dashboard. To manage this, each instance has a dedicated interface that you can access by navigating to **your instance -> Settings -> Security**. Here, you’ll find several options for securing your APIs:
+
+![Options to enable authentication for the HTTP endpoints created in the Node-RED instance](./images/http-api-auth.png){data-zoomable}
+_Flowfuse: Options to enable authentication for the HTTP endpoints created in the Node-RED instance._
+
+1. **None (Default)**: No authentication is enabled by default, which means anyone can access your endpoints.
+
+2. **Basic Authentication**: By selecting this option, two input fields will appear where you can enter a username and password. This ensures that only users with the correct credentials can access your APIs.
+
+3. **FlowFuse User Authentication**: This option allows all team members to use their unique usernames and passwords when requesting API.
+
+4. **Bearer Tokens**: For more advanced users, there’s an option to generate bearer tokens for secure API access without needing to send usernames and passwords. With this feature, you can also set expiration times for these tokens, ensuring that access is time-limited and reducing the risk of unauthorized use. To use bearer tokens, you must first enable **FlowFuse User Authentication**.
+
+For more information, refer to [HTTP Authentication in Node-RED with FlowFuse](/blog/2024/03/http-authentication-node-red-with-flowfuse/).
+
+With these features, FlowFuse gives you complete control over who can access your APIs created in the Node-RED instance.
+
+### API Token Management for Secure Platform Interactions
+
+We understand that organizations need to create integrations for automation, monitoring, and efficient workflows. FlowFuse provides REST APIs that allow easy interaction with various platform parts, including users, instances, teams, devices, and more. However, security settings are protected to ensure they can only be updated by admins or authorized team members directly on the platform, not via APIs.
+
+![Options to generate bearer tokens for secure API access](./images/genrate-token-for-platform-api.png){data-zoomable}
+_FlowFuse: Interface for generating bearer tokens to ensure secure interactions with the platform APIs._
+
+Protecting against unauthorized access is crucial, especially since you control and monitor your entire factory and production lines through this platform. To safeguard this, we offer an interface similar to the one used for bearer tokens. You can access this by navigating to **User Settings > Security > Tokens**.
+
+For more information, refer to the [FlowFuse Platform API docs](/docs/api/).
+
+## Software Bills of Materials
+
+Node-RED is an open-source platform maintained by dedicated community members who ensure it operates smoothly and remains free of security vulnerabilities. Similarly, there exists a vast ecosystem of open-source packages, nodes, and libraries that we frequently use in our projects. While these packages are often excellent and enhance our capabilities, some may need a regular team or individual to update and monitor them. This can lead to potential risks, as outdated or unmaintained packages can introduce vulnerabilities into our applications.
+
+To address these concerns, we recently introduced the Software Bill of Materials (SBOM) feature, which adds an extra layer of security and compliance. An SBOM is a detailed list of all an application's components. It provides a comprehensive view of all third-party libraries used in each application instance and their latest versions. This allows teams to monitor dependencies and make informed decisions about upgrades, ensuring effective dependency management and enhanced resilience against security threats.
+
+![Software Bills of Materials](./images/sbom.png){data-zoomable}
+_FlowFuse: Software Bills of Materials Inteface_
+
+For more information, refer to the [Article on FlowFuse Software Bills of Materials](/blog/2024/10/exploring-flowfuse-sbom-feature/).
+
+In conclusion, FlowFuse offers a comprehensive suite of security features designed to empower you with the tools to protect your Node-RED applications effectively. Understanding and utilizing these security features will help you maintain a secure and efficient environment for your Node-RED applications. With FlowFuse, you can confidently safeguard your deployments, ensuring robust protection against unauthorized access while enhancing collaboration within your team.
+
+## Get Started with FlowFuse Today!
+
+Be sure to enhance the security of your Node-RED applications immediately. [Sign up](https://app.flowfuse.com/account/create/) for FlowFuse now and discover how our powerful security features can protect your data and streamline your workflows. Experience peace of mind with every deployment!
diff --git a/src/blog/2024/10/flowfuse-release-2-10.md b/src/blog/2024/10/flowfuse-release-2-10.md
new file mode 100644
index 0000000000..a9bc267eea
--- /dev/null
+++ b/src/blog/2024/10/flowfuse-release-2-10.md
@@ -0,0 +1,84 @@
+---
+title: "FlowFuse 2.10: MQTT Broker, Improved Version Control & More!"
+subtitle: Let's take a look at the new features and improvements in FlowFuse 2.9
+description: Let's take a look at the new features and improvements in FlowFuse 2.9
+date: 2024-10-24
+authors: ["joe-pavitt"]
+image: /blog/2024/10/images/tile-release-2-10.png
+tags:
+ - posts
+ - flowfuse
+ - releases
+---
+
+With FlowFuse 2.10 we've added some new major features, as well as improvements across the board for FlowFuse users.
+
+Most notably, FlowFuse now offers it's own MQTT service, with the option to create MQTT client credentials for your teams, making it even easier and quicker to build your full-stack Node-RED applications.
+
+
+
+## MQTT Broker
+
+This is a significant milestone for FlowFuse, as we're now offering our own MQTT service. We have listened to a lot of feedback from users and prospective customers, and this has consistently been a regularly requested offering, and so we are delighted to announce that this is now live on FlowFuse Cloud for our Enterprise teams.
+
+![Screenshot of the UI to manage your MQTT clients](./images/screenshot-mqtt-client-config.png){data-zoomable}
+
+This feature allows you to run and manage your own MQTT Clients alongside your Node-RED instances, making it easier to build full-stack applications within FlowFuse.
+
+### Pricing
+
+From today, Enterprise teams on FlowFuse Cloud will be able to create up to 20 clients on their accounts at **no extra cost**.
+
+In the near future, users will then be able to purchase additional packs of clients to add to their team.
+
+Self-hosted Enterprise customers will be able to make use of this feature in our next release.
+## Version History - Visual Timeline
+
+Since early iterations of FlowFuse, Snapshots have played a key role in Version Control for your Node-RED flows, environment variables and settings. Whilst we still offer the same "Snapshots" view in the application, we've also added a new view to give a clearer picture of what flows are running on your Node-RED instances and _when_.
+
+![Screenshot showing an Instance's visual timeline](./images/screenshot-visual-timeline.png){data-zoomable}
+
+In this view, you can see every time a new set of flows were deployed to your Node-RED instance, no matter the source, whether that's from the Editor itself, via our [DevOps Pipelines](/docs/user/devops-pipelines/), or restoring a Snapshot.
+
+## Device Group Environment Variables
+
+We've also added in the ability to define common environment variables in your Device Groups.
+
+![Screenshot showing the new Device Group Environment Variables](../../../changelog/2024/10/images/device-group--with-env-vars.png){data-zoomable}
+
+These will now be deployed to any devices contained within a given group, and can still be overridden by environment variables defined in the Device's settings directly.
+
+See the [Device Group documentation](/docs/user/device-groups/) for more information on how to set environment variables for your device groups.
+
+## And Much More...
+
+For a full list of everything that went into our 2.10 release, you can check out the [release notes](https://github.com/FlowFuse/flowfuse/releases/tag/v2.10.0).
+
+We're always working to enhance your experience with FlowFuse. We're always interested in your thoughts about FlowFuse too. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
+
+Together, we can make FlowFuse better with each release!
+
+## Try FlowFuse
+
+### Self-Hosted
+
+We're confident you can have self managed FlowFuse running locally in under 30 minutes. You can install FlowFuse using [Docker](/docs/install/docker/) or [Kubernetes](/docs/install/kubernetes/).
+
+### FlowFuse Cloud
+
+The quickest and easiest way to get started with FlowFuse is on our own hosted instance, FlowFuse Cloud.
+
+[Get started for free]({{ site.appURL }}/account/create) now, and you'll have your own Node-RED instances running in the Cloud within minutes.
+
+## Upgrading FlowFuse
+
+If you're using [FlowFuse Cloud]({{ site.appURL }}), then there is nothing you need to do - it's already running 2.10, and you may have already been playing with the new features.
+
+If you installed a previous version of FlowFuse and want to upgrade, our documentation provides a guide for [upgrading your FlowFuse instance](/docs/upgrade/).
+
+If you have an Enterprise license please make sure to review this [changelog entry](/changelog/2024/08/enterprise-license-update)
+
+## Getting help
+
+Please check FlowFuse's [documentation](/docs/) as the answers to many questions are covered there. Additionally you can go to the [community forum](https://discourse.nodered.org/c/vendors/flowfuse/24) if you have
+any feedback or feature requests.
\ No newline at end of file
diff --git a/src/blog/2024/10/images/2f-auth.png b/src/blog/2024/10/images/2f-auth.png
new file mode 100644
index 0000000000..e02002e207
Binary files /dev/null and b/src/blog/2024/10/images/2f-auth.png differ
diff --git a/src/blog/2024/10/images/app-icon-installation.png b/src/blog/2024/10/images/app-icon-installation.png
new file mode 100644
index 0000000000..9c8cd9e3f0
Binary files /dev/null and b/src/blog/2024/10/images/app-icon-installation.png differ
diff --git a/src/blog/2024/10/images/application-audit-logs.png b/src/blog/2024/10/images/application-audit-logs.png
new file mode 100644
index 0000000000..15ed0eca77
Binary files /dev/null and b/src/blog/2024/10/images/application-audit-logs.png differ
diff --git a/src/blog/2024/10/images/applications-options-in-the-ff.png b/src/blog/2024/10/images/applications-options-in-the-ff.png
new file mode 100644
index 0000000000..7ef14adf04
Binary files /dev/null and b/src/blog/2024/10/images/applications-options-in-the-ff.png differ
diff --git a/src/blog/2024/10/images/blockly.png b/src/blog/2024/10/images/blockly.png
new file mode 100644
index 0000000000..0a8413ff11
Binary files /dev/null and b/src/blog/2024/10/images/blockly.png differ
diff --git a/src/blog/2024/10/images/centralize-node-red-instance.png b/src/blog/2024/10/images/centralize-node-red-instance.png
new file mode 100644
index 0000000000..51328cd169
Binary files /dev/null and b/src/blog/2024/10/images/centralize-node-red-instance.png differ
diff --git a/src/blog/2024/10/images/chart-histogram.png b/src/blog/2024/10/images/chart-histogram.png
new file mode 100644
index 0000000000..20ce859e9b
Binary files /dev/null and b/src/blog/2024/10/images/chart-histogram.png differ
diff --git a/src/blog/2024/10/images/dashboard-1-18-0-blog-tile.png b/src/blog/2024/10/images/dashboard-1-18-0-blog-tile.png
new file mode 100644
index 0000000000..4718caf789
Binary files /dev/null and b/src/blog/2024/10/images/dashboard-1-18-0-blog-tile.png differ
diff --git a/src/blog/2024/10/images/dependencies-tab-option.png b/src/blog/2024/10/images/dependencies-tab-option.png
new file mode 100644
index 0000000000..097019463a
Binary files /dev/null and b/src/blog/2024/10/images/dependencies-tab-option.png differ
diff --git a/src/blog/2024/10/images/device-monitoring-chart.gif b/src/blog/2024/10/images/device-monitoring-chart.gif
new file mode 100644
index 0000000000..8ccadcbf57
Binary files /dev/null and b/src/blog/2024/10/images/device-monitoring-chart.gif differ
diff --git a/src/blog/2024/10/images/device-monitoring-gauges.gif b/src/blog/2024/10/images/device-monitoring-gauges.gif
new file mode 100644
index 0000000000..e2e9e85864
Binary files /dev/null and b/src/blog/2024/10/images/device-monitoring-gauges.gif differ
diff --git a/src/blog/2024/10/images/devices.png b/src/blog/2024/10/images/devices.png
new file mode 100644
index 0000000000..2d88444b1e
Binary files /dev/null and b/src/blog/2024/10/images/devices.png differ
diff --git a/src/blog/2024/10/images/devops.png b/src/blog/2024/10/images/devops.png
new file mode 100644
index 0000000000..47b946d646
Binary files /dev/null and b/src/blog/2024/10/images/devops.png differ
diff --git a/src/blog/2024/10/images/exploring-flowfuse-project-nodes.png b/src/blog/2024/10/images/exploring-flowfuse-project-nodes.png
new file mode 100644
index 0000000000..dbc45d8ad0
Binary files /dev/null and b/src/blog/2024/10/images/exploring-flowfuse-project-nodes.png differ
diff --git a/src/blog/2024/10/images/ff-mqtt.png b/src/blog/2024/10/images/ff-mqtt.png
new file mode 100644
index 0000000000..e9482d9e9a
Binary files /dev/null and b/src/blog/2024/10/images/ff-mqtt.png differ
diff --git a/src/blog/2024/10/images/flowfuse-assistant.gif b/src/blog/2024/10/images/flowfuse-assistant.gif
new file mode 100644
index 0000000000..abe3b60163
Binary files /dev/null and b/src/blog/2024/10/images/flowfuse-assistant.gif differ
diff --git a/src/blog/2024/10/images/flowfuse-sbom.png b/src/blog/2024/10/images/flowfuse-sbom.png
new file mode 100644
index 0000000000..439fbc0ab5
Binary files /dev/null and b/src/blog/2024/10/images/flowfuse-sbom.png differ
diff --git a/src/blog/2024/10/images/flowfuse-security-features.png b/src/blog/2024/10/images/flowfuse-security-features.png
new file mode 100644
index 0000000000..edbe5e650a
Binary files /dev/null and b/src/blog/2024/10/images/flowfuse-security-features.png differ
diff --git a/src/blog/2024/10/images/genrate-token-for-platform-api.png b/src/blog/2024/10/images/genrate-token-for-platform-api.png
new file mode 100644
index 0000000000..0f7d0bb34b
Binary files /dev/null and b/src/blog/2024/10/images/genrate-token-for-platform-api.png differ
diff --git a/src/blog/2024/10/images/high-availablity.png b/src/blog/2024/10/images/high-availablity.png
new file mode 100644
index 0000000000..9fa1a6cc6c
Binary files /dev/null and b/src/blog/2024/10/images/high-availablity.png differ
diff --git a/src/blog/2024/10/images/http-api-auth.png b/src/blog/2024/10/images/http-api-auth.png
new file mode 100644
index 0000000000..143d301eeb
Binary files /dev/null and b/src/blog/2024/10/images/http-api-auth.png differ
diff --git a/src/blog/2024/10/images/imersive-editor.png b/src/blog/2024/10/images/imersive-editor.png
new file mode 100644
index 0000000000..fc18690ddb
Binary files /dev/null and b/src/blog/2024/10/images/imersive-editor.png differ
diff --git a/src/blog/2024/10/images/instance-audit-logs.png b/src/blog/2024/10/images/instance-audit-logs.png
new file mode 100644
index 0000000000..d3241aed6d
Binary files /dev/null and b/src/blog/2024/10/images/instance-audit-logs.png differ
diff --git a/src/blog/2024/10/images/instance-protection.png b/src/blog/2024/10/images/instance-protection.png
new file mode 100644
index 0000000000..c455f8f03d
Binary files /dev/null and b/src/blog/2024/10/images/instance-protection.png differ
diff --git a/src/blog/2024/10/images/instances.png b/src/blog/2024/10/images/instances.png
new file mode 100644
index 0000000000..596c94636d
Binary files /dev/null and b/src/blog/2024/10/images/instances.png differ
diff --git a/src/blog/2024/10/images/log.png b/src/blog/2024/10/images/log.png
new file mode 100644
index 0000000000..5d334237b8
Binary files /dev/null and b/src/blog/2024/10/images/log.png differ
diff --git a/src/blog/2024/10/images/mqtt-broker-add-client.png b/src/blog/2024/10/images/mqtt-broker-add-client.png
new file mode 100644
index 0000000000..0b5f1ee2a7
Binary files /dev/null and b/src/blog/2024/10/images/mqtt-broker-add-client.png differ
diff --git a/src/blog/2024/10/images/mqtt-broker-config.png b/src/blog/2024/10/images/mqtt-broker-config.png
new file mode 100644
index 0000000000..e6fd28a46e
Binary files /dev/null and b/src/blog/2024/10/images/mqtt-broker-config.png differ
diff --git a/src/blog/2024/10/images/mqtt-broker-security.png b/src/blog/2024/10/images/mqtt-broker-security.png
new file mode 100644
index 0000000000..8ee0f3ea63
Binary files /dev/null and b/src/blog/2024/10/images/mqtt-broker-security.png differ
diff --git a/src/blog/2024/10/images/mqtt-factory-architecture.jpg b/src/blog/2024/10/images/mqtt-factory-architecture.jpg
new file mode 100644
index 0000000000..847dea4028
Binary files /dev/null and b/src/blog/2024/10/images/mqtt-factory-architecture.jpg differ
diff --git a/src/blog/2024/10/images/node_function.png b/src/blog/2024/10/images/node_function.png
new file mode 100644
index 0000000000..2c25daff2d
Binary files /dev/null and b/src/blog/2024/10/images/node_function.png differ
diff --git a/src/blog/2024/10/images/project-nodes.png b/src/blog/2024/10/images/project-nodes.png
new file mode 100644
index 0000000000..4e9bc358ec
Binary files /dev/null and b/src/blog/2024/10/images/project-nodes.png differ
diff --git a/src/blog/2024/10/images/project-out-node-triggering-flow.gif b/src/blog/2024/10/images/project-out-node-triggering-flow.gif
new file mode 100644
index 0000000000..cfcd1833d8
Binary files /dev/null and b/src/blog/2024/10/images/project-out-node-triggering-flow.gif differ
diff --git a/src/blog/2024/10/images/quick-ways-to-write-function-nodes.png b/src/blog/2024/10/images/quick-ways-to-write-function-nodes.png
new file mode 100644
index 0000000000..d874ec74ab
Binary files /dev/null and b/src/blog/2024/10/images/quick-ways-to-write-function-nodes.png differ
diff --git a/src/blog/2024/10/images/rbac.png b/src/blog/2024/10/images/rbac.png
new file mode 100644
index 0000000000..7616c0f905
Binary files /dev/null and b/src/blog/2024/10/images/rbac.png differ
diff --git a/src/blog/2024/10/images/sbom.png b/src/blog/2024/10/images/sbom.png
new file mode 100644
index 0000000000..2518658ab3
Binary files /dev/null and b/src/blog/2024/10/images/sbom.png differ
diff --git a/src/blog/2024/10/images/screenshot-mqtt-client-config.png b/src/blog/2024/10/images/screenshot-mqtt-client-config.png
new file mode 100644
index 0000000000..4c74e88b87
Binary files /dev/null and b/src/blog/2024/10/images/screenshot-mqtt-client-config.png differ
diff --git a/src/blog/2024/10/images/screenshot-visual-timeline.png b/src/blog/2024/10/images/screenshot-visual-timeline.png
new file mode 100644
index 0000000000..0247a2c798
Binary files /dev/null and b/src/blog/2024/10/images/screenshot-visual-timeline.png differ
diff --git a/src/blog/2024/10/images/snapshots.png b/src/blog/2024/10/images/snapshots.png
new file mode 100644
index 0000000000..00a7dfbee1
Binary files /dev/null and b/src/blog/2024/10/images/snapshots.png differ
diff --git a/src/blog/2024/10/images/team-audit-logs.png b/src/blog/2024/10/images/team-audit-logs.png
new file mode 100644
index 0000000000..9036dad943
Binary files /dev/null and b/src/blog/2024/10/images/team-audit-logs.png differ
diff --git a/src/blog/2024/10/images/the-dependency-tab-info.png b/src/blog/2024/10/images/the-dependency-tab-info.png
new file mode 100644
index 0000000000..47ed78a98c
Binary files /dev/null and b/src/blog/2024/10/images/the-dependency-tab-info.png differ
diff --git a/src/blog/2024/10/images/tile-release-2-10.png b/src/blog/2024/10/images/tile-release-2-10.png
new file mode 100644
index 0000000000..94111d1b2f
Binary files /dev/null and b/src/blog/2024/10/images/tile-release-2-10.png differ
diff --git a/src/blog/2024/10/images/ui-group-type-dialog.png b/src/blog/2024/10/images/ui-group-type-dialog.png
new file mode 100644
index 0000000000..ace7d62d5f
Binary files /dev/null and b/src/blog/2024/10/images/ui-group-type-dialog.png differ
diff --git a/src/blog/2024/10/managing-node-red-instances-in-centralize-platfrom.md b/src/blog/2024/10/managing-node-red-instances-in-centralize-platfrom.md
new file mode 100644
index 0000000000..4a673c3a4b
--- /dev/null
+++ b/src/blog/2024/10/managing-node-red-instances-in-centralize-platfrom.md
@@ -0,0 +1,94 @@
+---
+title: "Transform Chaos into Control: Centralize Node-RED Management with FlowFuse"
+subtitle: With FlowFuse, you can simplify managing all your Node-RED Instances and remote IoT device management
+description: Discover how FlowFuse streamlines the management of your Node-RED instances from a single platform, transforming chaos into control for efficient operations and enhanced collaboration.
+date: 2024-10-18
+authors: ["sumit-shinde"]
+image: /blog/2024/10/images/centralize-node-red-instance.png
+keywords: remote device management, easy remote device management, iot device management, iot device monitoring, remote iot management, remote iot device management, iot remote device management, remote access device management, iot remote management software, remote device management platform, node-red management, node red management
+tags:
+ - post
+ - flowfuse
+---
+
+Managing a single Node-RED instance involves setting up and configuring a server, securely tunneling for remote access to edge devices, and ensuring proper networking and firewall configurations, all of which can be complex. The complexity increases when overseeing multiple Node-RED instances spread across various projects, edge devices, or environments.
+
+This situation brings additional challenges that can make management a really difficult task, often leading to confusion and frustration as teams try to keep everything running smoothly, troubleshoot issues, and ensure clear communication between instances. Consolidating control into a single platform simplifies deployment, configuration, collaboration, and oversight, making it easier to manage multiple Node-RED instances. Let’s explore how FlowFuse can centralize this management.
+
+## What is a Node-RED Instance?
+
+A [Node-RED](/node-red/) instance refers to a single, operational setup of the Node-RED application. Whether you start Node-RED on your computer, a cloud server, or an edge device, you create an instance. Each instance operates independently, allowing you to build and run automation flows or applications.
+
+## What are the Challenges of Managing Multiple Node-RED Instances?
+
+Managing multiple Node-RED instances can quickly become complicated as operations grow. Each new instance adds complexity, from configuration issues to security concerns. These challenges highlight the need for a centralized solution to simplify management and improve efficiency.
+
+1. **Deployment and Configuration Management:** Setting up Node-RED instances on a server requires technical knowledge and ongoing maintenance. As the number of instances grows, maintaining them can become time-consuming and resource-intensive.
+
+2. **Egde Node-RED Management:** Managing Node-RED instances on edge devices introduces additional challenges, such as the need for on-site troubleshooting when issues arise.
+
+3. **Monitoring and Troubleshooting:** Keeping track of the health and performance of multiple instances requires constant attention. Checking logs across different instances can become overwhelming.
+
+4. **Security Management:** Each instance requires its own security settings. Ensuring that all instances are secure and up to date can be a difficult task, especially as the number of instances increases.
+
+5. **Backup and Recovery:** Having a solid backup and recovery plan is critical. If a system crashes, you need a way to quickly restore it without losing important data.
+
+6. **Scaling:** As applications grow in complexity, scaling Node-RED instances becomes necessary. This requires expertise in server management and the ability to handle multiple instances efficiently.
+
+7. **Ensuring High Availability:** In production environments, keeping all Node-RED instances running smoothly and avoiding downtime is essential which also requires high technical exepertise
+
+A centralized platform is essential to handle deployment, configuration, and management efficiently, providing a visual interface to maintain and update instances.
+
+> "As organizations navigate the complexities of the digital age, adopting a holistic approach that integrates technology, processes, and people is essential for reaping the full benefits of IoT."
+
+## FlowFuse: Centralize Your Node-RED and IoT Device Management
+
+FlowFuse is a powerful platform designed to simplify the management of multiple Node-RED instances. By providing a centralized interface, FlowFuse enables users to manage, scale, secure, and collaborate on Node-RED solutions.
+
+![Centralized Node-RED Management](./images/instances.png)
+*Image showing how multiple Node-RED instances are organized and managed under one roof.*
+
+With FlowFuse, you can organize your Node-RED instances into teams for improved collaboration, allowing seamless teamwork on projects without the need to navigate between different instance locations physically. You can create as many teams as needed, ensuring that instances are organized based on the team members assigned to them. Additionally, you can ensure that each member has the correct permissions they require through role-based access control (RBAC), providing precise management of access and responsibilities.
+
+![Immersive Editor](./images/imersive-editor.png)
+*Image showing how FlowFuse's immersive editor simplifies managing settings and configuration within the Node-RED editor.*
+
+FlowFuse also simplifies the [monitoring and controlling of edge devices](/solutions/device-management/) through the [FlowFuse Device Agent](/product/device-agent/), which quickly connects your devices to the cloud platform and allows you to build and monitor applications remotely.
+
+![Device Management](./images/devices.png)
+*Image showing remote edge devices connected through the FlowFuse platform for remote monitoring and control.*
+
+Additionally, FlowFuse enables the creation of [DevOps pipelines](/blog/2024/10/how-to-build-automate-devops-pipelines-node-red-deployments/) that ensure your application is well-tested and evaluated before deployment to production. Deploying the same flow to hundreds or thousands of devices becomes effortless with these pipelines.
+
+![Devops Pipeline](./images/devops.png)
+*Image showing feature to create the devops pipeline for Node-RED instances*
+
+You can efficiently [monitor logs](/docs/user/logs/#logs) for each instance and receive instant email alerts if any crashes occur, facilitating quick troubleshooting.
+
+![Logs](./images/log.png)
+*Image showing the Node-RED instance logs.*
+
+FlowFuse also allows you to quickly add [high availability](/docs/user/high-availability/) features to your instances, ensuring smooth and efficient operation of your production applications. The platform includes an auto-snapshot feature that lets you recover from accidental changes to flows, ensuring you always have a backup of your application.
+
+![High availability](./images/high-availablity.png)
+*Image showing the feature that allows to enable high availability for instances*
+
+![Snapshots](./images/snapshots.png)
+*Image showing snapshots feature*
+
+We have highlighted just a few features of FlowFuse; there are many more—potentially three to four times what has been presented—and the team is continuously working to develop and introduce new functionalities to improve collaboration, scalability, security, and overall performance.
+
+### How FlowFuse Transforms Production Operations
+
+In manufacturing, downtime is costly, and managing machines, sensors, and systems across multiple sites can be complex. FlowFuse simplifies this by centralizing management, giving you a single platform to oversee all your Node-RED instances efficiently.
+
+With its intuitive interface, FlowFuse handles deployments, updates, and real-time monitoring, ensuring smooth production. It collects data from hardware, APIs, and services using a drag-and-drop interface, enabling teams to easily connect, transform, and analyze data. The high-availability feature ensures critical operations continue even during failures, minimizing downtime.
+
+FlowFuse also enhances security with advanced settings, keeping your systems safe while boosting collaboration. As operations grow, FlowFuse scales seamlessly, integrating new devices and systems without added complexity.
+
+By simplifying system management, FlowFuse cuts costs, keeps production running smoothly, and lets your team focus on growth and innovation.
+[**Get started with FlowFuse on the Cloud**](https://app.flowfuse.com/account/create/)
+
+## Conclusion
+
+FlowFuse transforms how you manage Node-RED instances, turning chaos into clarity. With centralized control, teams can collaborate and reduce operational costs while ensuring critical applications remain available and secure. Automated backups and high availability translate to less downtime and more focus on innovation.
diff --git a/src/blog/2024/10/quick-ways-to-write-functions-in-node-red.md b/src/blog/2024/10/quick-ways-to-write-functions-in-node-red.md
new file mode 100644
index 0000000000..e00019c6e0
--- /dev/null
+++ b/src/blog/2024/10/quick-ways-to-write-functions-in-node-red.md
@@ -0,0 +1,93 @@
+---
+title: "Exploring Quick Ways to Write Complex Logic in Function Nodes in Node-RED"
+subtitle: "Enhancing Your Node-RED Experience"
+description: "Learn how to efficiently write complex logic in Function Nodes within Node-RED, simplifying your development process and improving your workflows."
+date: 2024-10-09
+authors: ["sumit-shinde"]
+image: /blog/2024/10/images/quick-ways-to-write-function-nodes.png
+tags:
+ - posts
+ - node-red function node
+ - node red function node
+---
+
+Node-RED is a powerful tool for building automation flows through its visual interface and low-code nodes. However, there are times when this low-code approach falls short, particularly when you need to implement complex JavaScript logic. That’s where the Function Node comes into play. Many Node-RED developers excel in their domains—such as IoT integration and PLCs—but may lack a strong foundation in JavaScript.
+
+In this guide, I will share strategies for making writing in Function Nodes straightforward and efficient. You’ll learn how to leverage JavaScript's capabilities without needing extensive knowledge, empowering you to handle more complex logic with confidence and ease.
+
+## What are function nodes and the challenges related to them?
+
+![Image showing the function node](./images/node_function.png){data-zoomable}
+_Image showing the function node_
+
+## What Are Function Nodes and Common Challenges?
+
+[Function Nodes](/node-red/core-nodes/function/) in Node-RED allow you to write custom JavaScript for processing messages. While they provide flexibility, many users find it challenging to turn complex business rules into code and manage variables. For more details on the benefits and drawbacks of using Function Nodes, refer to this [Article](/blog/2023/03/why-should-you-use-node-red-function-nodes/).
+
+Before using Function Nodes, consider if existing low-code nodes can fulfill your needs. Using standard low-code nodes can simplify your approach and enhance collaboration and clarity. If you still feel the need to use Function Nodes, don’t worry, In the following section, we’ll explore straightforward strategies to make working with Function Nodes easier.
+
+## Quick Ways to Simplify Writing in Function Nodes
+
+### Using Blockly-Based Function Nodes
+
+For users seeking to simplify the process of writing complex logic, Blockly-based Function Nodes serve as a valuable tool within Node-RED. Designed to facilitate JavaScript code generation, Blockly allows you to construct logic visually using a drag-and-drop interface with pre-defined blocks. This makes it easier to translate intricate business rules into functional code. As you build your logic, Blockly automatically generates the corresponding JavaScript.
+
+Before proceeding, make sure you have installed the following Node-RED package via the palette manager:
+
+- **node-red-contrib-blockly**: This package adds the Blockly custom node in your Node-RED sidebar to use.
+
+For the demonstration, let's consider we have an array of temperatures, and we wanted to calculate the Upper Control Limit (UCL) and Lower Control Limit (LCL) to send to different outputs.
+
+1. Drag the Blockly node onto the canvas and double-click it to open the editor.
+2. Once open, you will see the block categories on the left side, a plain canvas on the right side, and an option to set output and timeout at the bottom. Set the output to 2.
+3. In the left sidebar, you’ll find different categories starting with Node-RED, each containing related operation blocks. For example, in Node-RED, you’ll find blocks to get the value of `msg.payload`, set `msg.payload`, and more. In the Math category, there are various blocks for different mathematical operations.
+4. We must first calculate the mean to calculate UCL and LCL. Switch to the Math category and drag the block labeled "`sum` of the list." Click on the sum in the block to see other options; select "average" from it. Then, in the Node-RED category, find the block labeled "get the `msg` property from `payload`" and connect it to the end of the "`sum` of the list" block. Now, to create a variable to store the mean, switch to the Variables category, click "create variable," and name it `mean`. Once you make the variable, you’ll get different blocks related to its perform operations on that var, such as setting and changing its value. Drag the block labeled "set to mean" and place it at the start of the "`average` of list" block.
+6. Next, we know the formulas to calculate UCL and LCL (where we pick z = 3):
+
+- UCL = mean + (stdDev * z)
+- LCL = mean - (stdDev * z)
+
+7. To calculate the standard deviation, switch to the Math category and drag the "`sum` of the list" block again. Click on the sum and select the "standard deviation" option. Again, drag the block "get the `msg` property from `payload`" and connect it to the end of the standard deviation block. Create a variable called `stdDev,` drag the "set stdDev to" block, and place it at the start of the "`standard deviation` of the list" block.
+8. Now, it’s time to calculate UCL and LCL. First, create a variable for UCL and then Drag the "set UCL to" block, then switch to the Math category and drag the "1 + 1" block. Place the `mean` variable in one of the positions for "1." Drag the same block again and place it in the second position of 1, then switch to Variables again and drag the `stdDev` variable to replace one of the "1s" in the second 1+1 block, and set the second "1" to 3.
+9. Next, switch to Node-RED and drag the "set `msg` property `payload` to" block. Then, drag the UCL from the variable and place it in place of "to." s value, Drag the "send "`msg` block to output 1". Repeat the same steps for LCL, but make sure that you subtract from the mean (`stdDev * z`) and set LCL to the payload, returning it to output 2.
+10. Finally, click Done to save it.
+11. Drag the inject node, having set the payload to an array of simulated temperature data, and connect its output to the input of the blockly node,
+12. Then, drag the two debug nodes onto the canvas. Connect one debug node to output 1 of the Blockly node (this will display the UCL) and the other debug node to output 2 (this will display the LCL).
+13. Deploy the flow and click the inject button. You will see both UCL and LCL printed on the debug panel
+
+The final blockly canvas should look like the below image:
+
+![Image showing collection of blockly blocks that are calculating UCL and LCL](./images/blockly.png){data-zoomable}
+_Image showing collection of blockly blocks that are calculating UCL and LCL_
+
+Using Blockly-based Function Nodes simplifies the creation of complex logic in Node-RED. However, a basic understanding of JavaScript is still beneficial, especially as your logic becomes more complicated. While beginners may appreciate the visual interface initially, it can become confusing when trying to implement more advanced features. Additionally, the Blockly Function Node is a modified version of the original Function Node, which may lead to differences in behavior and functionality. Nevertheless, it remains a valuable node for users looking to simplify writing function logics in Node-RED.
+
+### Using FlowFuse Assistant
+
+![Image showing the quick function node generation with FlowFuse Assistant](./images/flowfuse-assistant.gif){data-zoomable}
+_Image showing the quick function node generation with FlowFuse Assistant_
+
+The FlowFuse Assistant is an AI-based plugin integrated into the FlowFuse platform within the Node-RED editor, making it incredibly easy to generate complex functions using prompts.
+
+For this example, let’s use the same logic we demonstrated with Blockly:
+
+Before proceeding, ensure you have updated Node-RED to the latest version on the FlowFuse platform.
+
+1. Open the Node-RED instance editor on the platform.
+2. Click the magic button in the top right corner.
+3. A popup prompt will appear, asking for your input to generate the function node.
+4. Enter the prompt for your logic. For this example, you can use:
+ > "Generate JavaScript code that takes an array of numbers, calculates the Upper Control Limit (UCL) and Lower Control Limit (LCL), then sends UCL to the first output of the function node and LCL to the second output."
+5. Click "Generate." After 2-3 seconds, the Function Node with the requested JavaScript code will appear directly on your canvas.
+6. To test it, connect an inject node containing an array of simulated temperature data, then drag two debug nodes onto the canvas. Connect one debug node to output 1 of the function node (this will display the UCL) and the other debug node to output 2 (this will display the LCL).
+7. Deploy the flow and click the inject button; both UCL and LCL will be displayed on the debug panel.
+
+Using the FlowFuse Assistant is significantly easier than Blockly, as it streamlines the process and saves you valuable time. You can articulate your goals in plain English or other languages, such as Spanish or Dutch, and the assistant generates your Function Node seamlessly. This allows you to focus more on your project objectives rather than getting bogged down in coding or block arrangements. Additionally, it provides you with the original Function Node, maintaining standard functionality.
+
+*Start using FlowFuse today by creating your free trial account [here](https://app.flowfuse.com/account/create).*
+
+*If you are an educator or a student, we offer FlowFuse for free. Visit the [FlowFuse for Education page](/education/) to learn more.*
+
+## Conclusion
+
+In summary, both Blockly and FlowFuse Assistant simplify writing complex logic in Node-RED, but FlowFuse is easier to use. Blockly’s visual approach can be confusing, while FlowFuse allows you to generate code by stating your goals in plain English or other languages. Although Blockly can be helpful, it often requires JavaScript knowledge. FlowFuse Assistant simplifies the process, allowing you to focus on your project.
diff --git a/src/blog/2024/11/building-uns-with-flowfuse.md b/src/blog/2024/11/building-uns-with-flowfuse.md
new file mode 100644
index 0000000000..68fa0e00dd
--- /dev/null
+++ b/src/blog/2024/11/building-uns-with-flowfuse.md
@@ -0,0 +1,192 @@
+---
+title: Building a Unified Namespace (UNS) with FlowFuse
+subtitle: Implement your Unified Namespace seamlessly using our low-code platform
+description: Discover how FlowFuse helps you build a Unified Namespace (UNS) effortlessly, streamlining industrial data sharing, improving operational efficiency, and enabling real-time insights for smarter decision-making.
+date: 2024-11-28
+authors: ["sumit-shinde"]
+image: /blog/2024/11/images/building-uns-with-flowfuse.png
+keywords: building unified namespace using nodered, nodered uns, uns nodered
+tags:
+ - flowfuse
+ - unified-namespace
+ - mqtt
+---
+
+As systems and devices become more connected, managing data from different sources can be tricky. A [Unified Namespace (UNS)](/solutions/uns/) solves this by centralizing all your data in one place, making it easy to access and use.
+
+
+
+[FlowFuse](/) makes building a UNS simple. It connects old and new systems, collects data from devices and applications, and streamlines workflows. With tools like Node-RED for data flow, MQTT for real-time updates, and a central management layer, FlowFuse helps you improve efficiency and make better decisions.
+
+This article will show you how to build your UNS using FlowFuse, step by step.
+
+## **Building a UNS with Real-Time Sensor Data**
+
+This section explains how to set up a Unified Namespace (UNS) using FlowFuse, a Raspberry Pi, and an ADXL345 sensor. The Raspberry Pi collects data from the sensor, which we collect and process in Node-RED, calculate vibration magnitude, format it, and send it to the UNS using standardized topic names.
+
+### **Step 1: Collect Metrics from Devices**
+
+The first step in building your Universal Networking System (UNS) is collecting data from your devices. The method you choose will depend on the type of device and the communication protocol it supports. For example, many devices use traditional communication standards like Modbus, while others, such as industrial controllers, might rely on OPC-UA.
+
+Fortunately, Node-RED provides support for a wide range of industrial protocols, from legacy to modern ones. While older protocols like Modbus and OPC-UA were originally designed for machine-to-machine (M2M) communication and are not directly compatible with cloud systems, Node-RED acts as a bridge to overcome this limitation.
+
+By leveraging Node-RED, you can collect data from these legacy systems, process and transform the data using low-code workflows, and then seamlessly send it to the cloud via modern protocols such as MQTT, Kafka, AMQP, and more.
+
+In our example, Node-RED can directly collect metrics from sensor using [I2C](https://flows.nodered.org/node/node-red-contrib-i2c) on the Raspberry Pi. This approach simplifies the process by eliminating the need for additional communication layers. To run Node-RED on the Raspberry Pi, we use [FlowFuse Device Agent](/product/device-agent/), This agent enables you to remotely monitor, manage, and build Node-RED flows securely through the FlowFuse platform remotely. [See here](/node-red/hardware/) for more details on how to set up and run FlowFuse Device Agent on different devices.
+
+### **Step 2: Transform and Process the Collected metrics**
+
+Once you've collected data from your devices, the next step is to transform it using Node-RED. Industrial systems often use different protocols such as Modbus and OPC UA, and each might have its own data structure, which can create challenges for integration. For example, the ADXL345 sensor which we are uisng in our practile example outputs raw data as electrical signals (buffer data). We first need to format it into a human-readable format and then calculate the Magnitude, a standard vibration monitoring unit.
+
+**Why Data Transformation Matters:**
+
+* **Consistency**: Ensures data from different sources follows the same structure.
+* **Integration**: It makes integrating data from various systems easier.
+* **Speed**: Simplifies data access for faster insights and decision-making.
+
+#### **Example: Transforming Data from ADXL345 Sensor (Raspberry Pi)**
+
+Raw data from the ADXL345 sensor might look like this:
+
+```json
+[26,0,244,255,37,255]
+```
+
+Using a [Function node](/node-red/core-nodes/function/) in Node-RED, we can convert this into a human-readable format.
+
+![Function node: Transforming Raw Data into Readable Format](./images/function-node.png){data-zoomable}
+_Function node: Transforming Raw Data into Readable Format_
+
+After transformation, the data will look as shown below.
+
+```json
+{
+ "x":0.09765625,
+ "y":-0.046875,
+ "z":-0.8828125
+}
+```
+
+While this is more readable, it can still be challenging to monitor changes in vibration quickly or detect anomalies. To simplify monitoring, we can calculate the Magnitude, a single metric commonly used in vibration monitoring.
+
+![Change node: Calculating Magnitude](./images/change-node-calculating-magnitude.png){data-zoomable}
+_Change node: Calculating Magnitude_
+
+After calculating the Magnitude using a [Change node](/node-red/core-nodes/change/), the data might look like this:
+
+```json
+{
+ "x":0.00390625,
+ "y":-0.07421875,
+ "z":-0.8515625,
+ "magnitude":0.8547996098775871
+}
+```
+
+Now, the data is easier to monitor with a single metric (Magnitude), but this structure is still not optimal for a UNS. We need to transform it further to provide more context.
+
+**Enhanced Data Structure for UNS:**
+
+To make the data more useful for integration and interpretation in a UNS, we can transform it to include additional context, such as units and timestamps, while removing unnecessary metrics like the three-axis components (`x`, `y`, `z`). The easiest and most low-code approach for achieving this in Node-RED is to use the Change node, which is specifically designed for formatting and structuring payloads.
+
+![Change Node: Formatting and structuring payload for UNS](./images/change-node-structering-data.png){data-zoomable}
+_Change Node: Formatting and structuring payload for UNS_
+
+After formatting, the data will look as shown below:
+
+```json
+{
+ "name": "vibration",
+ "timestamp": "2024-11-13T10:00:00Z",
+ "unit": "m/s²",
+ "value": 0.8547996098775871
+}
+```
+
+This format is more structured and consistent, with important labels like `value`, `unit`, and `timestamp` that provide meaningful context. It clarifies that the value represents the Magnitude of vibration in **m/s²** and provides the precise time when the data was collected.
+
+### **Step 3: Setting Up Your UNS Broker**
+
+Now, it's time to configure your UNS broker. As mentioned, we’ll use the [FlowFuse MQTT Broker](/blog/2024/10/announcement-mqtt-broker/). This broker is integrated within the FlowFuse platform to simplify your workflow by eliminating the need for multiple separate services. With FlowFuse, you can monitor and configure everything from a single, centralized platform. This ensures you can efficiently monitor, manage, and configure your UNS without juggling multiple tools or services.
+
+**Steps to Set Up the FlowFuse MQTT Broker:**
+
+1. Log in to the FlowFuse platform and navigate to **"Broker"** in the left sidebar.
+2. Click the **"Create Client"** button at the top-right corner to add a new MQTT client.
+3. **Configure the client**:
+ * Provide a **Username** and **Password** for secure access.
+ * Define an **Access Pattern** to manage client permissions.
+4. Click **"Create"** to generate the client.
+
+*Note: Enterprise-level teams can register up to 20 clients, and teams-level teams can register up to 5 clients as part of their plan. The ability to purchase additional packs of clients will come in a near future release.*
+
+5. Copy the client ID you generated from the list and save it somewhere for later use.
+
+![FlowFuse Interface for creating MQTT Client](./images/creating-client-interface.png){data-zoomable}
+_FlowFuse Interface for creating MQTT Client_
+
+### **Step 4: Choosing Your Topic Naming Convention**
+
+The key to building a successful UNS is organizing your data with a clear and consistent naming convention. A well-designed convention ensures data is accessible and understandable across systems and users, simplifying communication and integration.
+
+**ISA-95** is a standard for industrial systems encompassing various manufacturing and communication aspects. However, when it comes to communication, ISA-95 often relies on point-to-point (P2P) connections between systems and devices. These connections can introduce complexity, delays, and other challenges.
+
+While we are building a UNS to address the problems and limitations we observed with point-to-point communication, we can still leverage key elements of ISA-95 that remain valuable for improving production efficiency. One of the central aspects of ISA-95 is its equipment hierarchical model, which links various layers of a factory, from physical devices to enterprise systems. By adapting this model to your data architecture, you can simplify data access and management across the entire system.
+
+![ISA-95 : Equipment Hierarchical Model](./images/isa-95-equipement-model.png){data-zoomable}
+_ISA-95 : Equipment Hierarchical Model_
+
+For example, following an ISA-95-based equipment hierarchy to define your topic naming convention allows you to access data from devices, sensors, or any other source without knowing their specific addresses or tags—such as for a PLC. With clarity and ease, this logical structure enables you to retrieve relevant information from different system layers (e.g., from control systems to MES or ERP).
+
+Example topic structure based on ISA-95 equipment model hierarchy:
+
+`Plant1/Area3/Line4/Cell2/DeviceA`
+
+`Plant1/Area4/Line5/Cell6/DeviceB`
+
+You can also use the [**Sparkplug B**](/blog/2024/08/using-mqtt-sparkplugb-with-node-red/) naming convention for MQTT topics, which offers a structured hierarchy and standard. However, the Sparkplug B convention has some limitations in terms of flexibility. A typical **Sparkplug B topic** follows this structure:
+
+`spBv1.0/{groupID}/{edgeNodeID}/{deviceID}/{messageType}`
+
+While Sparkplug B provides a standardized topic model, its hierarchy may not always suit the specific needs of your architecture. Alternative methods, such as the Paris and Schultz models, help address these limitations with Sparkplug B topics. However, to keep things simple and avoid unnecessary complexity, we will use plain MQTT with the ISA-95 hierarchy.
+
+### **Step 5: Sending Collected metrics to UNS**
+
+With your topic naming convention chosen, it’s time to send the data to the UNS. In Node-RED, we will use the [MQTT Out](/node-red/core-nodes/mqtt/) node to send the transformed data to the broker.
+
+1. Drag an MQTT out node into your flow.
+2. Configure the node to connect to the FlowFuse MQTT Broker using the client credentials generated earlier.
+
+**Note**: Use environment variables to secure configuration and prevent exposing credentials when sharing flows. This ensures that sensitive data remains secure and allows easy sharing without compromising security. For more details, refer to the [Article: Using Environment Variables in Node-RED](/blog/2023/01/environment-variables-in-node-red/).
+
+![Configuring mqtt-broker-config node](./images/mqtt-broker-node-config.png){data-zoomable}
+_Configuring mqtt-broker-config node_
+
+![Configuring mqtt-broker-config node](./images/mqtt-broker-config-security
+.png){data-zoomable}
+_Configuring mqtt-broker-config node_
+
+3. Set the **topic** using your predefined naming convention (e.g., `Plant1/Area3/Line4/Cell2/RPI1`).
+
+![Configuring mqtt-out node](./images/mqtt-out-node-config.png){data-zoomable}
+_Configuring mqtt-out node_
+
+4. Connect the input of the mqtt out node to your data transformation flow and deploy the flow.
+
+For information on how to use MQTT with Node-RED, refer to [Using MQTT with Node-RED](/blog/2024/06/how-to-use-mqtt-in-node-red/)
+
+After deploying, you can monitor the topic hierarchy on the FlowFuse platform by switching to the "Hierarchy" tab in the Broker interface.
+
+![Monitoring your mqtt topic hierarchy within FlowFuse](./images/topic-hierarchy.png){data-zoomable}
+_Monitoring your mqtt topic hierarchy within FlowFuse_
+
+Once your data is in the UNS, you have a centralized, real-time view of your operations. This unified structure enables easier access, sharing, and analysis of data across systems, helping you drive better decisions, improve efficiency, and gain valuable insights to optimize your processes.
+
+With real-time data access, you can create monitoring dashboards using the [FlowFuse Dashboard](/product/dashboard/) with a low-code approach, integrate with other cloud solutions, or leverage it further for enhanced analytics or automation.
+
+![FlowFuse Dashboard Monitoring Vibrations](./images/flowfuse-dashboard.png){data-zoomable}
+_FlowFuse Dashboard Monitoring Vibrations_
+
+## **Conclusion**
+
+FlowFuse makes building a Unified Namespace (UNS) easy by centralizing data from systems, devices, and sensors. With seamless integration of Node-RED, MQTT, and its enterprise layer, FlowFuse ensures smooth data flow, real-time insights, and efficient management. It simplifies operations, enhances productivity, and improves system interoperability, making it easy to adapt your UNS to specific needs and support real-time analytics and automation.
diff --git a/src/blog/2024/11/dashboard-new-group-type-app-icon-and-charts.md b/src/blog/2024/11/dashboard-new-group-type-app-icon-and-charts.md
new file mode 100644
index 0000000000..50c864665e
--- /dev/null
+++ b/src/blog/2024/11/dashboard-new-group-type-app-icon-and-charts.md
@@ -0,0 +1,72 @@
+---
+title: Visual Layout Editor - Now Available in Dashboard
+subtitle: With the latest update we have released a new Layout Editor for Dashboard, as well as new widgets and wide-spread improvements.
+description: With the latest update we have released a new Layout Editor for Dashboard, as well as new widgets and wide-spread improvements.
+date: 2024-11-08
+authors: ["joe-pavitt"]
+image: /blog/2024/11/images/dashboard-1-19-0-tile.png
+tags:
+ - posts
+ - news
+ - flowfuse
+ - dashboard
+---
+
+It has been one of the most requested features for FlowFuse Dashboard, and is now available in its first iteration. It is now possible to resize and move groups in the Dashboard itself using the new "Edit Layout" feature. That's not all though, we've added a new "Spacer" widget to assist with layouts, added improvements to the rendering of charts and plenty more.
+
+
+
+
+## Layout Editor - Quick Guide
+
+For those transitioning over from the original Node-RED Dashboard 1.0, you'll notice some difference in how you can now edit the layout of your dashboard. Now, the editing is done directly in the Dashboard itself, rather than in the Node-RED editor.
+
+To open the Dashboard in "Edit Mode", click the "Edit Layout" button for the relevant page in the Dashboard sidebar:
+
+![Screenshot showing the Edit Layout button in the Dashboard sidebar](./images/edit-layout-button.png){data-zoomable}{width="500px"}
+_Screenshot to show the buttons available to "Edit Layout" for a given page_
+
+This will open the relevant page in "Edit Mode":
+
+![Short recording to show resizing and reordering in the visual layout editor](./images/wysiwyg-demo.gif){data-zoomable}
+_Short recording to show resizing and reordering in the visual layout editor_
+
+The three controls at the top of the page are:
+
+- **Save Changes:** Deploy any changes to the underlying Node-RED flow.
+- **Discard Changes:** Clear any in-browser changes that have not yet been saved.
+- **Exit Edit Mode:** Stop "Edit Mode" and interact with teh Dashboard as a standard end-user.
+
+You can then use the handles on each group to resize them, or click and drag to re-position the groups on the page. How this re-positioning is done is controlled by the "Layout" property of the page. The Visual Editor is currently available for "Grid" and "Fixed" layouts only.
+
+Once you're happy with your changes clicked the "Save Changes" button to deploy them to the underlying Node-RED flow. Note, you will then be made aware that _"your flows have been updated"_ by Dashboard when you return to your Node-RED Editor.
+
+Note that you can only enter "Edit Mode" via the Node-RED Editor, this is to ensure security and stability of your Dashboard, in cases where you may have users for your Dashboard that should not have access to modify your Dashboard's layout.
+
+## Layout Editor - Next Steps
+
+We are very aware that is this is just the first iteration of the Layout Editor, and we have plenty of plans to improve it further. Here are some of the features we are considering for future releases:
+
+- Include widget resizing and ordering in the Layout Editor
+- Overhauling sizing options for groups and widgets [#835](https://github.com/FlowFuse/node-red-dashboard/issues/835)
+
+If there are any other key editor features you'd like to see, then please do reach out to us, open GitHub issues and help us shape the future of FlowFuse Dashboard.
+
+## New Widget: UI Spacer
+
+In the Dashboard sidebar, you now have the option to add a "Spacer", this is just an empty widget that can be used to shift the position of other widgets. This can be useful for creating more complex layouts, or for adding space between widgets. For example, if you wanted to have some directional controls with up/down/left/right buttons, you could use a spacer to separate and align them:
+
+![(left) A d-pad controller layout using spacers, (right) the spacer's highlighted to demonstrate their positioning](./images/spacer-example.png){data-zoomable}
+_(left) A d-pad controller layout using spacers, (right) the spacer's highlighted to demonstrate their positioning_
+
+Spacers can be any width and height, and will always render empty-space. To add a new spacer, you can click the "+" button in the Dashboard sidebar next to any Groups. You can then re-order the widgets there too (re-ordering of widgets in the visual layout editor will be coming soon).
+
+## What else is new?
+
+You can find the full 1.19.0 Release Notes [here](https://github.com/FlowFuse/node-red-dashboard/releases/tag/v1.19.0).
+
+Work has already begun on the next release, `1.20.0`, you can see what items we have queued up [here](https://github.com/orgs/FlowFuse/projects/15/views/1), if you've got any feedback or suggestions, please do let us know, and feel free to open new issues on our [GitHub](https://github.com/FlowFuse/node-red-dashboard/issues)
+
+## We are Hiring!
+
+You may have seen already that we are hiring for a full-time Front-End Engineer to join our team, and work on Dashboard, full-time. If you are interested in working with us, please do check out the job listing [here](https://job-boards.greenhouse.io/flowfuse/jobs/5185319004).
\ No newline at end of file
diff --git a/src/blog/2024/11/device-agent-as-service-on-mac.md b/src/blog/2024/11/device-agent-as-service-on-mac.md
new file mode 100644
index 0000000000..65ffdb2de8
--- /dev/null
+++ b/src/blog/2024/11/device-agent-as-service-on-mac.md
@@ -0,0 +1,146 @@
+---
+title: Run FlowFuse Device Agent as a service on MacOS using Docker
+subtitle: Automating FlowFuse Device Agent on macOS with Docker and Colima.
+description: Learn how to run the FlowFuse Device Agent as a service on macOS using Docker and Colima, ensuring automatic startup and seamless integration with the FlowFuse platform for managing IoT edge devices.
+date: 2024-11-12
+authors: ["sumit-shinde","rob-marcer"]
+image: /blog/2024/11/images/flowfuse-as-service-on-mac.png
+keywords: FlowFuse Device Agent, Node-RED edge device, Node-RED macOS, FlowFuse agent macOS, IoT edge device management, Node-RED device agent
+tags:
+ - flowfuse
+ - how-to
+---
+
+The FlowFuse Device Agent is a tool that enables you to run Node-RED on various hardware devices, such as Raspberry Pi, Windows, MacOS, and PLCs. Running Node-RED directly on the device helps when your application flow needs direct access to sensors and actuators connected to the hardware, facilitating seamless integration with the FlowFuse platform. This integration enables secure management, monitoring, and remote editing of flows from a centralized platform, even at the edge.
+
+
+
+In this article, we will explore how to run the FlowFuse Device Agent as a service on MacOS using Docker. This setup ensures that the Device Agent runs in the background, automatically starts on boot, and maintains a continuous connection the FlowFuse platform for remotely managing your Node-RED flows, even after a device restart. This eliminates the need to manually start the agent after each reboot, saving you time and effort.
+
+### Prerequisites
+
+Before starting, ensure that you have the following set up:
+
+- **FlowFuse Account**: You need an active FlowFuse account to register your device and manage your flows remotely. If you don't have an account, you can [sign up](https://app.flowfuse.com/account/create) at FlowFuse.
+
+*NOTE: The instructions in this guide were tested on MacBook M1 & M4 MacBook Pro*
+
+### Step 1: Install Homebrew
+
+Homebrew is the MacOS package manager for installing packages and libraries. You can install it using the following command:
+
+```bash
+/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+```
+
+This script will install the Homebrew package manager on your Mac. Once installed, you can easily install other packages like Docker and Colima.
+
+### Step 2: Install Docker
+
+With Homebrew installed, you can now install Docker by running:
+
+```bash
+brew install docker-credential-helper docker
+```
+
+This will install Docker and its credential helper, which is useful for managing authentication with Docker registries.
+
+### Step 3: Install Colima
+
+Colima is a free alternative to Docker Desktop, particularly useful for MacOS, and offers better compatibility with Apple Silicon hardware. We’ll need it to run the Flowfuse Device Agent container that we will create later. To install Colima, run:
+
+```bash
+brew install colima
+```
+
+### Step 4: Start Colima
+
+Once Colima is installed, start it with:
+
+```bash
+colima start
+```
+
+This command starts the Colima virtual machine, which Docker will then use to run containers. If Colima is not running, Docker won't have the necessary environment to create and run containers.
+
+```bash
+colima status
+```
+
+![CLI: Showing the result of `colima status`](./images/colima-status.png){data-zoomable}
+_CLI: Showing the result of `colima status`_
+
+### Step 5: Set Colima to Run as a Service
+
+To ensure Colima starts automatically in the background, run the following:
+
+```bash
+brew services start colima
+```
+
+This will set Colima to run as a service, so it will start automatically every time your Mac boots up.
+
+### Step 6: Adding the Device to the FlowFuse Platform
+
+Now, you'll need to add a new device to the FlowFuse platform and download the device configuration file. This configuration will allow to connect your MacOS device to your FlowFuse team. For more information on how to add a device and generate the configuration, refer to [Generating "Device Configuration"](https://flowfuse.com/docs/device-agent/register/#generating-%22device-configuration%22).
+
+### Step 7: Run the FlowFuse Device Agent Container
+
+You can now run the FlowFuse Device Agent container using Docker. Replace `/path/to/device.yml` with the actual path to the device configuration file you have downloaded. The following command will launch the container:
+
+```bash
+docker run -d --restart unless-stopped \
+ --mount type=bind,src=/path/to/device.yml,target=/opt/flowfuse-device/device.yml \
+ -p 1880:1880 flowfuse/device-agent:latest
+```
+
+Explanation of the command:
+
+- `-d`: Run the container in detached mode (in the background).
+- `--restart` unless-stopped: Ensure the container restarts automatically unless explicitly stopped.
+- `--mount type=bind,src=/path/to/device.yml,target=/opt/flowfuse-device/device.yml`: Mounts your local device.yml file into the container so it can be accessed by the agent.
+- `-p 1880:1880`: Exposes port 1880 on your host machine, which is typically used for the Node-RED web interface.
+- `flowfuse/device-agent:latest`: The Docker image for the FlowFuse Device Agent.
+
+### Step 8: Verify the Device Agent is Running
+
+To verify that the Device Agent is running correctly, you can use the following command:
+
+```bash
+docker ps
+```
+
+![CLI: Showing the result of `docker ps` indicating device agent is running correctly](./images/docker-ps-result.png){data-zoomable}
+_CLI: Showing the result of `docker ps` indicating the device agent is running correctly_
+
+This will list all running containers, and you should see the FlowFuse Device Agent listed there. If it's not running, you can check the logs to troubleshoot:
+
+```bash
+docker logs
+```
+
+Additionally, you can confirm that the Device Agent is running and successfully connected to the FlowFuse platform by following these steps:
+
+1. Navigate to the FlowFuse platform.
+2. In the left sidebar, click on "Edge Devices".
+3. Then, select the device you added for MacOS.
+
+![FlowFuse Platform: showing the status of your edge device](./images/device-status-on-ff.png){data-zoomable}
+_FlowFuse Platform: showing the status of your edge device_
+
+Now, you can start developing applications on the device remotely from any location and manage it efficiently.
+
+### Step 9: Ensure the Device Agent Restarts Automatically After a Reboot
+
+The `--restart unless-stopped` flag in the Docker command ensures that your FlowFuse Device Agent container will automatically restart if your Mac reboots. However, it's always good to verify this by restarting your system:
+
+1. Restart your Mac.
+2. After rebooting, check the status of the FlowFuse Device Agent:
+
+```bash
+ docker ps
+```
+
+### Conclusion
+
+By following these steps, you've successfully set up the FlowFuse Device Agent on your macOS system using Docker and Colima. Now, the agent will run seamlessly in the background and restart automatically after a system reboot.
diff --git a/src/blog/2024/11/esp32-with-node-red.md b/src/blog/2024/11/esp32-with-node-red.md
new file mode 100644
index 0000000000..eb20965bba
--- /dev/null
+++ b/src/blog/2024/11/esp32-with-node-red.md
@@ -0,0 +1,245 @@
+---
+title: Interacting with ESP32 Using Node-RED and MQTT
+subtitle: Building IoT Flows with ESP32 and FlowFuse
+description: Learn how to connect your ESP32 with Node-RED using MQTT in this easy-to-follow guide. Build a user-friendly dashboard with FlowFuse Dashboard to control your IoT devices remotely. Ideal for beginners and IoT hobbyists!
+date: 2024-11-14
+authors: ["sumit-shinde"]
+image: /blog/2024/11/images/esp32-with-node-red.png
+keywords: esp32 with node red, node red esp32, connect esp32 to node red, esp node red, esp32 mqtt node red, esp32 node red, esp32 node red mqtt, mqtt esp32 node red, mqtt node red esp32, node red mqtt esp32, node red with esp32
+tags:
+ - node-red
+ - how-to
+---
+
+The ESP32 is an affordable and powerful microchip that combines Wi-Fi and Bluetooth in one small package. It's commonly used in smart devices like home automation systems, wearables, and other IoT projects. Despite its low cost (around $6), it offers strong performance, and low power consumption, and is compatible with popular platforms like Arduino. Whether you're a hobbyist or a business, the ESP32 provides great value, making it easy to create wireless devices without a big investment. This tutorial demonstrates how to set up communication between the ESP32 and Node-RED using MQTT, along with an interactive dashboard via FlowFuse for a user-friendly interface.
+
+
+
+
+
+## Prerequisites
+
+To follow this tutorial, you'll need the following:
+
+- **ESP32 microcontroller**: The hardware you'll be using for this project.
+- **USB cable**: To connect the ESP32 to your computer.
+- **Arduino IDE**: Installed and set up to program your ESP32. [Download](https://support.arduino.cc/hc/en-us/articles/360019833020-Download-and-install-Arduino-IDE) the Arduino IDE if you haven't already done so.
+ - Additionally, if you haven't set up the Arduino IDE for the ESP32 board, please follow this tutorial: [How to Set Up ESP32 with Arduino IDE](https://www.youtube.com/watch?v=CD8VJl27n94)
+- **FlowFuse account**: This will allow you to create and deploy Node-RED instances securely on the cloud with a single click, collaborate on your Node-RED projects with your team, manage and program your edge devices remotely, and provide an MQTT broker with an interface for securely managing clients.
+
+If you haven’t signed up for a FlowFuse account yet, [sign up](http://app.flowfuse.com/account/create) now.
+
+## Getting Started with ESP32 and Node-RED
+
+In this section, we’ll set up Node-RED on FlowFuse, create an MQTT connection, and configure everything to interact with your ESP32. This will lay the foundation for building your IoT flows and controlling devices.
+
+### Step 1: Creating Node-RED instance on FlowFuse Cloud
+
+Start by logging into your [FlowFuse](/) account and creating a new Node-RED instance. For more information on creating a Node-RED instance, refer to the [FlowFuse documentation](/docs/user/introduction/#creating-a-node-red-instance).
+
+Once the instance is created, open the Node-RED editor.
+
+### Step 2: Creating and Configuring MQTT Clients in FlowFuse
+
+In this step, we’ll set up MQTT to enable communication between Node-RED and the ESP32. MQTT (Message Queuing Telemetry Transport) is a lightweight messaging protocol designed for reliable, low-bandwidth communication between devices in IoT applications.
+
+We use MQTT because it allows devices to communicate over a network (like Wi-Fi) without the need for a direct physical connection. This makes it perfect for long-distance communication, where devices need to send and receive data efficiently, even when they are not physically connected or close to each other.
+
+![Diagram showing the flow of data and how commands are sent to the ESP32 using MQTT using Node-RED.](./images/esp32-mqtt-node-red.png){data-zoomable}
+_Diagram showing the flow of data and how commands are sent to the ESP32 using MQTT using Node-RED_
+
+In our setup, Node-RED will publish commands to the MQTT broker, and the ESP32 will subscribe to topics to receive responses. The ESP32 will then perform actions, such as controlling an LED. To facilitate this, we’ll create two MQTT clients in FlowFuse (since the MQTT broker is already set up and managed by FlowFuse, you don’t need to worry about its configuration or maintenance). One client will be for Node-RED, and the other will be for the ESP32. These clients will handle the secure and reliable exchange of messages, ensuring smooth communication between the two devices.
+
+**To Create MQTT Clients in FlowFuse:**
+
+1. Navigate to your FlowFuse platform and log in to your account.
+2. In the left sidebar, click on "Broker".
+3. In the newly opened interface, click the “Create Client” button.
+4. Enter a username and password for your MQTT client. Confirm the password.
+ - You can leave the default pattern as `#` for access control, or set a custom pattern if needed.
+
+![Interface for setting MQTT client details and credentials](./images/mqtt-client-create.png){data-zoomable}
+_Interface for setting MQTT client details and credentials_
+
+5. Click "Create" to generate the client.
+6. Copy the client ID and save it somewhere secure for later use.
+7. Repeat the same steps to create the second MQTT client for the ESP32.
+
+### Step 3: Building a Node-RED Dashboard to Send Commands Over MQTT
+
+Now that we’ve created the MQTT clients, it’s time to build a Node-RED dashboard and create a flow that will publish commands to the FlowFuse MQTT broker. This will later allow you to interact with your ESP32 using a user-friendly interface.
+
+**Let's first create a flow to connect to the MQTT broker with the client config we have created:**
+
+1. Drag the **mqtt out** node onto the canvas in Node-RED.
+2. Double-click the **mqtt out** node to open the settings.
+3. Click the pencil icon next to the Server field to open the MQTT broker configuration.
+4. In the configuration, enter the following details:
+ - Server: `broker.flowfuse.cloud`
+ - Client ID: The Client ID you created earlier.
+ - Username: The MQTT username (Client ID).
+ - Password: The MQTT password.
+5. Click "Add" to save the configuration, then select the newly added configuration.
+6. In the Topic field, enter a topic name, such as `/LEDControl`.
+7. Click "Done" to close the settings.
+8. Click "Deploy" in the top-right corner to deploy the flow.
+9. Once deployed, check the MQTT out node for a Connected status, confirming the connection to the MQTT broker.
+
+For this example, we will create a very simple dashboard. If you're not familiar with FlowFuse Dashboard, you can refer to the following blog to get started: [FlowFuse Dashboard: Getting Started](/blog/2024/03/dashboard-getting-started/)
+
+1. Install the `@flowfuse/node-red-dashboard` from the Node-RED Palette Manager.
+2. Drag two **ui-button** widgets onto the canvas.
+3. Double-click on the first button and set the Label to "ON", the Background Color to Green, and the Payload to `1`. Adjust the Width and Height as needed.
+4. Double-click on the second button and set the Label to "OFF", the Background Color to Red, and the Payload to `2`.
+5. Connect the output of both buttons to the input of the **mqtt out** node.
+6. Click "Deploy" to save the flow.
+
+{% renderFlow %}
+[{"id":"59887a8115c95eae","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"02c25e8a30f9379d","type":"ui-base","name":"My Dashboard","path":"/dashboard","appIcon":"","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"showPageTitle":true,"navigationStyle":"default","titleBarStyle":"default"},{"id":"cfb2ab9ff30660fc","type":"ui-theme","name":"Default Theme","colors":{"surface":"#ffffff","primary":"#0094CE","bgPage":"#eeeeee","groupBg":"#ffffff","groupOutline":"#cccccc"},"sizes":{"density":"default","pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}},{"id":"d263574af6876c7a","type":"ui-page","name":"ESP32","ui":"02c25e8a30f9379d","path":"/page1","icon":"home","layout":"grid","theme":"cfb2ab9ff30660fc","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"3ae115ea7ede6827","type":"ui-group","name":"Group 1","page":"d263574af6876c7a","width":"6","height":"1","order":1,"showTitle":false,"className":"","visible":"true","disabled":"false","groupType":"default"},{"id":"def97b29f5f7baab","type":"mqtt-broker","name":"","broker":"broker.flowfuse.cloud","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"5a9162986a34a4d6","type":"ui-button","z":"59887a8115c95eae","group":"3ae115ea7ede6827","name":"","label":"ON","order":1,"width":"3","height":"2","emulateClick":false,"tooltip":"","color":"","bgcolor":"","className":"","icon":"","iconPosition":"left","payload":"1","payloadType":"num","topic":"topic","topicType":"msg","buttonColor":"green","textColor":"","iconColor":"","enableClick":true,"enablePointerdown":false,"pointerdownPayload":"","pointerdownPayloadType":"str","enablePointerup":false,"pointerupPayload":"","pointerupPayloadType":"str","x":190,"y":120,"wires":[["9239f8a7cca5c858"]]},{"id":"f9c194994d9491a8","type":"ui-button","z":"59887a8115c95eae","group":"3ae115ea7ede6827","name":"","label":"OFF","order":2,"width":"3","height":"2","emulateClick":false,"tooltip":"","color":"","bgcolor":"","className":"","icon":"","iconPosition":"left","payload":"2","payloadType":"num","topic":"topic","topicType":"msg","buttonColor":"red","textColor":"","iconColor":"","enableClick":true,"enablePointerdown":false,"pointerdownPayload":"","pointerdownPayloadType":"str","enablePointerup":false,"pointerupPayload":"","pointerupPayloadType":"str","x":190,"y":160,"wires":[["9239f8a7cca5c858"]]},{"id":"9239f8a7cca5c858","type":"mqtt out","z":"59887a8115c95eae","name":"","topic":"/LedControl","qos":"","retain":"","respTopic":"","contentType":"","userProps":"","correl":"","expiry":"","broker":"def97b29f5f7baab","x":390,"y":140,"wires":[]}]
+{% endrenderFlow %}
+
+Now, when you click either the "ON" or "OFF" button on the dashboard, it will send either 1 or 2 as the payload. The ESP32 will use this payload in its code to turn the LED on or off. To view the dashboard, switch to the Dashboard 2.0 tab on the right side and click the Open Dashboard button. The dashboard will look similar to the image below.
+
+![FlowFuse Dashboard Build to control the ESP32 LED](./images/dashboard2.png){data-zoomable}
+_FlowFuse Dashboard Build to control the ESP32 LED_
+
+### Step 4: Programming ESP32 to receive commands from MQTT and Control LED
+
+Now, let's move on to the final step. Before proceeding, make sure your ESP32 is **connected to your laptop or computer via USB***. The USB connection is essential for uploading the code (sketch) to the ESP32, which will enable it to connect to the internet and communicate with the MQTT broker.
+The ESP32 will subscribe to the MQTT topic we configured earlier (e.g., /LEDControl). Based on the received payload (1 or 2), it will control the LED accordingly — turning it on or off.
+
+**Setting up Arduino IDE:**
+
+1. Open the Arduino IDE on your computer.
+2. Ensure you have selected the correct board and port in the Tools menu.
+3. Install the necessary library:
+4. Go to Tools > "Manage Libraries".
+5. Search for and install the "EspMQTTClient" library by Patrick Lapointe.
+6. The library installation will prompt you to install its dependencies—ensure that you tick that option and proceed to install.
+
+**Code for ESP32:**
+
+1. Copy the following code into the Arduino IDE:
+
+```cpp
+#if defined(ESP32)
+#include
+#elif defined(ESP8266)
+#include
+#endif
+
+#include
+
+#define LedPin 2 // ESP32 built-in LED pin
+
+// WiFi and MQTT settings
+const char* ssid = ""; // Change this to your WiFi SSID
+const char* password = ""; // Change this to your WiFi password
+const char* mqtt_server = "broker.flowfuse.cloud"; // FlowFuse MQTT broker server
+
+// MQTT client credentials
+const char* mqtt_client_id = ""; // Replace with your MQTT client ID
+const char* mqtt_username = ""; // Replace with your MQTT username
+const char* mqtt_password = ""; // Replace with your MQTT password
+
+WiFiClient espClient;
+PubSubClient client(espClient);
+
+// Function to connect to WiFi
+void setup_wifi() {
+ delay(10);
+ Serial.println();
+ Serial.print("Connecting to ");
+ Serial.print(ssid);
+ WiFi.begin(ssid, password);
+
+ while(WiFi.status() != WL_CONNECTED) {
+ delay(500);
+ Serial.print(".");
+ }
+
+ Serial.println("\nWiFi connected");
+ Serial.print("IP address: ");
+ Serial.println(WiFi.localIP());
+}
+
+// Callback function to handle messages from subscribed topics
+void callback(char* topic, byte* payload, unsigned int length) {
+
+ String msg;
+ for (int i = 0; i < length; i++) {
+ msg += (char)payload[i];
+ }
+
+ // Control LED based on message
+ if (msg == "1") {
+ digitalWrite(LedPin, HIGH); // Turn LED on
+ }
+ else if (msg == "2") {
+ digitalWrite(LedPin, LOW); // Turn LED off
+ }
+}
+
+// Function to connect to MQTT broker
+void reconnect() {
+ while (!client.connected()) {
+ Serial.println("Attempting MQTT connection...");
+
+ // Connect to MQTT broker with the client ID, username, and password
+ if (client.connect(mqtt_client_id, mqtt_username, mqtt_password)) {
+ Serial.println("Connected to MQTT broker");
+ client.subscribe("/LedControl");
+ }
+ else {
+ Serial.print("Failed, rc=");
+ Serial.print(client.state());
+ Serial.println(" trying again in 5 seconds");
+ delay(5000);
+ }
+ }
+}
+
+void setup() {
+ Serial.begin(115200);
+ pinMode(LedPin, OUTPUT);
+ setup_wifi();
+ client.setServer(mqtt_server, 1883);
+ client.setCallback(callback);
+}
+
+void loop() {
+ if (!client.connected()) {
+ reconnect();
+ }
+ client.loop();
+}
+```
+
+2. Replace the placeholder values in the code: SSID (your Wi-Fi network's SSID), Wi-Fi Password (your Wi-Fi network's password), MQTT Client ID (the MQTT client ID you generated for esp32), MQTT Username and Password (the MQTT credentials you created).
+3. After you've made these changes, click "Upload" in the Arduino IDE to upload the code to your ESP32.
+4. Once the upload is complete, open the Serial Monitor (set the baud rate to 115200) to monitor the output.
+
+If everything is set up correctly, you should see the output in the Serial Monitor as shown in the image.
+
+![Serial monitor displaying the result when everything is set up correctly.](./images/serial-monitor.png){data-zoomable}
+_Serial monitor displays the result when everything is set up correctly._
+
+Once you verify the setup, you can unplug the USB from the computer and connect the ESP32 to a power adapter. With this, your ESP32 is now powered and connected to Wi-Fi (make sure your device is on the same Wi-Fi network as the one configured in the code), allowing you to control the LED from anywhere in the world via the MQTT commands sent through Node-RED.
+
+### Troubleshooting
+
+1. **Can't Upload Code to ESP32**
+ - Solution: Make sure the correct board and port are selected in the Arduino IDE.
+Check Tools > Board for the right ESP32 model and Tools > Port for the correct connection.
+If the port is missing, [Download](https://www.silabs.com/developer-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads) and reinstall the CP210x USB drivers.
+
+2. **ESP32 Keeps Disconnecting from MQTT**
+- Solution: Make sure both the ESP32 and Node-RED have unique MQTT client IDs.
+If both devices share the same client ID, they will conflict and cause disconnections.
+
+3. **ESP32 Doesn’t Respond to Commands (LED Not Turning On/Off)**
+ - Solution: Verify the topic in the ESP32 code matches the one in Node-RED (e.g., /LedControl). If it still doesn't work, try rebooting your ESP32.
+
+## Conclusion
+
+In this tutorial, we successfully connected the ESP32 to Node-RED using MQTT, enabling remote control of an LED via a FlowFuse dashboard. This simple IoT setup demonstrates how easy it is to interact with devices using MQTT and Node-RED, offering a flexible and scalable solution for future projects. With the ESP32, Node-RED, and FlowFuse, you can easily expand and integrate more devices into your IoT system.
diff --git a/src/blog/2024/11/flowfuse-release-2-11.md b/src/blog/2024/11/flowfuse-release-2-11.md
new file mode 100644
index 0000000000..350c6ba7dd
--- /dev/null
+++ b/src/blog/2024/11/flowfuse-release-2-11.md
@@ -0,0 +1,89 @@
+---
+title: "FlowFuse 2.11: MQTT Topic Hierarchy, UI Revamp & Improved Logging"
+subtitle: Let's take a look at the new features and improvements in FlowFuse 2.11
+description: Let's take a look at the new features and improvements in FlowFuse 2.11
+date: 2024-11-21
+authors: ["joe-pavitt"]
+image: /blog/2024/11/images/tile-release-2-11.png
+tags:
+ - posts
+ - flowfuse
+ - releases
+---
+
+The focus of the FlowFuse 2.11 release has all been about providing clarity for our users and reducing friction in our user experience.
+
+Navigation in FlowFuse has been streamlined with a new sidebar and team-wide search feature. We've provided an interactive visualization for your MQTT topic hierarchy, ensuring you have a clear view of your own MQTT/UNS architecture, and, we've re-architected the audit logging to ensure you have an easy-to-understand and searchable view of everything going on in your FlowFuse Team and it's respective Applications, Instances and Devices.
+
+
+
+## Navigation Revamp
+
+If you're using FlowFuse Cloud, you'll have already noticed a big improvement to our navigation sidebar on the left of the user interface that was released a couple of weeks ago. This is now packaged up into FlowFuse 2.11 and available to our self-hosted customers too.
+
+![Screenshot of the new navigation sidebar in FlowFuse](./images/screenshot-sidebar.png){data-zoomable}
+_Screenshot of the improve left-side navigation in FlowFuse_
+
+This is the first stage of a navigation revamp we're working on, that will represent a big improvement for navigation around FlowFuse, and help make managing your applications easier.
+
+You'll notice we've renamed "Devices" to "Edge Devices" to make it clearer that these are _instances of Node-RED_ that are running on devices, rather than just a record of the device itself. We've also separated out many of the pages into sections, making it easier to find what you're looking for, and giving us scope to add in more in the coming weeks, which will make it easy to jump straight to the features you need.
+
+### Team-wide Search
+
+A very popular feature in the "home" view of FlowFuse is the search bar that helps you find the relevant Application, Instance, or Device you're looking for. This has been moved into the top header and will be available on every page of FlowFuse, making it even easier to find what you're looking for, wherever you are.
+
+![Screenshot of the team-wide search](./images/screenshot-search.png){data-zoomable}
+_Screenshot of the team-wide search_
+
+This will soon be followed by an update to our "Applications" view which is currently quite over-crowded. We're always looking to reduce friction for our users, and this is a big step in doing that.
+
+## MQTT Topic Hierarchy
+
+We recently [announced our very own MQTT Service](/blog/2024/10/announcement-mqtt-broker), and we're following that up with an update that lets you see what topics are being used by your MQTT clients in the UI:
+
+![Screenshot of the UI to explore your MQTT topic hierarchy](./images/screenshot-mqtt-hierarchy.png){data-zoomable}
+_Screenshot of the UI to explore your MQTT topic hierarchy_
+
+This will make managing your event-driven applications even easier, giving you clarity on the structure of your topic-space, whether you're using the MQTT Broker for a unified namespace (UNS) or any other use case.
+
+## Audit Logging Improvements
+
+We've improved the Audit Log views at the Team and Application levels to given you better visibility on the actions taken by users across your whole team in FlowFuse.
+
+Previously, only events associated to that "level" (e.g. Team, Application, Instance) were shown in the respective log. However, now, when you view the "Team" Audit Log, it shows not just events on that team specifically, e.g. a settings change, but also all Audit events for it's "children", i.e. the Applications, Instances, Pipelines, etc. that are part of that team too.
+
+New filters on the right-side also make it easy to explore everything taking place in your FlowFuse Team, allowing you to dive into a given Instance, all from the top-level "Team" view.
+
+![Screenshot of the improved audit log view](./images/audit-log-child-events.png){data-zoomable}
+_Screenshot of the improved audit log view_
+
+For a full list of everything that went into our 2.11 release, you can check out the [release notes](https://github.com/FlowFuse/flowfuse/releases/tag/v2.11.0).
+
+We're always working to enhance your experience with FlowFuse. We're always interested in your thoughts about FlowFuse too. Your feedback is crucial to us, and we'd love to hear about your experiences with the new features and improvements. Please share your thoughts, suggestions, or report any [issues on GitHub](https://github.com/FlowFuse/flowfuse/issues/new/choose).
+
+Together, we can make FlowFuse better with each release!
+
+## Try FlowFuse
+
+### Self-Hosted
+
+We're confident you can have self managed FlowFuse running locally in under 30 minutes. You can install FlowFuse using [Docker](/docs/install/docker/) or [Kubernetes](/docs/install/kubernetes/).
+
+### FlowFuse Cloud
+
+The quickest and easiest way to get started with FlowFuse is on our own hosted instance, FlowFuse Cloud.
+
+[Get started for free]({{ site.appURL }}/account/create) now, and you'll have your own Node-RED instances running in the Cloud within minutes.
+
+## Upgrading FlowFuse
+
+If you're using [FlowFuse Cloud]({{ site.appURL }}), then there is nothing you need to do - it's already running 2.10, and you may have already been playing with the new features.
+
+If you installed a previous version of FlowFuse and want to upgrade, our documentation provides a guide for [upgrading your FlowFuse instance](/docs/upgrade/).
+
+If you have an Enterprise license please make sure to review this [changelog entry](/changelog/2024/08/enterprise-license-update)
+
+## Getting help
+
+Please check FlowFuse's [documentation](/docs/) as the answers to many questions are covered there. Additionally you can go to the [community forum](https://discourse.nodered.org/c/vendors/flowfuse/24) if you have
+any feedback or feature requests.
\ No newline at end of file
diff --git a/src/blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg b/src/blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg
new file mode 100644
index 0000000000..ad6ed45b41
Binary files /dev/null and b/src/blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg differ
diff --git a/src/blog/2024/11/images/audit-log-child-events.png b/src/blog/2024/11/images/audit-log-child-events.png
new file mode 100644
index 0000000000..8d7afc9945
Binary files /dev/null and b/src/blog/2024/11/images/audit-log-child-events.png differ
diff --git a/src/blog/2024/11/images/building-uns-with-flowfuse.png b/src/blog/2024/11/images/building-uns-with-flowfuse.png
new file mode 100644
index 0000000000..bbb8265a4a
Binary files /dev/null and b/src/blog/2024/11/images/building-uns-with-flowfuse.png differ
diff --git a/src/blog/2024/11/images/change-node-calculating-magnitude.png b/src/blog/2024/11/images/change-node-calculating-magnitude.png
new file mode 100644
index 0000000000..29f1eff9ca
Binary files /dev/null and b/src/blog/2024/11/images/change-node-calculating-magnitude.png differ
diff --git a/src/blog/2024/11/images/change-node-structering-data.png b/src/blog/2024/11/images/change-node-structering-data.png
new file mode 100644
index 0000000000..c001702219
Binary files /dev/null and b/src/blog/2024/11/images/change-node-structering-data.png differ
diff --git a/src/blog/2024/11/images/colima-status.png b/src/blog/2024/11/images/colima-status.png
new file mode 100644
index 0000000000..82fe51389e
Binary files /dev/null and b/src/blog/2024/11/images/colima-status.png differ
diff --git a/src/blog/2024/11/images/creating-client-interface.png b/src/blog/2024/11/images/creating-client-interface.png
new file mode 100644
index 0000000000..52559060dc
Binary files /dev/null and b/src/blog/2024/11/images/creating-client-interface.png differ
diff --git a/src/blog/2024/11/images/dashboard-1-19-0-tile.png b/src/blog/2024/11/images/dashboard-1-19-0-tile.png
new file mode 100644
index 0000000000..250eab24fb
Binary files /dev/null and b/src/blog/2024/11/images/dashboard-1-19-0-tile.png differ
diff --git a/src/blog/2024/11/images/dashboard2.png b/src/blog/2024/11/images/dashboard2.png
new file mode 100644
index 0000000000..6e9c4a02cd
Binary files /dev/null and b/src/blog/2024/11/images/dashboard2.png differ
diff --git a/src/blog/2024/11/images/device-status-on-ff.png b/src/blog/2024/11/images/device-status-on-ff.png
new file mode 100644
index 0000000000..4cfe872143
Binary files /dev/null and b/src/blog/2024/11/images/device-status-on-ff.png differ
diff --git a/src/blog/2024/11/images/docker-ps-result.png b/src/blog/2024/11/images/docker-ps-result.png
new file mode 100644
index 0000000000..1492040759
Binary files /dev/null and b/src/blog/2024/11/images/docker-ps-result.png differ
diff --git a/src/blog/2024/11/images/edit-layout-button.png b/src/blog/2024/11/images/edit-layout-button.png
new file mode 100644
index 0000000000..4821004b42
Binary files /dev/null and b/src/blog/2024/11/images/edit-layout-button.png differ
diff --git a/src/blog/2024/11/images/esp32-mqtt-node-red.png b/src/blog/2024/11/images/esp32-mqtt-node-red.png
new file mode 100644
index 0000000000..f08d0176cb
Binary files /dev/null and b/src/blog/2024/11/images/esp32-mqtt-node-red.png differ
diff --git a/src/blog/2024/11/images/esp32-with-node-red.png b/src/blog/2024/11/images/esp32-with-node-red.png
new file mode 100644
index 0000000000..75ac156847
Binary files /dev/null and b/src/blog/2024/11/images/esp32-with-node-red.png differ
diff --git a/src/blog/2024/11/images/esp32.webp b/src/blog/2024/11/images/esp32.webp
new file mode 100644
index 0000000000..3a0c4158bc
Binary files /dev/null and b/src/blog/2024/11/images/esp32.webp differ
diff --git a/src/blog/2024/11/images/flowfuse-as-service-on-mac.png b/src/blog/2024/11/images/flowfuse-as-service-on-mac.png
new file mode 100644
index 0000000000..c5411a21b8
Binary files /dev/null and b/src/blog/2024/11/images/flowfuse-as-service-on-mac.png differ
diff --git a/src/blog/2024/11/images/flowfuse-dashboard.png b/src/blog/2024/11/images/flowfuse-dashboard.png
new file mode 100644
index 0000000000..fcd6196437
Binary files /dev/null and b/src/blog/2024/11/images/flowfuse-dashboard.png differ
diff --git a/src/blog/2024/11/images/function-node.png b/src/blog/2024/11/images/function-node.png
new file mode 100644
index 0000000000..4be54032c1
Binary files /dev/null and b/src/blog/2024/11/images/function-node.png differ
diff --git a/src/blog/2024/11/images/hub.png b/src/blog/2024/11/images/hub.png
new file mode 100644
index 0000000000..33bd5471f9
Binary files /dev/null and b/src/blog/2024/11/images/hub.png differ
diff --git a/src/blog/2024/11/images/isa-95-equipement-model.png b/src/blog/2024/11/images/isa-95-equipement-model.png
new file mode 100644
index 0000000000..016431678d
Binary files /dev/null and b/src/blog/2024/11/images/isa-95-equipement-model.png differ
diff --git a/src/blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png b/src/blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png
new file mode 100644
index 0000000000..21ecbfec51
Binary files /dev/null and b/src/blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png differ
diff --git a/src/blog/2024/11/images/mqtt-broker-config-security.png b/src/blog/2024/11/images/mqtt-broker-config-security.png
new file mode 100644
index 0000000000..e848e73a2d
Binary files /dev/null and b/src/blog/2024/11/images/mqtt-broker-config-security.png differ
diff --git a/src/blog/2024/11/images/mqtt-broker-node-config.png b/src/blog/2024/11/images/mqtt-broker-node-config.png
new file mode 100644
index 0000000000..4f6e0ccea6
Binary files /dev/null and b/src/blog/2024/11/images/mqtt-broker-node-config.png differ
diff --git a/src/blog/2024/11/images/mqtt-client-create.png b/src/blog/2024/11/images/mqtt-client-create.png
new file mode 100644
index 0000000000..413b18e54f
Binary files /dev/null and b/src/blog/2024/11/images/mqtt-client-create.png differ
diff --git a/src/blog/2024/11/images/mqtt-common-pitfalls.png b/src/blog/2024/11/images/mqtt-common-pitfalls.png
new file mode 100644
index 0000000000..38253e7a3a
Binary files /dev/null and b/src/blog/2024/11/images/mqtt-common-pitfalls.png differ
diff --git a/src/blog/2024/11/images/mqtt-out-node-config.png b/src/blog/2024/11/images/mqtt-out-node-config.png
new file mode 100644
index 0000000000..b0e306530b
Binary files /dev/null and b/src/blog/2024/11/images/mqtt-out-node-config.png differ
diff --git a/src/blog/2024/11/images/nr-in-uns.png b/src/blog/2024/11/images/nr-in-uns.png
new file mode 100644
index 0000000000..8e6a752911
Binary files /dev/null and b/src/blog/2024/11/images/nr-in-uns.png differ
diff --git a/src/blog/2024/11/images/p2p.png b/src/blog/2024/11/images/p2p.png
new file mode 100644
index 0000000000..3f68fc96c0
Binary files /dev/null and b/src/blog/2024/11/images/p2p.png differ
diff --git a/src/blog/2024/11/images/pixelcut-export-4.png b/src/blog/2024/11/images/pixelcut-export-4.png
new file mode 100644
index 0000000000..69eb8d6d8f
Binary files /dev/null and b/src/blog/2024/11/images/pixelcut-export-4.png differ
diff --git a/src/blog/2024/11/images/pub-sub.png b/src/blog/2024/11/images/pub-sub.png
new file mode 100644
index 0000000000..48a77e72cc
Binary files /dev/null and b/src/blog/2024/11/images/pub-sub.png differ
diff --git a/src/blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png b/src/blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png
new file mode 100644
index 0000000000..9f11a4c87c
Binary files /dev/null and b/src/blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png differ
diff --git a/src/blog/2024/11/images/screenshot-mqtt-hierarchy.png b/src/blog/2024/11/images/screenshot-mqtt-hierarchy.png
new file mode 100644
index 0000000000..a9f6c96690
Binary files /dev/null and b/src/blog/2024/11/images/screenshot-mqtt-hierarchy.png differ
diff --git a/src/blog/2024/11/images/screenshot-search.png b/src/blog/2024/11/images/screenshot-search.png
new file mode 100644
index 0000000000..c30c9a90c9
Binary files /dev/null and b/src/blog/2024/11/images/screenshot-search.png differ
diff --git a/src/blog/2024/11/images/screenshot-sidebar.png b/src/blog/2024/11/images/screenshot-sidebar.png
new file mode 100644
index 0000000000..e760d6b2c2
Binary files /dev/null and b/src/blog/2024/11/images/screenshot-sidebar.png differ
diff --git a/src/blog/2024/11/images/serial-monitor.png b/src/blog/2024/11/images/serial-monitor.png
new file mode 100644
index 0000000000..bb8d1344fd
Binary files /dev/null and b/src/blog/2024/11/images/serial-monitor.png differ
diff --git a/src/blog/2024/11/images/spacer-example.png b/src/blog/2024/11/images/spacer-example.png
new file mode 100644
index 0000000000..b0eb64592a
Binary files /dev/null and b/src/blog/2024/11/images/spacer-example.png differ
diff --git a/src/blog/2024/11/images/the-death-of-point-to-point.png b/src/blog/2024/11/images/the-death-of-point-to-point.png
new file mode 100644
index 0000000000..2b3b50a7f5
Binary files /dev/null and b/src/blog/2024/11/images/the-death-of-point-to-point.png differ
diff --git a/src/blog/2024/11/images/tile-release-2-11.png b/src/blog/2024/11/images/tile-release-2-11.png
new file mode 100644
index 0000000000..b08d93b247
Binary files /dev/null and b/src/blog/2024/11/images/tile-release-2-11.png differ
diff --git a/src/blog/2024/11/images/topic-hierarchy.png b/src/blog/2024/11/images/topic-hierarchy.png
new file mode 100644
index 0000000000..628f72ef47
Binary files /dev/null and b/src/blog/2024/11/images/topic-hierarchy.png differ
diff --git a/src/blog/2024/11/images/uns.png b/src/blog/2024/11/images/uns.png
new file mode 100644
index 0000000000..c4061a5c21
Binary files /dev/null and b/src/blog/2024/11/images/uns.png differ
diff --git a/src/blog/2024/11/images/why-uns-needs-pub-sub.png b/src/blog/2024/11/images/why-uns-needs-pub-sub.png
new file mode 100644
index 0000000000..f52ae25fc1
Binary files /dev/null and b/src/blog/2024/11/images/why-uns-needs-pub-sub.png differ
diff --git a/src/blog/2024/11/images/wysiwyg-demo.gif b/src/blog/2024/11/images/wysiwyg-demo.gif
new file mode 100644
index 0000000000..0f1618f816
Binary files /dev/null and b/src/blog/2024/11/images/wysiwyg-demo.gif differ
diff --git a/src/blog/2024/11/introducing-industrial-visionaries-podcast.md b/src/blog/2024/11/introducing-industrial-visionaries-podcast.md
new file mode 100644
index 0000000000..64f3e3c84a
--- /dev/null
+++ b/src/blog/2024/11/introducing-industrial-visionaries-podcast.md
@@ -0,0 +1,35 @@
+---
+title: "Introducing the Industrial Visionaries Podcast!"
+subtitle: Introducing Industrial Visionaries, the podcast that explores the minds behind the industry's biggest breakthroughs.
+description: New podcast exploring technologies in the manufacturing sector
+date: 2024-11-26
+authors: ["FlowFuse"]
+image: /blog/2024/11/images/FLOWFUSE-IV-Pod__1200x627px_Intro.jpg
+tags:
+ - posts
+ - flowfuse
+ - Podcast
+---
+
+Today, we’re excited to announce our new podcast: Industrial Visionaries!
+
+
+
+This show is dedicated to exploring the transformative power of technology in the manufacturing sector.
+
+In each episode, our host ZJ van de Weg, CEO of FlowFuse, brings you face-to-face with industry leaders who are pioneering digital solutions, sharing insights that will help you navigate the future of manufacturing.
+
+### Episode 1: FlowFuse’s Nick O’Leary on Low-Code Development and Its Impact on IoT
+
+In our inaugural episode of Industrial Visionaries, our host ZJ van de Weg, chats with fellow FlowFuse exec, Nick O’Leary, CTO & Founder. Nick, who is also the creator of Node-RED, shares his extensive insights into the evolution of the Internet of Things (IoT). He discusses the early days of IoT and the transformative role of edge computing, highlighting how increased computing power has shifted data processing closer to devices.
+
+Listen to the first episode on:
+
+- [Apple Podcasts](https://podcasts.apple.com/us/podcast/ep-1-flowfuses-nick-oleary-on-low-code-development/id1781774461?i=1000678217258)
+- [Spotify](https://open.spotify.com/episode/6HJB35FbK1U7pVNpTyM6P2)
+- [YouTube](https://www.youtube.com/watch?v=AI-bjry8vLU)
+
+
+We look forward to bringing you more conversations with actionable insights that help in your pursuit to innovate in your industry.
+
+For the latest episodes, search for “Industrial Visionaries” on Spotify, Apple, YouTube, or wherever you listen to podcasts!
diff --git a/src/blog/2024/11/migrating-from-node-red-to-flowfuse.md b/src/blog/2024/11/migrating-from-node-red-to-flowfuse.md
new file mode 100644
index 0000000000..c09b477ab2
--- /dev/null
+++ b/src/blog/2024/11/migrating-from-node-red-to-flowfuse.md
@@ -0,0 +1,144 @@
+---
+title: Migrating from Self-Managed Node-RED to FlowFuse-Managed Node-RED
+subtitle: A Step-by-Step Guide to Transitioning Your Node-RED Flows to a Streamlined FlowFuse Environment
+description: Discover how to migrate from a self-managed Node-RED setup to a FlowFuse-managed environment, including step-by-step instructions for instance creation, data backup, and snapshot deployment.
+date: 2024-11-13
+authors: ["sumit-shinde"]
+image: /blog/2024/11/images/migrating-from-self-managed-nr-to-flowfuse-managed-nr.png
+keywords: node-red migration, node-red snapshot, node-red instance management, Cloud Instance management, edge device management, node-red backup, node-red to flowfuse migration, flowfuse static assets, node-red deployment, cloud-based node-red, node-red instance snapshot
+tags:
+ - flowfuse
+ - flowfuse features
+---
+
+Migrating your Node-RED instance to [FlowFuse](/) centralizes management and simplifies deployment. Once migrated, FlowFuse takes care of the infrastructure, security, and scalability, making the process much easier. This allows you to focus on building solutions without worrying about the complexities of self-hosting. Whether you're working with edge devices or want to work on cloud instances, this migration streamlines the management of your IIoT workflows, improving efficiency and scalability.
+
+
+
+Let's explore how to migrate from a self-managed and self-hosted Node-RED setup to a FlowFuse-managed environment. We'll look at how the migration works for both edge devices and cloud instances.
+
+## Why Switch from Self-Managed Node-RED to FlowFuse-Managed Node-RED?
+
+Managing self-hosted Node-RED instances can introduce a range of challenges, especially as your Industrial Internet of Things (IIoT) environment scales. These challenges include:
+
+- **Deployment Complexity**: Installing and configuring Node-RED across multiple devices or environments requires technical expertise and attention to detail. For large-scale deployments, managing numerous instances across different devices or servers can become cumbersome and error-prone.
+
+- **Security and Maintenance**: Ensuring your Node-RED instances are secure and up-to-date requires continuous monitoring, timely security patches, and ongoing maintenance. Keeping instances stable and secure can be time-consuming and requires dedicated resources to avoid vulnerabilities.
+
+- **Scalability**: As your IIoT environment grows, scaling your Node-RED infrastructure to handle increased workloads can be challenging. Managing multiple distributed instances often leads to inconsistencies and difficulties in maintaining optimal performance across your entire system.
+
+- **Edge Device Management**: Managing Node-RED instances on edge devices introduces additional complexity. Remote access, secure monitoring, and seamless updates become more difficult as your network expands, especially when dealing with a large number of edge devices.
+
+FlowFuse addresses these challenges by providing a fully managed, secure, and scalable environment for your Node-RED instances. With FlowFuse, you can focus on building and deploying your IIoT solutions, while FlowFuse handles the infrastructure, updates, and scalability. This reduces operational overhead and ensures your instances remain up-to-date and secure.
+
+For more information, read the article: [Transform Chaos into Control: Centralize Node-RED Management with FlowFuse](/blog/2024/10/managing-node-red-instances-in-centralize-platfrom/).
+
+## Migrating from Node-RED to FlowFuse
+
+Before you start, make sure you have a FlowFuse Account created. Next, consider how your Node-RED instance needs to be deployed. Decide whether it should run on the edge device or as a cloud instance.
+
+Running Node-RED on an edge device is ideal when your application flow needs direct access to hardware components, such as reading sensors or controlling actuators. This setup allows immediate data processing and control, crucial for applications requiring low latency responses.
+
+On the other hand, if your use case involves monitoring or collecting metrics—such as through MQTT—without needing direct hardware interaction, and you primarily need to transform, contextualize, visualize, or automate repetitive tasks that don't require hardware interaction, a **Cloud Instance** may be more suitable. This option allows you to centralize data collection and processing, making it easier to manage and analyze data from multiple devices.
+
+*Note: The instructions provided in this article also work for [self-hosted](/docs/install/introduction/) FlowFuse environments. Just ensure that when following the steps, you're performing the actions within your self-hosted FlowFuse setup rather than the FlowFuse cloud platform.*
+
+### Creating a Cloud Instance
+
+The FlowFuse snapshot feature, available through the `@flowfuse/nr-tools-plugin` for self-managed Node-RED (a plugin that allows you to create snapshots from a self-managed Node-RED instance to the FlowFuse platform), However, it does not support direct device snapshots. Instead, you must first create a snapshot for the Cloud Instance and then assign it as the target for your device.
+
+1. Navigate to the FlowFuse platform and log in to your account.
+2. Select the application under which you want to manage your Node-RED instance. You can either choose the default application created with your account or click the "Create Application" button to create a new one.
+3. Once inside the application, select "Add Instance."
+4. Enter a name (or let the system generate one automatically), select the instance type, and choose the Node-RED version that matches your current setup.
+5. Click "Create" to launch the instance.
+
+### Creating a Device Instance and Connecting It to FlowFuse
+
+If you need to run Node-RED on the edge device itself but want to manage it remotely, follow the steps below. Skip this step if your Node-RED Application flow can run on the cloud.
+
+1. Navigate to the cloud instance you created above.
+2. Go to the "Devices" tab by clicking on top "Devices" option and select "Add Device".
+3. Once you click "Add Device", a device configuration popup will appear. Copy the command provided and save it for later.
+4. Follow the steps to install the FlowFuse Device Agent on your device as given in this [documentation](/docs/device-agent/install/).
+5. Execute the saved command on the device.
+6. Start the FlowFuse device agent by executing the following command:
+
+```bash
+ flowfuse-device-agent --port=1881
+```
+
+Running on port `1881` ensures it doesn't conflict with your locally running Node-RED instance, allowing both to run without issues.
+
+### Creating Essential Backups Before Migration
+
+Creating a cloud instance is essential for the migration process, regardless of whether your Node-RED instance will run on the device or on the cloud. As discussed earlier, the `@flowfuse/nr-tools-plugin` does not support creating direct snapshots for devices on the platform. Therefore, you must first create a snapshot for the cloud instance before deploying it to the device.
+
+Follow these steps to create a cloud instance:
+
+1. Install the `@flowfuse/nr-tools-plugin` into your Node-RED instance via the Palette Manager.
+2. Once installed, open the "FlowFuse tools" tab in the sidebar.
+3. Connect to your FlowFuse Cloud account by clicking the "Connect to FlowFuse" button.
+ *(If you're migrating to a self-hosted FlowFuse instance, ensure you configure the plugin with the correct URL. For detailed steps, refer to the [FlowFuse Node-RED Tools plugin Documentation](/docs/migration/node-red-tools/#connecting-to-flowfuse))*.
+4. A browser popup will appear, prompting you to log in to your FlowFuse account. Click "Allow" to grant permission.
+5. After successful authorization, you'll be able to select your team and the associated instance from the "FlowFuse tools" tab.
+6. Choose the team and FlowFuse instance you want to migrate to or the one you will use to take snapshots for your device.
+7. Click the "+ Snapshot" button to create a snapshot. A popup will appear asking for a name and description. Enter the required details and click "Create".
+8. Once the snapshot is created, it will be listed in the sidebar.
+9. To verify, navigate to the FlowFuse platform, go to the FlowFuse Cloud instance you created earlier, and switch to the "Snapshots" tab. The snapshot you created should be visible there.
+
+#### Backing Up System-level Environment Variables
+
+While the snapshot captures flows, credentials, and environment variables at the flow and global level, it does not capture **process environment variables**—those set in the Node-RED `settings.json` file.
+
+To get these variables, you can use the following flow to dump a list of all process environment variables into the debug window:
+
+{% renderFlow %}
+[{"id":"3ed886625239a5d0","type":"function","z":"a87879f70edc3463","name":"process.env","func":"msg.payload = process.env\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[{"var":"process","module":"process"}],"x":650,"y":480,"wires":[["9ca3edbd6857853f"]]},{"id":"b35ef390a46ff129","type":"inject","z":"a87879f70edc3463","name":"List env vars","props":[{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":430,"y":480,"wires":[["3ed886625239a5d0"]]},{"id":"9ca3edbd6857853f","type":"debug","z":"a87879f70edc3463","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":880,"y":480,"wires":[]}]
+{% endrenderFlow %}
+
+1. Import and deploy the flow into your self-managed Node-RED instance.
+2. Click the Inject Node's button
+
+Once clicked, the flow will print all environment variables in the debug window. Identify the environment variables required for your flow and save them in a notepad for later use.
+
+#### Setting System-Level Environment Variables in FlowFuse
+
+Now that you have created the snapshots and copied the process environment variables, you need to set these variables in the Node-RED instance to avoid errors during deployment and smooth application running.
+
+1. Go to the your FlowFuse Cloud/Device instance.
+2. Open the Settings tab by clicking the "Settings" option at the top of the page, then select the Environment tab.
+3. Add the environment variables one by one by clicking the "+ Add" button in the bottom-left corner.
+4. After adding all the environment variables, click "Save."
+
+For more information refer to [Using Environment Variables in Node-RED](/blog/2023/01/environment-variables-in-node-red/)
+
+#### Migrating Static Assets to FlowFuse Static Assets
+
+When working with dashboards or files required in your Node-RED project, these files are typically stored locally and are always available, even if you restart or modify the flows. However, when migrating from Node-RED to a FlowFuse cloud environment, you'll need to manually migrate these files to the cloud-based Node-RED instances. To make this process easier, FlowFuse offers a static assets service feature at the instance level.
+
+Here’s how you can migrate your assets:
+
+1. Locate your static assets in your local system that are used in your Self-managed Node-RED instance from the snapshot we have taken.
+2. Upload them one by one through the Instance "Static Assets" tab. For more information, refer to the [Static Asset Service documentation](/docs/user/static-asset-service/).
+
+Once you have migrated all your assets, you will be able to access them in the instance created in the FlowFuse cloud. Just ensure that after deploying the snapshot, the path set in the flow matches the static assets migrated to the FlowFuse instance.
+
+### Deploying Snapshot for the Cloud/Device instance
+
+Once the system-level environment variables are set and all static assets have been migrated ( if your Node-RED application flow is using static assets), you can deploy the captured snapshot to either the Cloud or Device instance.
+
+1. Navigate to the FlowFuse Cloud instance where you created the snapshot by clicking "Hosted Instance" in the left sidebar and selecting the instance from the list.
+2. Switch to the "Snapshots" tab at the top to locate the snapshot you created from the list.
+3. On the right side of the snapshot, click the three-dot icon:
+
+ - If you are migrating to the Cloud Instance, select **"Restore Snapshot"**
+ - If you are migrating to a Device Instance, select **"Set as Device Target"**
+
+Setting a device target will ensure that the snapshot will be deployed on all of the devices associated with this instance.
+
+## Conclusion
+
+Migrating from a self-managed Node-RED setup to FlowFuse is simple and offers significant benefits. By transitioning, you’ll reduce operational complexity, enhance security, and improve scalability. FlowFuse handles the infrastructure, so you can focus on building and optimizing your IIoT solutions—whether on edge devices or in the cloud.
+
+**Ready to get started?** [Sign up](https://app.flowfuse.com/account/create) for FlowFuse today and streamline your Node-RED deployment!
diff --git a/src/blog/2024/11/mqtt-common-pitfalls-industrial-data-operations.md b/src/blog/2024/11/mqtt-common-pitfalls-industrial-data-operations.md
new file mode 100644
index 0000000000..68ec727050
--- /dev/null
+++ b/src/blog/2024/11/mqtt-common-pitfalls-industrial-data-operations.md
@@ -0,0 +1,99 @@
+---
+title: "Common Pitfalls of Using MQTT in Industrial Data Operations"
+subtitle: We explore 7 Common Pitfalls of using MQTT in Industrial Data Operations and how you can overcome them
+description: Learn about the common pitfalls of using MQTT in industrial data operations, including data quality issues, security risks, and vendor lock-in.
+date: 2024-11-25
+authors: ["sumit-shinde"]
+image: /blog/2024/11/images/mqtt-common-pitfalls.png
+keywords: mqtt disadvantages, mqtt pitfalls, mqtt challenges, mqtt reliability problems, mqtt drawbacks, mqtt limitations, cons of using mqtt
+tags:
+ - post
+ - flowfuse
+ - mqtt
+---
+
+In industrial environments, where real-time data is essential for smooth operations, MQTT has become a go-to messaging protocol for connecting devices. But like any technology, it’s not without its challenges. From data quality issues to security risks and vendor lock-in, there are several pitfalls that can disrupt your industrial data flow. In this article, we will discuss seven common MQTT challenges and explore strategies and solutions to help you mitigate these issues, ensuring more reliable, secure, and efficient industrial data operations.
+
+
+
+The challenges we’ll discuss depend largely on an organization’s specific use cases. While each of these obstacles can have benefits in certain scenarios, they also present challenges that could hinder smooth data operations. By identifying these pitfalls early, you can take proactive steps to improve data communication and better manage your industrial processes.
+
+### Lack of Standardization in Data Formats and Quality Concerns
+
+Industrial data often comes from a variety of devices, machines, and software services. For it to be truly useful, it must be standardized and formatted in a way that makes it easily processable by the receiving systems.
+
+A significant challenge with MQTT is its lack of enforced standardization in data formats. While this flexibility can be advantageous in some contexts, it often means that additional work is required to transform data into a usable format, leading to inefficiencies. Without a standardized approach, data may become inconsistent or poorly structured, complicating analysis and making it harder to extract actionable insights. Furthermore, the absence of message schema enforcement means that the consumer of the data does not know what to expect. This uncertainty can lead to compatibility issues and increases the effort required to interpret and validate the incoming messages, especially in systems where diverse applications rely on a uniform data structure.
+
+To address this, frameworks like **Sparkplug B** provide a standardized way of managing MQTT payloads, ensuring data consistency and quality across devices and systems. Leveraging such frameworks ensures that data is delivered in a structured, reliable format, which ultimately supports more informed decision-making and streamlined operations.
+
+### Payload Limitations and Bandwidth Constraints
+
+MQTT can struggle when transmitting large amounts of data or high-frequency messages, especially when bandwidth is limited. Although the MQTT standard allows message payloads up to 250 MB, sending such large amounts of data can cause delays and performance issues. This is because MQTT was designed for small, lightweight messages, and many brokers set limits on payload sizes. Large payloads, like images or detailed sensor data, can make this even worse.
+
+To avoid these problems, consider compressing your data before sending it, aggregating data to send less frequently, or adjusting the frequency of updates. For large blobs or binary data, it is better to store them on a shared storage layer, such as AWS S3 or network drives, and send a pointer to the data file instead.
+
+### Risks of Data Loss and Delivery Issues
+
+In industrial settings, the timely and reliable transmission of data is critical. Data loss, duplication, or out-of-order delivery can significantly impact decision-making, safety, and efficiency. While MQTT is generally robust, its publish-subscribe model can sometimes lead to reliability challenges, such as message loss or misordering.
+
+Network disruptions, for instance, may result in important messages being dropped before they reach their destination. Similarly, when a network reconnects after a failure, MQTT might deliver messages out of order or resend some messages, creating duplicates. These issues can lead to confusion, unreliable analyses, or even unsafe conditions (e.g., in the case of robotic control systems, where mis-sequenced commands can cause malfunctions).
+
+To mitigate these risks, MQTT offers **Quality of Service (QoS) levels**, which define how messages are delivered:
+
+- **QoS 0**: Messages are delivered at most once with no guarantees of delivery or order.
+- **QoS 1**: Guarantees that messages are delivered at least once, but duplicates can occur.
+- **QoS 2**: Ensures messages are delivered exactly once, and in the correct order.
+
+While higher QoS levels offer more reliable message delivery, they also introduce increased overhead and latency, which may not be acceptable in real-time applications. Therefore, it’s critical to evaluate which QoS level best aligns with the operational needs and time sensitivity of your industrial processes.
+
+### Lack of Acknowledgment Mechanisms
+
+Another key challenge with MQTT is the **lack of acknowledgment mechanisms**. Unlike traditional request-response communication models, MQTT doesn’t inherently provide a built-in way for the receiver to acknowledge receipt of a message. This lack of visibility can make it difficult to ensure that data has been successfully transmitted, which could lead to uncertainties in operational systems.
+
+While MQTT allows for some workarounds (such as implementing tracking mechanisms or using a second topic for acknowledgment), these solutions add complexity to the integration process. By designing systems that include these acknowledgment mechanisms, you can improve reliability, but it requires careful planning and additional development effort.
+
+### TCP Limitations in MQTT Frameworks
+
+While MQTT operates over the TCP/IP protocol to ensure reliable message delivery, this introduces several challenges, particularly for resource-constrained industrial devices.
+
+TCP requires maintaining a constant connection state, which demands significant processing power and memory. This becomes problematic in industrial IoT environments, where many devices are low-powered and designed for minimal energy consumption. The ongoing need for devices to manage and maintain a persistent TCP connection can quickly drain resources, limiting overall system efficiency and scalability.
+
+Moreover, not all IoT devices are capable of supporting the overhead required by TCP/IP. Simpler devices, such as sensors with limited computing capabilities, may struggle with the complexities of maintaining a reliable TCP connection. This can restrict the deployment of MQTT in systems where lightweight communication protocols, like UDP, would be more appropriate for ensuring broad compatibility and energy efficiency.
+
+### Security Risks and Vulnerabilities
+
+Security is a critical concern when using MQTT in industrial environments. While MQTT supports features like encryption and authentication, it is possible to misconfigure the system to bypass these safeguards. A poorly configured MQTT deployment—such as one without authentication or encryption—can leave it vulnerable to attacks like data interception, unauthorized access, or man-in-the-middle attacks. In industrial settings, these vulnerabilities could lead to data manipulation, operational disruptions, or even safety issues in critical systems.
+
+To ensure a secure MQTT setup, proper configuration is essential. Implement encryption (SSL/TLS) to protect data transmitted between devices and the broker, safeguarding sensitive information from interception. Enable authentication mechanisms, such as usernames, passwords, or client certificates, to ensure that only authorized devices and users can access the system.
+
+Using access control measures further strengthens security by limiting the actions that devices or users can perform. For example, restricting permissions for certain commands can prevent unsafe operations in safety-critical environments. Monitoring MQTT traffic for anomalies or suspicious activity can also help identify and address potential threats proactively.
+
+Lastly, employ message integrity checks to confirm that messages are not tampered with during transmission. With the right configuration and adherence to these best practices, MQTT can be deployed securely to support safe, reliable, and efficient industrial systems.
+
+### Single Point of Failure and the Risks of Vendor Lock-In
+
+One of the key risks in using MQTT for industrial operations is the **single point of failure** created by the central broker. If the broker goes down, it can disrupt the entire data flow, significantly impacting operations. To mitigate this, it’s essential to implement strategies like high availability, load balancing, and backup solutions to ensure the system stays online and reliable.
+
+Another concern is **vendor lock-in**, where companies choose a specific MQTT broker or service provider but later struggle to switch due to proprietary features, configurations, or integrations. This can lead to a lack of flexibility, limiting future scalability or the ability to adapt to evolving needs. Vendor lock-in typically occurs when the broker relies on proprietary protocols or formats that are not compatible with other systems, or when advanced features and configurations are unique to a specific vendor, making migration or integration with new platforms challenging.
+
+To avoid this, it’s crucial to choose an MQTT broker that adheres to **open standards**. Open-source MQTT brokers or those that support widely adopted standards like **MQTT 3.1.1** or **MQTT 5.0** offer the flexibility to switch providers without major disruptions. Additionally, brokers that prioritize interoperability with other industrial IoT systems can provide more options for scaling and integrating future technologies.
+
+By selecting a broker that prioritizes flexibility, open standards, and scalability, companies can avoid vendor lock-in and ensure they can seamlessly transition to new systems or providers as their operational needs evolve.
+
+## How FlowFuse Solves These Problems
+
+FlowFuse is an industrial data platform designed to simplify the management, scaling, and security of industrial IoT applications. Built on top of Node-RED, FlowFuse supports various industrial protocols, including MQTT, to facilitate seamless data communication between devices. FlowFuse addresses many of the challenges mentioned above with its robust set of features.
+
+For instance, FlowFuse helps standardize data before it is sent to the MQTT broker using Node-RED’s powerful low-code programming capabilities. You can define data formats and topics, ensuring consistency and quality across all connected devices. This minimizes issues like data inconsistency and allows for smoother integration of diverse systems. It also supports the implementation of [Sparkplug B](/blog/2024/08/using-mqtt-sparkplugb-with-node-red/).
+
+Security is another area where FlowFuse provides benefit in the context of MQTT. By leveraging MQTT nodes, you can implement robust security as it allows you to configure it with SSL/TLS, username/password authentication, and more. This ensures secure communication between devices, protecting data from unauthorized access and ensuring confidentiality.
+
+FlowFuse also simplifies the creation of acknowledgment mechanisms. By using Node-RED, you can build custom workflows to track the receipt and processing of messages, ensuring data integrity and operational transparency. This helps ensure that messages are reliably received and processed, contributing to smoother operations.
+
+Moreover, FlowFuse provides its own MQTT broker service that adheres to open standards, making it easier to avoid vendor lock-in and reducing the risk of a single point of failure. With built-in high availability and load balancing, FlowFuse ensures continuous data flow and reliable communication, and you can scale its capabilities by contacting FlowFuse support to meet the growing demands of your industrial IoT system.
+
+**Ready to solve your industrial data challenges?** [Get started with FlowFuse today!](https://app.flowfuse.cloud/account/create/)
+
+## Conclusion
+
+While MQTT offers great potential for industrial data operations, it comes with challenges such as data quality issues, security risks, and vendor lock-in. By understanding these pitfalls and using tools like FlowFuse, organizations can address these challenges effectively. FlowFuse helps standardize data, ensure secure communication, and prevent single points of failure, enabling smooth and reliable industrial IoT operations. With the right approach, MQTT can deliver powerful, efficient, and secure data communication.
diff --git a/src/blog/2024/11/why-point-to-point-connection-is-dead.md b/src/blog/2024/11/why-point-to-point-connection-is-dead.md
new file mode 100644
index 0000000000..b62a3d4b5a
--- /dev/null
+++ b/src/blog/2024/11/why-point-to-point-connection-is-dead.md
@@ -0,0 +1,103 @@
+---
+title: "The Death of Point-to-Point: Why You Need a Unified Namespace"
+subtitle: Traditional Point-to-Point Connection Model is Holding Back Manufacturing Innovation - Unified Namespace (UNS) Can Transform Factory Operations
+description: Learn why point-to-point connections are outdated in modern manufacturing and how a Unified Namespace (UNS) simplifies system integration, enhances data sharing, and improves scalability and security.
+date: 2024-11-26
+authors: ["sumit-shinde"]
+image: /blog/2024/11/images/the-death-of-point-to-point.png
+keywords: uns, cons of p2p, cons of point-to-point connection, drawbacks of point-to-point connection, publish-subscribe, mqtt
+tags:
+ - flowfuse
+ - mqtt
+ - unified-namespace
+---
+
+Manufacturing has changed significantly over the years, driven by new technology and the need for better communication between systems. In the past, point-to-point (P2P) connections, where devices communicate directly with each other, were the standard. However, as factories become more complex, P2P connections are no longer practical. This article explains why P2P connections are outdated and how a Unified Namespace (UNS) offers a better, more flexible solution.
+
+
+
+## What are Point-to-Point Connections?
+
+![Point-to-point connection](./images/p2p.png){data-zoomable}
+_Point-to-point connection_
+
+Point-to-point (P2P) connections are direct links between two systems or devices, allowing them to communicate with each other. They can be physical, like cables, or network-based (client-server), like a machine sending data to a server.
+
+In a P2P setup, each connection links exactly two systems. These systems could be hardware, software, or even databases, exchanging data tailored to their needs.
+
+For example, a machine might send performance data directly to a control system, or a sensor could send real-time measurements to a monitoring device. It’s a straightforward way to get systems talking, but as the number of devices grows, it becomes increasingly complex to manage.
+
+## Why Point-to-Point Connections No Longer Work
+
+As manufacturing moves toward more modern, interconnected approaches like Industry 4.0, the limitations of point-to-point connections become more apparent. Here's why P2P connections are no longer sufficient for today’s manufacturing environments:
+
+### 1. Limited Data Sharing, Visibility, and Delayed Data
+
+Point-to-point connections often lead to data silos, where devices or machines communicate only with their immediate hierarchy level. This isolation severely limits system-wide visibility, making it challenging to share critical data in real-time. Consequently, problems such as defective products, unexpected downtime, and the need for rework may go unnoticed until the damage is done.
+
+In modern manufacturing, real-time data is indispensable for maintaining operational efficiency. However, point-to-point connections introduce significant delays, as data must traverse multiple layers—control systems (Level 1), supervisory control (Level 2), manufacturing execution systems (Level 3), and finally, higher-level management systems (Level 4) as outlined in the ISA-95 model. Each additional layer compounds latency, slowing response times and postponing the detection of issues, see also our post on [Why the Automation Pyramid slows you down](https://flowfuse.com/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace/).
+
+Without integrated, real-time data across teams, such as quality control, problems like defective parts may not be addressed promptly, leading to increased waste and customer dissatisfaction. The lack of seamless data sharing results in visibility gaps that impede decision-making, reducing the ability to act swiftly. In fast-paced environments, these delays not only hinder operational efficiency but also have a direct negative impact on profitability.
+
+### 2. Inflexibility, Limiting Innovation, and Causing Downtime
+
+Point-to-point connections create a rigid and inflexible network. When new technology or equipment is added, the entire system often requires reconfiguration, leading to significant downtime. For instance, if a new machine is introduced to the production line, many connections may need to be adjusted or re-established, which can temporarily halt production.
+
+This downtime disrupts the flow of operations and makes it harder to implement new technologies quickly, slowing down innovation. As a result, manufacturers may struggle to stay competitive, as they can't integrate advancements like automation, real-time analytics, or AI without significant delays and costly interruptions.
+
+### 3. High Costs Over Time and Maintenance Complexity
+
+At first glance, point-to-point (P2P) connections may appear to be a cost-effective and straightforward solution. However, as systems expand, the true costs and complexities become increasingly apparent. In the automation pyramid (ISA-95 model), communication occurs across multiple hierarchical levels, with field devices interacting with controllers, controllers with SCADA, and SCADA with higher-level systems such as MES and ERP.
+
+While this layered structure can keep connections orderly, it quickly becomes a logistical nightmare when scaling. Introducing new devices often triggers a cascade of necessary updates and reconfigurations across various levels. For example, adding a new field device typically requires adjustments to the controller, followed by updates to the SCADA system, creating a ripple effect that impacts the entire system.
+
+This ongoing need for constant reconfiguration not only drives up costs but also introduces significant complexity in maintenance. As the system grows, so does the effort and resources required to manage it, making the P2P model inefficient and prohibitively expensive in environments that demand agility, scalability, and long-term sustainability. Ultimately, the simplicity of P2P connections gives way to an increasingly cumbersome and expensive maintenance burden, undermining its initial advantages.
+
+### 4. Security Vulnerabilities
+
+As the number of point-to-point connections increases, so does the risk of security breaches. Each connection represents a potential vulnerability, and if one connection in the network is compromised, the entire system becomes a target for attackers.
+
+In large manufacturing environments, securing every individual connection becomes daunting. Any new device or system can introduce additional vulnerabilities, creating more opportunities for attackers to exploit. A compromised point-to-point connection could lead to production halts, loss of sensitive data, or even physical damage to machinery.
+
+For example, imagine a situation where a hacker gains access to a machine’s control system through a compromised point-to-point connection. The attacker could intentionally cause a malfunction, halt production, or extract confidential information. The complexity of managing security for each connection makes it difficult to maintain a secure, reliable network.
+
+### 5. Scalability Issues
+
+One of the most significant drawbacks of P2P connections in manufacturing is their inability to scale efficiently. As production lines grow, so too do the number of devices, systems, and connections that must be managed. With a P2P architecture, each new device or system typically requires a direct, dedicated connection to each relevant part of the network. This creates a spaghetti network of interwoven links that becomes increasingly unwieldy and difficult to manage as the system expands.
+
+In a traditional P2P setup, scaling the network means manually creating additional links, configuring them, and ensuring that the new connections fit seamlessly into the existing infrastructure. This process is time-consuming, error-prone, and highly resource-intensive, leading to increased complexity and longer downtimes as you scale.
+
+When scaling a P2P network, changes made to one part of the system often trigger a ripple effect throughout the entire network. For instance, adding a new sensor may require updating the controller, the SCADA system, and even the Manufacturing Execution System (MES). This cascading need for updates across different layers of the network makes scaling more complicated and costly. Furthermore, the introduction of new devices means additional configuration and troubleshooting, often leading to disruptions in operations and extended downtimes while the new devices are integrated.
+
+These issues compound when scaling across multiple production lines or sites, creating an increasingly complex web of p2p connections. As the number of devices grows, so does the risk of errors, network failures, and delays. This makes it difficult for manufacturers to respond to the growing demands of production while maintaining efficiency, reliability, and uptime.
+
+## Unified Namespace: The Modern Solution
+
+![Hub and Spoke Model](./images/hub.png){data-zoomable}{width="400px"}
+_Hub and Spoke Model_
+
+A Unified Namespace (UNS) is a more straightforward way to connect devices and systems in a factory. Instead of having separate connections between each device, everything is connected through one central hub, which we call the **hub-and-spoke** model. This means devices don’t need to be directly linked to each other, making the system easier to manage and maintain; for more information on Unified Namespace, read our article: [Introduction to unified namespace](/blog/2023/12/introduction-to-unified-namespace/).
+
+With a UNS, adding new devices or systems becomes straightforward. Rather than setting up multiple direct connections—like in a point-to-point system—new devices (spokes) connect to the central hub. This reduces the complexity of growing your system and eliminates downtime. If equipment is replaced or updated, only that device needs to be reconnected to the hub rather than reconfiguring the entire network.
+
+A UNS also improves data sharing. All data is collected in one place, so any system that needs it can access it in real time. This leads to quicker decisions and faster responses to problems. With fewer connections to manage, the costs of maintaining the system are lower. Plus, the central hub makes the whole system more secure, as fewer direct connections need to be protected.
+
+![Publish-Subscribe Archtecture](./images/pub-sub.png){data-zoomable}
+_Publish-Subscribe Archtecture_
+
+We use a **publish-subscribe (pub/sub)** architecture to implement a hub-and-spoke model in a UNS. In this architecture, devices, systems send data to a central broker, and other devices can subscribe to the data they need. This approach eliminates the need for a complex network of point-to-point connections, making it easier to scale, update, and maintain the system.
+
+This model addresses all the significant problems of point-to-point connections. For more information on how pub/sub solves these problems or why UNS needs pub/sub, read the article: [Why UNS Needs Pub/Sub](/blog/2024/11/why-pub-sub-in-uns/).
+
+[MQTT](/blog/2024/06/how-to-use-mqtt-in-node-red/) is a widely used for implementing the publish-subscribe model. It is lightweight, efficient, and works well in manufacturing environments where network reliability can be inconsistent.
+
+![Unified Namespace](./images/nr-in-uns.png){data-zoomable}
+_Unified Namespace_
+
+To simplify the creation of a UNS in your manufacturing environment, [FlowFuse](/) provides an integrated MQTT broker service. The platform makes building, scaling, and managing Node-RED solutions easy. It supports seamless connections between devices, services, and APIs using over 5,000 community-contributed nodes for data collection. FlowFuse also enables efficient data transformation and visualization with a low-code approach, remote management of edge devices, and team collaboration on projects. With everything centralized on one platform, FlowFuse offers high security, scalability, and availability to optimize and maintain your system effectively.
+
+[Sign up](https://app.flowfuse.cloud/account/create/) now to [start building your own Unified Namespace with FlowFuse](/blog/2024/11/building-uns-with-flowfuse/) and take the first step toward a more efficient and connected manufacturing system.
+
+## Summary
+
+Due to complexity, high maintenance costs, and security risks, point-to-point (P2P) connections are becoming less effective in modern factories. A Unified Namespace (UNS) solves these problems by connecting devices through a central hub, making managing, scaling, and securing systems easier. UNS improves data sharing and reduces downtime. Tools like FlowFuse make it simple to set up and manage a UNS, offering a more efficient and flexible solution for manufacturing.
diff --git a/src/blog/2024/11/why-pub-sub-in-uns.md b/src/blog/2024/11/why-pub-sub-in-uns.md
new file mode 100644
index 0000000000..e006570af1
--- /dev/null
+++ b/src/blog/2024/11/why-pub-sub-in-uns.md
@@ -0,0 +1,98 @@
+---
+title: Why UNS needs Pub/Sub
+subtitle: Discover How Pub/Sub Transforms Unified Namespace into a Scalable, Real-Time Data Powerhouse for Modern Manufacturing.
+description: Explore why integrating Publish/Subscribe (Pub/Sub) with Unified Namespace (UNS) is key to optimizing manufacturing data flow. Learn how this combination reduces latency, improves scalability, and enables real-time decision-making in IIoT systems.
+date: 2024-11-19
+authors: ["sumit-shinde"]
+image: /blog/2024/11/images/why-uns-needs-pub-sub.png
+keywords: unified namespace, pub/sub, mqtt, iiot, manufacturing, real-time data, event-driven, scalability, smart factory, flowfuse, iot integration
+tags:
+ - flowfuse
+ - mqtt
+ - unified-namespace
+---
+
+As the manufacturing industry evolves and becomes increasingly connected through the Industrial Internet of Things (IIoT), the concept of a Unified Namespace (UNS) has emerged as a critical architecture for centralizing and organizing data. UNS serves as a central reference point where all operational data, from machines to the enterprise, can be accessed in a consistent and structured way. Over time, more and more manufacturers have adopted UNS to simplify data integration and improve real-time visibility across systems.
+
+If you're unfamiliar with UNS, please read our [Introduction to Unified Namespace](/blog/2023/12/introduction-to-unified-namespace/) for a basic understanding of UNS.
+
+
+
+If you're familiar with or already using a UNS, you might be asking: **Why does a UNS need Pub/Sub**? Here, we’ll explore how combining the Pub/Sub model with a Unified Namespace can help manufacturers streamline data flow, reduce latency, and enable more responsive and scalable operations.
+
+## What is Pub/Sub?
+
+Before discussing why Publish/Subscribe (Pub/Sub) is essential for a UNS, let's first define the Pub/Sub model.
+
+![Publish Subscribe Model](./images/pub-sub.png){data-zoomable}
+_Publish Subscribe Model_
+
+The Pub/Sub model is a way for systems to communicate where one component, called the publisher, sends messages to a central system ( Broker such as [MQTT](/blog/2024/06/how-to-use-mqtt-in-node-red/), [RabitMQ](/node-red/protocol/amqp/), and [Kafka](/blog/2024/03/using-kafka-with-node-red/) ), and other components, called subscribers, receive those messages. The publisher doesn’t need to know who the subscribers are, and the subscribers don’t know who the publishers are. The central system, or broker, ensures the right messages go to the right subscribers based on their interests.
+
+Additionally, it’s important to note that the roles of publisher and subscriber are not mutually exclusive. A component can act as a publisher in one context, sending messages to the broker, and as a subscriber in another, receiving messages from the broker.
+
+## Why Does a UNS Need Pub/Sub?
+
+Now that you have a basic understanding of Pub/Sub, let’s dive into why this architecture is essential for a Unified Namespace.
+
+### Decoupling Producers and Consumers with Flexible Communication
+
+In traditional manufacturing setups, various systems and machines often operate in silos, requiring point-to-point connections for communication. This means each device or system must be directly linked to others, which quickly becomes complex and cumbersome as the number of systems grows. Point-to-point integrations are hard to scale because each new device needs a dedicated connection. This not only makes data harder to access but also blocks innovation by creating dependencies between systems.
+
+To learn more about how point-to-point systems restrict innovation, please read the article: [Why the Automation Pyramid Blocks Digital Transformation](/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace/)
+
+The Pub/Sub model provides a more scalable solution. In this model, publishers (such as IoT devices or machines) generate data and send it to a central system. Subscribers (other systems, applications, or users) then receive only the data relevant to them. Crucially, the publishers and subscribers do not need to know about each other, relying instead on a central Namespace to distribute the data efficiently.
+
+By using Pub/Sub in a UNS, industries can create a single reference point for all data, enabling systems to subscribe to the data streams they need, without direct connections to every other system. For example, a production line monitoring system can easily access data from temperature sensors, pressure gauges, and robotic arms without the need for complex point-to-point integrations.
+
+Unlike point-to-point systems, the Pub/Sub model allows for flexible communication—whether one-to-one, one-to-many, or many-to-many—without the need for direct connections between each system. This flexibility ensures that as your factory evolves, new devices and applications can easily be integrated into the UNS, driving innovation.
+
+### Event-driven and Asynchronous Communication
+
+The Pub/Sub model is particularly well-suited for event-driven architectures, where systems react to changes in data rather than periodically polling for updates. This is important in environments where responsiveness is key—such as in predictive maintenance, supply chain optimization, or automated decision-making.
+
+For instance, a predictive maintenance system can subscribe to real-time sensor data from machines in a UNS. When the system detects an anomaly (e.g., a machine vibration out of normal parameters), it can immediately trigger an alert or maintenance action. This type of asynchronous communication is more efficient and scalable than synchronous polling or direct communication between producers and consumers.
+
+### Less Delay, More Efficiency
+
+In industries where IIoT-enabled operations are prevalent, real-time data is essential for effective decision-making. Traditional systems often introduce delays due to multiple layers of data collection, storage, and processing. These delays can result in inefficiencies such as slow machine adjustments, missed production targets, or equipment failures.
+
+The Pub/Sub model reduces latency by immediately pushing data to subscribers as soon as it’s available. There’s no need for systems to poll or wait for periodic updates. Instead, they can respond to real-time events as soon as they occur.
+
+For instance, in a smart factory, if a machine’s temperature exceeds a threshold, a maintenance system could instantly react by scheduling a technician, triggering an alert, or even pausing operations. Without Pub/Sub, the system would have to rely on polling mechanisms, which are less efficient and often introduce unnecessary delays.
+
+In real-time environments, these immediate actions can make the difference between preventing costly downtime or catching a problem too late.
+
+### Easy to Scale as You Grow
+
+Manufacturers are always expanding—whether by adding more machines to the production line, introducing new automation systems, or scaling up to handle more products or more data. Scaling traditional systems to keep up with this growth can be complex and costly, especially when new devices or technologies need to be integrated.
+
+The beauty of Pub/Sub is that it scales effortlessly. When new machines or sensors are introduced, they simply publish their data to the namespace. No complex reconfiguration or integration is required. Similarly, if a new application needs to access this data, it can simply subscribe to the relevant streams.
+
+For example, consider a car manufacturer adding new robotic arms to the production line. These robots can publish real-time performance data, such as arm movement speeds, energy consumption, and fault alerts, directly into the UNS. The factory’s existing data systems can then subscribe to this new data without requiring changes to the entire system, making integration quick and cost-effective.
+
+This level of scalability helps manufacturers keep up with growth without worrying about complex system upgrades or slowdowns.
+
+### Making Your Systems More Reliable
+
+In manufacturing, system downtime is costly. However traditional, monolithic systems often rely on point-to-point connections, which can create vulnerabilities. If one part of the system goes down, it can bring down other systems or halt production entirely.
+
+With a Pub/Sub architecture, this is less of a concern. If one publisher (like a sensor or machine) fails or goes offline, the rest of the systems can continue operating as normal. Other sensors or machines can continue to send their data, and subscribers can still receive real-time updates from other sources.
+
+Consider a delivery system in a Point-to-Point setup, all vehicles send data directly to a central dispatch system. If the central dispatch system fails, data from all vehicles is lost. In a Pub/Sub setup, vehicles send their data to a central namespace instead of directly to the dispatch system. If the central dispatch system fails, it doesn’t result in data loss. Vehicles can still send their updates.
+
+This decoupling of systems improves resilience, meaning that your factory can continue running smoothly even if individual components experience issues.
+
+While the broker is a critical part of the Pub/Sub system and can also go down, this risk can be mitigated. Strategies such as high-availability brokers, failover mechanisms, and clustered deployments can be implemented to prevent downtime and ensure uninterrupted data flow.
+
+### Taking Action
+
+As we've discussed, the Pub/Sub model is a game-changer for Unified Namespace architectures in the manufacturing industry. One of the most widely adopted protocols for implementing Pub/Sub is MQTT (Message Queuing Telemetry Transport). MQTT is known for its simplicity, efficiency, and low-bandwidth requirements, making it an ideal choice for Industrial applications.
+
+To help you leverage the power of MQTT in your manufacturing operations along with Node-RED, Flowfuse offers a robust MQTT broker service. Now, Flowfuse will not only help you build, scale, and manage Node-RED solutions, collaborate across teams, and manage edge devices, but it will also simplify your integration of IIoT data streams into your Unified Namespace. For more information on how our FlowFuse MQTT broker Service, read our [MQTT Broker Service Announcement](/blog/2024/10/announcement-mqtt-broker/).
+
+[Sign Up](https://app.flowfuse.com/account/create) now to streamline your IIoT operations from a centralized place.
+
+## Conclusion
+
+Integrating Pub/Sub with a Unified Namespace enhances manufacturing operations by enabling real-time data flow, reducing latency, and improving scalability. This combination ensures efficient, resilient, and future-ready systems, empowering manufacturers to stay competitive in the IIoT era.
diff --git a/src/blog/2024/12/flowfuse-team-collaboration.md b/src/blog/2024/12/flowfuse-team-collaboration.md
new file mode 100644
index 0000000000..4221e4caa8
--- /dev/null
+++ b/src/blog/2024/12/flowfuse-team-collaboration.md
@@ -0,0 +1,139 @@
+---
+title: Streamlining Node-RED Collaboration with FlowFuse
+subtitle: Enabling Real-Time Collaboration in Industrial Environments with FlowFuse
+description: Learn how FlowFuse simplifies collaboration for Node-RED projects by centralizing resources, enabling real-time updates, and ensuring secure, scalable teamwork.
+date: 2024-12-09
+authors: ["sumit-shinde"]
+image: /blog/2024/12/images/flowfuse-team-collaboration.png
+keywords: real-time collaboration on node-red projects, centrlize management, real-time collaboration on nodered projects
+tags:
+ - flowfuse
+ - flowfuse features
+---
+
+A few weeks ago, we discussed how [FlowFuse centralizes edge device and Node-RED management](/blog/2024/10/managing-node-red-instances-in-centralize-platfrom/), as well as its [security features](/blog/2024/10/exploring-flowfuse-security-features/). Now, we're focusing on another key benefit of FlowFuse—making collaboration easier for teams in industrial environments.
+
+
+
+As more manufacturing companies use FlowFuse for edge device management, data pipelines, and bridging IT-OT systems, the platform is becoming a key tool for handling complex data operations. Collaboration is critical in manufacturing environments with thousands of devices and data flows. FlowFuse accelerates industrial data operations by simplifying real-time collaboration while ensuring security and scalability.
+
+Now, let’s look at how FlowFuse makes collaboration effortless. With features like centralized management, real-time updates, and easy sharing, FlowFuse helps teams stay on the same page—whether working on the same flow or across multiple projects. The platform eliminates the usual pain points of collaboration, allowing teams to quickly deploy, modify, and scale Node-RED solutions confidently while maintaining control and security.
+
+## **Laying the Foundation for Better Collaboration with Centralization**
+
+Effective collaboration starts with everyone having access to the same interface and information. When team members work with different versions of flows or data, things can easily get out of sync, making collaboration difficult.
+
+This is exactly why centralized management is so crucial. With FlowFuse, everything—your Node-RED Instances, edge devices, settings, and data—is in one place. Everyone on your team sees the same interface, accesses the same up-to-date information, and works from the same set of resources. There’s no more hunting for the correct version or trying to sync up tools.
+
+Everything in one place means fewer mistakes, fewer mix-ups, and much easier collaboration. Whether you're working in a single instance or managing a whole network of edge devices, FlowFuse makes it easy to stay aligned. You can move quickly and confidently without worrying about missing something important.
+
+![List of all Node-RED instances organized centrally within your team.](./images/application-wise-instance-organization.jpeg){data-zoomable}
+_A centralized view of applications with Node-RED instances organized under each application for easier management._
+
+![List of all Node-RED instances organized centrally within your team.](./images/list-of-instances.jpeg){data-zoomable}
+_A list of all Node-RED instances is displayed centrally, allowing team members to manage and access them easily._
+
+![All edge devices centralized for easy management.](./images/edge-devices.jpeg){data-zoomable}
+_A centralized view of edge devices, providing streamlined management for all devices within the platform._
+
+In short, centralization makes everything simpler. It’s the backbone of effective teamwork, ensuring everyone works from the same starting point. With FlowFuse, you don't have to worry about syncing — everything's already in sync for you.
+
+If you want to dive deeper into how FlowFuse centralizes things, check out this article: [Managing Node-RED Instances in a Centralized Platform](/blog/2024/10/managing-node-red-instances-in-centralize-platfrom/).
+
+## **Creating and Managing Teams**
+
+Collaboration begins with the right team setup. In FlowFuse, you can quickly [create a team](/docs/user/team/#creating-a-new-team) and assign it a name. Once your team is set up, you can easily [invite members to join](/docs/user/team/#adding-team-members). As mentioned earlier, all your Node-RED instances, edge devices, configurations, settings, and data are organized and centralized within that team.
+
+However, simply creating a team and inviting members isn’t enough. Not all team members need access to all information, features, or controls. It’s essential to ensure that the right people have the right level of access to do their work effectively. Providing excessive access to members who don’t require it or who might lack the necessary expertise can lead to accidental changes or mistakes.
+
+![Invite new members to your FlowFuse team by assigning roles and permissions.](./images/inviting-member-to-team.jpeg){data-zoomable}
+_A centralized view of edge devices, providing streamlined management for all devices within the platform._
+
+![FlowFuse team management interface displaying team members and their roles for streamlined collaboration control.](./images/team-members-list.jpeg){data-zoomable}
+_A comprehensive list of team members with assigned roles and permissions_
+
+This is where [FlowFuse’s Role-Based Access Control (RBAC)](/blog/2024/04/role-based-access-control-rbac-for-node-red-with-flowfuse/) comes in. When inviting new team members, you can assign them specific roles, each with different permissions and access scopes. This ensures that each team member has the appropriate level of access based on their role, reducing the risk of unintended changes or disruptions.
+
+You can later update roles to adjust permissions as your team, and projects evolve if needed. FlowFuse’s RBAC helps maintain control and security while empowering each team member to contribute effectively to the project.
+
+## **Real-Time Collaboration and Monitoring**
+
+Once team members have been invited, Node-RED instances have been created, and edge devices have been added by the team owner, FlowFuse's real-time collaboration capabilities come into play. Team members, whether they have owner or member roles, can work on the same project simultaneously. They can update flows, deploy them, and monitor real-time progress.
+
+With FlowFuse, tracking who is working on which project and at what stage is easy. The platform lets you see who has opened the Node-RED editor you are working on, which flow they are working on, and even which specific node they are interacting with. This visibility ensures that team members are always aligned and that collaboration happens seamlessly without stepping on each other’s toes.
+
+![A screenshot showing multiple users working on the same Node-RED flow in real time within FlowFuse, with live updates and visibility of each user's actions.](./images/multiplayer-flowfuse.jpeg){data-zoomable}
+_Multiple users collaborate on the same Node-RED flow in real-time within FlowFuse._
+
+For instance, if two members modify different parts of the same flow, they can do so without interrupting each other’s work. They’ll both be able to see each other's updates in real-time, ensuring the project moves forward smoothly. This collaborative approach enhances teamwork and helps avoid mistakes, as everyone has the information they need when needed.
+
+In addition, FlowFuse’s real-time monitoring features allow you to track the status of edge devices, Node-RED instances, and overall system health. You can also monitor Node-RED logs for troubleshooting, ensuring no issue slips through the cracks as your team works together efficiently.
+
+## **Version Controlling**
+
+In any collaborative environment, accidental changes or conflicts are inevitable, especially when multiple team members are working on the same project. While collaboration is essential for progress, the ability to track changes, roll back versions, and understand who made what updates is critical for maintaining control and continuity.
+
+FlowFuse provides robust version control features that make it easier to manage changes across your Node-RED flows. Whether you revert to a previous version of a flow, roll back accidental changes, or track updates over time, FlowFuse ensures that you never lose critical work.
+
+To view the version history, navigate to your Node-RED Instance view and switch to the 'Version History' tab. Here, you’ll find two key sections:
+
+- Timeline: This section displays a timeline of who deployed, what is updated, and for which flow and when. Each deployment automatically creates a snapshot of your Node-RED instance. You can easily roll back to any previous version by clicking the three-dot icon on the right and selecting Restore Snapshot. You also have the option to compare the current version of your Node-RED instance with previous snapshots, download it, and more.
+
+![A screenshot displaying the version history timeline in FlowFuse, showing deployment snapshots and the ability to track and roll back changes in Node-RED instances.](./images/version-history-timeline.jpeg){data-zoomable}
+_A version history timeline shows deployment and changes made in flows, making it easy to track updates and revert to previous versions._
+
+Snapshots: The second tab, Snapshots, provides a clean, list-style interface that shows all available snapshots. Unlike the timeline view, this section focuses solely on snapshots without the detailed deployment history. You can upload or download snapshots and even create a snapshot of your instance at any time by clicking the Create Snapshot button.
+
+![A screenshot of the snapshots interface in FlowFuse, showing a list of available snapshots that can be restored or compared.](./images/version-history-snapshots.jpeg){data-zoomable}
+_The snapshots list interface in FlowFuse provides an organized view of all available snapshots for easy restoration or comparison._
+
+This version control functionality allows you to manage and recover Node-RED instances seamlessly, ensuring that your team can collaborate effectively without the risk of losing or overwriting important work.
+
+## **Shared Flow Library**
+
+When working on projects, it's common to develop reusable flows that can save time and effort for the entire team. For example, you might create a flow to calculate Overall Equipment Efficiency (OEE) or other valuable flows that can be reused across multiple projects.
+
+FlowFuse makes this process easy with the [Shared Flow Library](/docs/user/shared-library/). This feature allows owners and members to export significant flows and store them in a shared library, making them available to all team members. Once a flow is added to the library, anyone within the same team can import and use it in any Node-RED instance whenever needed.
+
+![A screenshot of the Shared Flow Library in FlowFuse, showing a list of flows available for import and reuse by team members in any Node-RED instance.](./images/shared-lib-import.jpeg){data-zoomable}
+_Shared Flow Library in FlowFuse displays a list of reusable flows that team members can import and use across multiple Node-RED instances._
+
+This shared approach streamlines development, eliminates redundant work, and ensures project consistency, ultimately saving time. Whether it’s a reusable function, a typical configuration, or a flow for recurring tasks, FlowFuse’s Shared Flow Library enables your team to easily access and integrate these resources, boosting productivity and fostering better collaboration.
+
+## **Audit Logs**
+
+Accountability is essential when multiple team members collaborate on complex industrial projects. FlowFuse offers comprehensive Audit Logs to track every action taken within the platform. This feature provides a detailed record of who made which changes, when those changes were made, and the specifics of each action.
+
+![A screenshot of the audit logs in FlowFuse, displaying detailed records of changes made by users, ensuring accountability and security within the platform.](./images/application-audit-logs.jpeg){data-zoomable}
+_Audit logs in FlowFuse, tracking every action taken within the platform to ensure accountability and transparency among team members._
+
+With Audit Logs, you can easily trace who deployed a flow, modified settings, or interacted with assets. This transparency ensures that all team members are accountable for their actions, enhancing security and reducing the risk of errors or unauthorized changes.
+
+Audit Logs are especially valuable for troubleshooting. They allow you to pinpoint when issues arise and identify who made changes that could have contributed to the problem, providing crucial context for resolution.
+
+For more information on using Audit Logs effectively, refer to our documentation on [Audit Logs in FlowFuse](/docs/user/logs/#audit-log).
+
+These are just a few of the features we’ve covered. FlowFuse has many more tools and capabilities that can further enhance collaboration, streamline workflows, and optimize your industrial operations.
+
+In summary, FlowFuse is a platform that streamlines collaboration on Node-RED projects. Centralizing your Node-RED instances, devices, and data ensures that everyone on your team is aligned and has access to the same resources. Features like real-time updates, role-based access, version control, and audit logs make collaborating easier, staying secure, and avoiding errors easier. Whether you're managing small flows or large-scale industrial systems, FlowFuse helps your team work together more efficiently and effectively.
+
+With FlowFuse, factories can achieve faster, safer, and more scalable collaboration on data pipelines, edge device management, and IT-OT integration.
+
+*Ready to Improve Your Manufacturing Team’s Collaboration?*
+
+Start using FlowFuse today to streamline your industrial projects, enhance teamwork, and securely manage your Node-RED instances.
+
+[Sign up now](https://flowfuse.com/signup) and experience the difference FlowFuse can make for your industrial environment and team.
+
+## *Up Next*
+
+Explore more resources and deepen your understanding of FlowFuse with these articles:
+
+- **[Managing Node-RED Instances in a Centralized Platform](/blog/2024/10/managing-node-red-instances-in-centralize-platfrom/)**
+ Learn how to effectively manage Node-RED instances in a centralized environment with FlowFuse, simplifying deployment and ensuring scalability.
+
+- **[Exploring FlowFuse Security Features](/blog/2024/10/exploring-flowfuse-security-features/)**
+ Discover the security tools and features built into FlowFuse to help protect your industrial data and keep your systems secure.
+
+- **[Building on FlowFuse: Working with Devices](/blog/2024/07/building-on-flowfuse-devices/)**
+ Dive into how FlowFuse supports device management, enabling you to build, deploy, and monitor edge devices more efficiently.
diff --git a/src/blog/2024/12/images/application-audit-logs.jpeg b/src/blog/2024/12/images/application-audit-logs.jpeg
new file mode 100644
index 0000000000..91c7fc5dc1
Binary files /dev/null and b/src/blog/2024/12/images/application-audit-logs.jpeg differ
diff --git a/src/blog/2024/12/images/application-wise-instance-organization.jpeg b/src/blog/2024/12/images/application-wise-instance-organization.jpeg
new file mode 100644
index 0000000000..71e96d9e34
Binary files /dev/null and b/src/blog/2024/12/images/application-wise-instance-organization.jpeg differ
diff --git a/src/blog/2024/12/images/bridging-modbus-data-to-mqtt.png b/src/blog/2024/12/images/bridging-modbus-data-to-mqtt.png
new file mode 100644
index 0000000000..09435d7b3b
Binary files /dev/null and b/src/blog/2024/12/images/bridging-modbus-data-to-mqtt.png differ
diff --git a/src/blog/2024/12/images/data-modeling-uns.png b/src/blog/2024/12/images/data-modeling-uns.png
new file mode 100644
index 0000000000..587deb4aeb
Binary files /dev/null and b/src/blog/2024/12/images/data-modeling-uns.png differ
diff --git a/src/blog/2024/12/images/edge-devices.jpeg b/src/blog/2024/12/images/edge-devices.jpeg
new file mode 100644
index 0000000000..6992af85f0
Binary files /dev/null and b/src/blog/2024/12/images/edge-devices.jpeg differ
diff --git a/src/blog/2024/12/images/flowfuse-mqtt-topic-hierarchy-monitoring.png b/src/blog/2024/12/images/flowfuse-mqtt-topic-hierarchy-monitoring.png
new file mode 100644
index 0000000000..d496134d26
Binary files /dev/null and b/src/blog/2024/12/images/flowfuse-mqtt-topic-hierarchy-monitoring.png differ
diff --git a/src/blog/2024/12/images/flowfuse-team-collaboration.png b/src/blog/2024/12/images/flowfuse-team-collaboration.png
new file mode 100644
index 0000000000..0a69af366a
Binary files /dev/null and b/src/blog/2024/12/images/flowfuse-team-collaboration.png differ
diff --git a/src/blog/2024/12/images/humidity-data-transformation.png b/src/blog/2024/12/images/humidity-data-transformation.png
new file mode 100644
index 0000000000..00eac78f2f
Binary files /dev/null and b/src/blog/2024/12/images/humidity-data-transformation.png differ
diff --git a/src/blog/2024/12/images/inviting-member-to-team.jpeg b/src/blog/2024/12/images/inviting-member-to-team.jpeg
new file mode 100644
index 0000000000..b0bcb1eea4
Binary files /dev/null and b/src/blog/2024/12/images/inviting-member-to-team.jpeg differ
diff --git a/src/blog/2024/12/images/list-of-instances.jpeg b/src/blog/2024/12/images/list-of-instances.jpeg
new file mode 100644
index 0000000000..aa5275bb9b
Binary files /dev/null and b/src/blog/2024/12/images/list-of-instances.jpeg differ
diff --git a/src/blog/2024/12/images/modbus-connection-config.png b/src/blog/2024/12/images/modbus-connection-config.png
new file mode 100644
index 0000000000..68284cf44a
Binary files /dev/null and b/src/blog/2024/12/images/modbus-connection-config.png differ
diff --git a/src/blog/2024/12/images/modbus-connection-configuration.png b/src/blog/2024/12/images/modbus-connection-configuration.png
new file mode 100644
index 0000000000..1e3fa6aca6
Binary files /dev/null and b/src/blog/2024/12/images/modbus-connection-configuration.png differ
diff --git a/src/blog/2024/12/images/modsim.png b/src/blog/2024/12/images/modsim.png
new file mode 100644
index 0000000000..469ffe3f48
Binary files /dev/null and b/src/blog/2024/12/images/modsim.png differ
diff --git a/src/blog/2024/12/images/mqtt-broker-config-node.png b/src/blog/2024/12/images/mqtt-broker-config-node.png
new file mode 100644
index 0000000000..db697ee2f5
Binary files /dev/null and b/src/blog/2024/12/images/mqtt-broker-config-node.png differ
diff --git a/src/blog/2024/12/images/mqtt-client-config-temperature.png b/src/blog/2024/12/images/mqtt-client-config-temperature.png
new file mode 100644
index 0000000000..1b791ba86f
Binary files /dev/null and b/src/blog/2024/12/images/mqtt-client-config-temperature.png differ
diff --git a/src/blog/2024/12/images/multiplayer-flowfuse.jpeg b/src/blog/2024/12/images/multiplayer-flowfuse.jpeg
new file mode 100644
index 0000000000..c724075d69
Binary files /dev/null and b/src/blog/2024/12/images/multiplayer-flowfuse.jpeg differ
diff --git a/src/blog/2024/12/images/pressure-data-transformation.png b/src/blog/2024/12/images/pressure-data-transformation.png
new file mode 100644
index 0000000000..8529d9805d
Binary files /dev/null and b/src/blog/2024/12/images/pressure-data-transformation.png differ
diff --git a/src/blog/2024/12/images/shared-lib-import.jpeg b/src/blog/2024/12/images/shared-lib-import.jpeg
new file mode 100644
index 0000000000..483f5da8df
Binary files /dev/null and b/src/blog/2024/12/images/shared-lib-import.jpeg differ
diff --git a/src/blog/2024/12/images/team-members-list.jpeg b/src/blog/2024/12/images/team-members-list.jpeg
new file mode 100644
index 0000000000..0a5350704a
Binary files /dev/null and b/src/blog/2024/12/images/team-members-list.jpeg differ
diff --git a/src/blog/2024/12/images/temperature-data-tranformation.png b/src/blog/2024/12/images/temperature-data-tranformation.png
new file mode 100644
index 0000000000..b3ebd2d005
Binary files /dev/null and b/src/blog/2024/12/images/temperature-data-tranformation.png differ
diff --git a/src/blog/2024/12/images/version-history-snapshots.jpeg b/src/blog/2024/12/images/version-history-snapshots.jpeg
new file mode 100644
index 0000000000..4a81c95c4a
Binary files /dev/null and b/src/blog/2024/12/images/version-history-snapshots.jpeg differ
diff --git a/src/blog/2024/12/images/version-history-timeline.jpeg b/src/blog/2024/12/images/version-history-timeline.jpeg
new file mode 100644
index 0000000000..443337aaca
Binary files /dev/null and b/src/blog/2024/12/images/version-history-timeline.jpeg differ
diff --git a/src/blog/2024/12/images/vibration-data-transformation.png b/src/blog/2024/12/images/vibration-data-transformation.png
new file mode 100644
index 0000000000..72628448fe
Binary files /dev/null and b/src/blog/2024/12/images/vibration-data-transformation.png differ
diff --git a/src/blog/2024/12/publishing-modbus-data-to-uns.md b/src/blog/2024/12/publishing-modbus-data-to-uns.md
new file mode 100644
index 0000000000..074aef926a
--- /dev/null
+++ b/src/blog/2024/12/publishing-modbus-data-to-uns.md
@@ -0,0 +1,258 @@
+---
+title: Publishing Modbus data to your UNS with FlowFuse
+subtitle: Bridging Modbus Data to MQTT using FlowFuse
+description: Learn how to bridge Modbus data to MQTT and publish it to a Unified Namespace (UNS) using FlowFuse for real-time monitoring and cloud integration.
+date: 2024-12-04
+authors: ["sumit-shinde"]
+image: /blog/2024/11/images/publishing-modbus-data-to-uns-using-ff.png
+keywords: modbus to mqtt, mqtt to modbus, node-red as gateway, bridging modbus to mqtt, modbus to uns, modbus data to unified namespace
+tags:
+ - flowfuse
+ - mqtt
+ - modbus
+ - uns
+---
+
+As industries evolve towards Industry 4.0, integrating legacy systems like Modbus with modern cloud technologies becomes essential. While effective for local machine-to-machine communication, Modbus doesn't naturally connect with cloud platforms.
+
+This article shows you how to bridge Modbus data to MQTT using FlowFuse and Node-RED. By publishing this data into a [Unified Namespace (UNS)](/solutions/uns/), you can seamlessly integrate legacy systems with cloud services for real-time monitoring and analysis, unlocking the full potential of your industrial data.
+
+
+
+If you haven’t built a Unified Namespace yet, please read our article on [building a UNS with FlowFuse](/blog/2024/11/building-uns-with-flowfuse/) and create your own in just 15 minutes.
+
+## The Importance of Bridging Modbus Data to MQTT for Cloud Integration and UNS
+
+Modbus has been a go-to protocol in industrial environments for a long time, providing reliable communication between devices like PLCs, sensors, and motors. It’s been essential for operational technology (OT) for decades. But as industries move towards Industry 4.0, there’s a growing need to connect older OT systems like Modbus with modern IT platforms, such as cloud systems and IoT applications. This is where the OT/IT gap becomes a challenge.
+
+While Modbus does a great job at local control and data collection, it has some limitations when it comes to cloud integration and real-time IoT solutions. Without a centralized approach, data often remains locked in silos—isolated within different systems and devices. That’s where a Unified Namespace (UNS) comes in. A UNS acts as a bridge to break down these data silos. It’s a centralized architecture that allows different systems to communicate seamlessly, no matter the underlying technology. By setting up a UNS, you can easily bring in data from various systems, including Modbus, and consolidate it into one accessible point.
+
+At FlowFuse, we support both Modbus and MQTT protocols, making it easy to integrate Modbus data into the UNS. We’ve chosen MQTT as the broker for our UNS because it’s lightweight, uses a pub-sub architecture, and is well-suited for real-time communication and cloud integration.
+
+Once the Modbus data is in the UNS, it can be used for real-time monitoring, predictive maintenance, and analytics. For instance, in a factory still running Modbus with older systems, data from machines like motors, pumps, and conveyors can be sent to the UNS. This means stakeholders can access that data in real time, gaining insights into machine performance and system health. By consolidating data that was once trapped in silos into one place, the UNS helps organizations streamline operations, make better decisions, and boost efficiency.
+
+## How to Bridge Modbus to MQTT
+
+Let's look at the steps to bridge Modbus data to MQTT using FlowFuse, leveraging Node-RED's capabilities. The process involves retrieving data from a Modbus device (For Practical example, we are using OpenSim to simulate Modbus data), transforming and processing the data (e.g., scaling raw sensor data into human-readable formats), and sending it to your Unified Namespace.
+
+![Bridging Modbus Data to MQTT using Node-RED](./images/bridging-modbus-data-to-mqtt.png){data-zoomable}
+_Bridging Modbus Data to MQTT using Node-RED_
+
+## Prequsite
+
+- A **Modbus data source**, such as an actual Modbus device or a simulator like ModSim.
+- A **FlowFuse account**, which enables you to create and deploy Node-RED instances securely on the cloud with a single click, collaborate on projects with your team, manage and monitor edge devices centrally, handle data pipelines efficiently, and leverage its integrated MQTT broker service for seamless UNS management, with an intuitive interface for securely managing clients.
+
+If you haven’t signed up for a FlowFuse account yet, do so now by clicking [sign up](https://app.flowfuse.com/account/create).
+
+### Step 1: Collect Data from Modbus Devices
+
+The first step is to collect data from your Modbus devices. To do this, you'll need to run Node-RED on your Device. If your Modbus device communicates via a serial port, Node-RED will need access to that port, which you can manage with the appropriate configuration. If you're using Modbus TCP and both Node-RED and your Modbus device are on the same network, the connection is straightforward.
+
+**Step 1.1: Running the FlowFuse device agent on your edge device**
+
+To run Node-RED on your edge device with just a few simple steps, you can use the [FlowFuse Device Agent](/docs/device-agent/quickstart/). This allows you to run Node-RED locally and also connect it to FlowFuse Cloud for remote monitoring and management, making it easier to keep track of your devices and workflows from anywhere.
+
+**Step 1.2: Install Modbus Nodes**
+
+While Node-RED doesn't include Modbus nodes by default, adding them to your palette is simple. Installing the necessary Modbus nodes from the Node-RED library will enable communication with your Modbus devices, whether they’re connected via serial or TCP. This step ensures you can start reading data from your Modbus devices and processing it for further integration.
+
+1. Open the **Palette Manager** by clicking the menu icon in the top-right corner of Node-RED and selecting **Palette Manager**.
+2. In the Palette Manager, search for `node-red-contrib-modbus` in the search bar.
+3. Click **Install** to add the Modbus nodes to your Node-RED environment.
+4. Once installed, the nodes appear in the left-side palette under the **Modbus** category. These nodes will allow you to interact with Modbus devices in your flow.
+
+**Step 1.3: Configure the Modbus Connection**
+
+Next, you'll need to configure the Modbus connection based on your device type. Modbus devices can communicate using two primary protocols: **Modbus RTU** (over serial) or **Modbus TCP** (over Ethernet/Wi-Fi). The specific choice depends on the type of Device you are working with.
+
+1. Drag a **Modbus Read** node onto your Node-RED Canvas.
+2. Double-click on the **Modbus Read** node to open its configuration.
+3. In the configuration window:
+ - Enter the **Unit ID** (this is the device address, typically **1**, but it may vary depending on your device).
+ - Choose the **Function** you need, such as **Read Holding Registers**, **Read Input Registers**, etc. (this depends on the type of data you want to read).
+ - Specify the **Start Address** (the address of the first register you want to start reading).
+ - Set the **Quantity** (the number of registers to read).
+ - Specify the **Poll Rate** (e.g., how often you want to collect data, such as every 1 second).
+4. In the **Server** field, click the **+** button to add a new Modbus server, and select the type.
+ - For **Modbus TCP**: Enter the **IP address** and **Port** (the default Modbus TCP port is **502**).
+ - For **Modbus RTU**: If you're using a serial connection, you'll need to specify the serial port (such as `/dev/ttyUSB0` on Linux or `COM1` on Windows), as well as the baud rate and other serial settings.
+ - Set the **Unit ID** (again, this should match the Unit ID you entered earlier).
+
+![Image showing Modbus node configuration for reading holding registers](./images/modbus-connection-configuration.png){data-zoomable}
+_Image showing Modbus node configuration for reading holding registers_
+
+![Image showing Modbus client node configuration](./images/modbus-connection-config.png){data-zoomable}
+_Image showing Modbus client node configuration_
+
+5. Once the connection details are filled in, click **Add** to save the configuration, then click **Done**.
+
+**Step 1.4: Test the Modbus Connection**
+
+After configuring the connection, it's time to test the data collection.
+
+1. Drag a **Debug** node onto the canvas.
+2. Connect the **Modbus Read** node's output to to the input of **Debug** node.
+3. Click **Deploy** in the top-right corner of Node-RED to deploy your flow.
+4. Open the **Debug Panel** on the right side of the Node-RED interface. If the connection is successful, you should see the raw data from your Modbus device in the Debug Panel.
+
+If no data appears, check the connection settings (IP address, Unit ID, port, etc.) and ensure your Modbus device is correctly configured and accessible. If you use a simulator like ModSim, ensure it’s running and properly configured to send data.
+
+For more information on using Modbus with Node-RED, please read our tutorial on [Using Modbus with Node-RED](/node-red/protocol/modbus/).
+
+### Step 2: Transforming Modbus Data for UNS
+
+After collecting data from your Modbus device, the next step is transforming it into a usable format for cloud-based IoT applications. Modbus data typically comes in raw register values, and you may need to convert these values into human-readable formats like temperature, pressure, or other measurements.
+
+Let's walk through the transformation process step by step.
+
+**Step 2.1: Parsing and Converting Raw Modbus Data**
+
+Modbus devices often return data in registers that need to be interpreted. For example, a temperature sensor might return a register value like 350, which represents 35.0°C if the sensor stores values in tenths of degrees.
+
+![The ModSim interface, generating simulated Modbus data](./images/modsim.png){data-zoomable}
+_The ModSim interface, generating simulated Modbus data_
+
+Here’s an example of the raw Modbus data I am receiving from ModSim: `[225, 1013, 29, 50, 603]`. These values represent the following:
+
+- `225`: Temperature (in tenths of degrees, which would be 22.5°C)
+- `1013`: Part 1 of the pressure value (higher register)
+- `29`: Part 2 of the pressure value (lower register)
+- `50`: Vibration (in tenths of degrees, which would be 5g)
+- `603`: Humidity (in tenths of degrees, which would be 60.3%)
+
+We must convert these raw register values into human-readable formats for cloud integration. For instance, we divide the temperature and vibration by 10 to get the actual values in degrees Celsius and g, respectively, and similarly for other parameters like humidity. For pressure, the higher and lower register values are combined to compute the complete value accurately.
+
+To determine how to process raw Modbus data, such as dividing by a specific value, concatenating, or applying other transformation formulas, refer to the manual of the sensor you use for specific instructions.
+
+In Node-RED, you can use various nodes for transformation. You can choose the [Function node](/node-red/core-nodes/function/) for advanced processing, the [Change node](/node-red/core-nodes/change/) for simpler operations, or the [Template node](/node-red/core-nodes/template/) for defining schemas. In this article, I will demonstrate a low-code approach using the Change node to process the data cleanly.
+
+Additionally, for better organization and accessibility, I will send each metric separately and include additional metadata such as the `timestamp` and `unit`.
+
+**For Temperature**:
+
+1. Drag a **Change** node onto the canvas.
+2. Double-click the node to open its configuration panel.
+3. Set the following in the **Set** rules:
+ - Set `msg.data` to `msg.payload`.
+ - Set `msg.payload` to `{}`.
+ - Set `msg.payload.timestamp` to the timestamp function of the Change node.
+ - Set `msg.payload.value` to `data[0] / 10`.
+ - Set `msg.payload.unit` to `'c'`.
+
+![Image showing the Change node rules transforming temperature data](./images/temperature-data-tranformation.png){data-zoomable}
+_Image showing the Change node rules transforming temperature data_
+
+4. Click **Done** to save the configuration.
+5. Connect the first output of the **Modbus Read** node to the input of this **Change** node.
+
+**For Pressure**:
+
+1. Drag another **Change** node onto the canvas.
+2. Double-click the node to open its configuration panel.
+3. Set the following in the **Set** rules:
+ - Set `msg.data` to `msg.payload`.
+ - Set `msg.payload` to `{}`.
+ - Set `msg.payload.timestamp` to the timestamp function of the Change node.
+ - Set `msg.payload.value` to `$number($string(data[1]) & $string(data[2]))` as a JSONata expression.
+ - Set `msg.payload.unit` to `'ppm'`.
+
+![Image showing the Change node rules transforming pressure data](./images/pressure-data-transformation.png){data-zoomable}
+_Image showing the Change node rules transforming pressure data_
+
+4. Click **Done** to save the configuration.
+5. Connect the first output of the **Modbus Read** node to the input of this **Change** node.
+
+**For Vibration**
+
+1. Drag another **Change** node onto the canvas.
+2. Double-click the node to open its configuration panel.
+3. Set the following in the **Set** rules:
+ - Set `msg.data` to `msg.payload`.
+ - Set `msg.payload` to `{}`.
+ - Set `msg.payload.timestamp` to the timestamp function of the Change node.
+ - Set `msg.payload.value` to `data[3] / 10` as a JSONata expression.
+ - Set `msg.payload.unit` to `'g'`.
+
+![Image showing the Change node rules transforming vibration data](./images/vibration-data-transformation.png){data-zoomable}
+_Image showing the Change node rules transforming vibration data_
+
+4. Click **Done** to save the configuration.
+5. Connect the first output of the **Modbus Read** node to the input of this **Change** node.
+
+**For Humidity**
+
+1. Drag another **Change** node onto the canvas.
+2. Double-click the node to open its configuration panel.
+3. Set the following in the **Set** rules:
+ - Set `msg.data` to `msg.payload`.
+ - Set `msg.payload` to `{}`.
+ - Set `msg.payload.timestamp` to the timestamp function of the Change node.
+ - Set `msg.payload.value` to `data[4] / 10` as a JSONata expression.
+ - Set `msg.payload.unit` to `'%'`.
+
+![Image showing the Change node rules transforming humidity data](./images/humidity-data-transformation.png){data-zoomable}
+_Image showing the Change node rules transforming humidity data_
+
+4. Click **Done** to save the configuration.
+5. Connect the first output of the **Modbus Read** node to the input of this **Change** node.
+
+Once you have configured and connected all the Change nodes, add a **Debug** node to each Change node's output to verify that the transformed data appears as expected. Deploy the flow, then check the output in the Debug Panel to ensure that each metric is correctly formatted with the appropriate timestamp, value, and unit.
+
+### Step 3: Send Data to an UNS
+
+After transforming the Modbus data into a human-readable format, the next step is to send it to a Unified Namespace (UNS). MQTT is one of the most popular choices for implementing a UNS because it is lightweight, efficient, and designed for real-time data transmission. Its low bandwidth requirements, message queuing capabilities, and secure and reliable communication support make it ideal for industrial IoT applications.
+
+**Step 3.1: Preparing MQTT Broker**
+
+FlowFuse simplifies the setup process by providing an integrated MQTT broker service for teams and enterprise users. This built-in service eliminates the need to set up an external broker. To use the FlowFuse MQTT broker, you need to create MQTT clients on the platform. These clients are secured with username and password authentication, ensuring only authorized devices can publish or subscribe to topics. For more details about the MQTT broker service provided by FlowFuse, refer to the [MQTT Broker Service Announcement](/blog/2024/10/announcement-mqtt-broker/).
+
+**To create MQTT clients:**
+
+1. Navigate to the FlowFuse platform and click "Broker" in the left sidebar.
+2. click the "Create Client" button in the newly opened interface.
+3. Enter a username and password for the client.
+4. Configure topic access control patterns if needed, specifying which topics the client can publish or subscribe to.
+5. Click "Save" to create the client.
+6. Once saved, copy the newly added client's Client ID from the list and save it for later use.
+
+**Step 3.2: Configure MQTT Nodes in Node-RED**
+
+1. In the Node-RED editor, drag the **mqtt out** node onto the canvas.
+2. Double-click the node, then click the **+** icon next to the **Server** field to configure your broker details:
+ - For FlowFuse MQTT, use `broker.flowfuse.cloud` as the server address.
+ - Enter the **Client ID**, **username**, and **password** that you generated earlier.
+
+![Image mqtt broker node configuration](./images/mqtt-broker-config-node.png){data-zoomable}
+_Image mqtt broker node configuration_
+
+3. Click **Add** to save the configuration.
+4. Select the appropriate **QoS** (Quality of Service) level based on your needs.
+5. Enter the Topic for the MQTT message, such as `plant2/Area4/Cell2/DeviceA/temperature`. This naming convention organizes data by plant, area, cell, and Device, following the ISA-95 equipment hierarchy. It is widely used across industries because it makes managing, filtering, and scaling your system easier. Additionally, this approach simplifies data segmentation and provides straightforward access when other parts of the IoT ecosystem need it.
+
+![Image showing the MQTT Out node configuration ](./images/mqtt-client-config-temperature.png){data-zoomable}
+_Image showing the MQTT Out node configuration_
+
+*Note: For the configuration of MQTT nodes and Modbus, environment variables are used to prevent accidental exposure when sharing. For more information, refer to [Using Environment Variables with Node-RED](/blog/2023/01/environment-variables-in-node-red/).*
+
+6. Click **Done** to save the node.
+7. Connect the output of the Change node, which is transforming the metrics you are sending via MQTT, to the mqtt out node.
+
+Repeat these steps for each metric (e.g., pressure, vibration, humidity), giving each one its own **mqtt out** node with a unique topic.
+
+For more information on using MQTT with Node-RED, please read [Using MQTT with Node-RED](/blog/2024/06/how-to-use-mqtt-in-node-red/).
+
+Once you’ve configured the MQTT nodes for all your metrics and deployed the flow, check the status at the bottom of each MQTT node. If it shows "connected," your Node-RED flow is successfully connected to the broker and publishes data to the UNS. From here, you can integrate the data with cloud-based analytics platforms. Build IoT dashboards with [FlowFuse Dashboard](https://dashboard.flowfuse.com/), or other systems to enable real-time monitoring, predictive maintenance, and automated decision-making. This setup effectively bridges the gap between legacy Modbus devices and modern IoT infrastructure, empowering smarter, more efficient industrial operations.
+
+To view the topic hierarchy in UNS, go to the FlowFuse platform, navigate to the Broker section, and click on the Hierarchy tab. The interface will look similar to the one shown below:
+
+![Image showing FlowFuse topic heirachy intergace for UNS](./images/flowfuse-mqtt-topic-hierarchy-monitoring.png){data-zoomable}
+_Image showing FlowFuse topic heirachy intergace for UNS_
+
+## Final Thought
+
+Bridging Modbus data to MQTT and publishing it to a Unified Namespace (UNS) is crucial in modernizing industrial systems. With FlowFuse, you can easily connect legacy Modbus devices to the cloud, enabling real-time monitoring, analytics, and predictive maintenance.
+
+FlowFuse offers a complete toolkit for building and managing your UNS. It combines MQTT for real-time communication, a robust data orchestration layer, and a centralized management platform for enterprise-level control. This unified approach simplifies the integration of devices, applications, and legacy systems, ensuring smooth data flow and delivering real-time insights across your organization.
+
+With FlowFuse, you can optimize industrial data workflows, improve decision-making, and unlock the full potential of your operational data, all while reducing complexity and enhancing system scalability.
diff --git a/src/blog/2024/12/why-uns-need-data-modeling.md b/src/blog/2024/12/why-uns-need-data-modeling.md
new file mode 100644
index 0000000000..d2f1056b2d
--- /dev/null
+++ b/src/blog/2024/12/why-uns-need-data-modeling.md
@@ -0,0 +1,137 @@
+---
+title: "Data Modeling: The Key to a Successful Unified Namespace"
+subtitle: Why data modeling is key to making your Unified Namespace work effectively.
+description: Discover why data modeling is crucial for a Unified Namespace (UNS) in manufacturing and how it helps organize and make data actionable.
+date: 2024-12-16
+authors: ["sumit-shinde"]
+image: /blog/2024/12/images/data-modeling-uns.png
+keywords: uns, data modeling, why uns needs data modeling, unified namespace
+tags:
+ - flowfuse
+ - unified-namespace
+ - data modeling
+---
+
+In manufacturing, data flows from various sources—machines, sensors, enterprise systems, and more. A [Unified Namespace (UNS)](/solutions/uns/) brings all this data into a central hub. However, centralizing data isn't enough to truly call it a UNS. It's not just about aggregating information. A true UNS goes beyond being a data repository; it organizes, structures, and contextualizes that data, transforming it into something valuable and actionable for your business.
+
+
+
+By applying a solid data model, you can turn scattered, unstructured data into a cohesive, meaningful system that supports better decision-making and drives operational improvements. Let's explore what data modeling is, why it is crucial for making your UNS function effectively, and how it turns scattered data into valuable insights.
+
+*At its core, **data modeling** is designing how data will be structured, organized, and stored within the UNS. It’s about creating a blueprint or framework that defines the relationships between different data points, ensuring they’re logically structured, easily accessible, and aligned with the business's needs.*
+
+A solid data model forms the foundation for understanding and using data effectively. It addresses essential questions like:
+
+- **How should data be represented?** – What formats, units, or categories should be used to express the data?
+- **When is it captured, and what does it represent?** – Is it sensor data, performance metrics, or supply chain information? When was it recorded, and what is its context?
+
+The data model can vary significantly from business to business, depending on the use case. For example, in manufacturing, if a device is sending sensor metrics to a UNS, the data could look like this:
+
+```json
+{
+ "timestamp": "2024-09-19T12:33:46.6035772+02:00",
+ "machineId": "press_001",
+ "manufacturer": "XYZ Corp",
+ "model": "MPX-5000",
+ "sensors": [
+ {
+ "name": "vibration",
+ "value": 1.5,
+ "unit": "mm/s"
+ },
+ {
+ "name": "temperature",
+ "value": 72.4,
+ "unit": "Celsius"
+ },
+ {
+ "name": "pressure",
+ "value": 3.8,
+ "unit": "Bar"
+ }
+ ]
+}
+```
+
+Alternatively, a simpler model might look like this:
+
+```json
+{
+ "timestamp": "2024-09-19T12:33:46+02:00",
+ "machine": "press_001",
+ "vibration": { "value": 1.5, "unit": "mm/s" },
+ "temperature": { "value": 72.4, "unit": "Celsius" },
+ "pressure": { "value": 3.8, "unit": "Bar" }
+}
+```
+
+In both examples, the data is structured with critical elements like timestamps, machine identifiers, sensor readings, and units of measurement. The crucial difference between the two models lies in the level of detail, but both demonstrate how a well-defined data modeling adds immediate value. Organizing data clearly and consistently ensures its accuracy and enables it to be easily analyzed, integrated, and acted upon.
+
+Now that you have a basic understanding of what data modeling is Let’s take a deep dive into why data modeling is essential to unlocking the full potential of your UNS:
+
+### **1. Ensures Data Consistency and Standardization**
+
+As mentioned earlier, data is generated from various sources in manufacturing, including machines, sensors, ERP systems, and inventory management tools. Each source may provide data in different formats, units of measurement, or naming conventions.
+
+For example, one machine might report temperature in Celsius, while another uses Fahrenheit. Some systems might track production rates in pieces per hour, while others use units per minute. These inconsistencies can create confusion and lead to errors in a computerized structure.
+
+Data modeling addresses this issue by establishing clear standards for how data should be structured and labeled. It ensures uniform temperature, unit, and measurement formats across all systems. For example, a data model might require recording all temperature readings in Celsius and production rates in pieces per hour. This consistency simplifies data analysis from diverse sources and ensures that the system functions reliably and accurately.
+
+### **2. Gives Data Meaning**
+
+Raw data on its own is just numbers—isolated and incomplete. For example, a temperature reading of 72.4°C or a vibration level of 1.5 mm/s doesn’t tell much without the proper context. This is where data modeling truly adds value. A data model turns simple measurements into meaningful insights by organizing data that includes critical details like timestamps, data sources, and relationships between data points.
+
+Contextualizing data means understanding when it was captured, where it came from, and what it’s related to. A timestamp helps track trends over time, such as detecting a gradual temperature rise that could signal an issue before it becomes critical. Knowing the data source—whether it’s a specific machine or sensor—enables targeted troubleshooting and ensures that the right teams are working with the right data. Data modeling also links data points, like correlating vibration and temperature readings, to identify potential equipment failures. This structure makes data far more accessible and actionable, allowing teams to make informed, real-time decisions, prevent unplanned downtime, and drive process improvements.
+
+In summary, data modeling transforms raw data into actionable insights, helping you understand what is happening in your operation, when it started, where it is occurring, and how to address it effectively.
+
+### **3. Facilitates Data Interoperability and Integration**
+
+In manufacturing, various devices and systems generate data in different formats and use distinct communication protocols, making integrating and utilizing this data effectively challenging.
+
+For example, PLCs may use one protocol, while SCADA systems or MES may rely on entirely different ones. This lack of consistency complicates consolidating data and extracting meaningful insights. Integrating other systems often requires addressing discrepancies in how data is structured and labeled. For instance, multiple sensors on a production line might send data in various formats or label the same metric differently. One sensor might label temperature as "temp," another as "temperature," and yet another as "T1." These inconsistencies can lead to errors or failures in integrated systems, such as monitoring tools that depend on consistent data labeling to function correctly.
+
+This is where data modeling becomes essential. It creates a standard structure for organizing and labeling data, ensuring that different systems can "speak the same language" and integrate seamlessly.
+
+For example, in a predictive maintenance system, sensor data such as temperature and vibration can be used to predict potential machine failures. With the right data model, this sensor data can be directly linked to your CMMS (Computerized Maintenance Management System), regardless of how many sensors are involved or added over time. Since engineers understand the standardized data structure, they can easily integrate the CMMS with minimal effort. This integration automatically triggers maintenance alerts and work orders, helping to prevent downtime without requiring manual intervention.
+
+### **4. Enables Easy Access and Time Savings**
+
+Disorganized data wastes time and resources in manufacturing. A transparent data model makes essential information easy for troubleshooting, performance checks, and decision-making tasks.
+
+With a standardized system, figuring out confusing labels or complex data is unnecessary. A consistent data model organizes information, helping operators respond faster, reduce downtime, and minimize errors.
+
+Quick access to accurate data speeds up decision-making, cuts downtime, and improves efficiency, leading to cost savings.
+
+### **5. Scalability and Continuous Improvement**
+
+A well-structured data model serves the needs of your current manufacturing operations and lays the groundwork for future growth and continuous improvement. As your production processes evolve or new technologies and data sources come online, a good data model allows your UNS to adapt without disrupting existing systems.
+
+For example, as you add new machines, automated production lines, or advanced sensors to your operations, the data model ensures that these new elements integrate smoothly into the existing framework. It maintains consistency, enabling new data points to be mapped easily while keeping the system organized and efficient.
+
+
+
+With all these benefits in mind, the next step is to consider how to implement data modeling effectively. Data modeling is a much deeper, more dynamic process that can reshape how you use data across your entire business. It's not only about structuring and integrating data but also about transforming your operations, unlocking new efficiencies, and driving growth. The right platform can help you go beyond essential organization and truly harness the power of your data.
+
+## **Leverage FlowFuse for Effective Data Modeling in Your UNS**
+
+[FlowFuse](/) makes building and managing a Unified Namespace (UNS) simple and efficient. It connects IT and OT systems, streamlines workflows, and transforms raw data into meaningful insights. With FlowFuse, you can:
+
+- **Connect**: Integrate various services, hardware, and APIs effortlessly.
+- **Collect**: Aggregate data from machines, sensors, and other sources.
+- **Transform**: Easily standardize and add context to raw data, making it more meaningful and usable across your systems.
+- **Visualize**: Create dashboards with a low-code approach to monitor and analyze your operations.
+
+Learn how to build your UNS in just 15 minutes with [this article](/blog/2024/11/building-uns-with-flowfuse/).
+
+FlowFuse uses Node-RED, an open-source low-code platform, to turn unstructured data into organized, actionable models. Its ability to transform and contextualize data ensures consistency and clarity, helping you get the most value from your data.
+
+With support for over 5,000 community nodes and protocols like MQTT, OPC-UA, and Modbus, FlowFuse simplifies connecting systems and unifying data.
+
+Check out [this article](/blog/2023/12/unified-namespace-data-modelling/) to see how FlowFuse makes data modeling easier.
+
+FlowFuse also offers enterprise-grade features to manage edge devices and Node-RED instances, helping you scale, collaborate, and stay compliant.
+
+**Take Control of Your Data with FlowFuse**
+
+Want to make the most of your data? [Let’s talk!]( /book-demo/) Our team is ready to help you set up a Unified Namespace (UNS) that fits your needs.
diff --git a/src/blog/2024/2024.json b/src/blog/2024/2024.json
index 75541c8441..281a18fae9 100644
--- a/src/blog/2024/2024.json
+++ b/src/blog/2024/2024.json
@@ -2,5 +2,7 @@
"tags": [
"posts"
],
- "layout": "layouts/post.njk"
-}
\ No newline at end of file
+ "layout": "layouts/post.njk",
+ "nav": "blog",
+ "searchTitle": "Blog"
+}
diff --git a/src/blog/uns.njk b/src/blog/uns.njk
new file mode 100644
index 0000000000..675ddb3590
--- /dev/null
+++ b/src/blog/uns.njk
@@ -0,0 +1,13 @@
+---
+layout: nohero
+sitemapPriority: 0.8
+pagination:
+ data: collections.unified-namespace
+ size: 19 # creates a nice matrix (1 header, 18 left: 3 on 6 rows)
+ alias: posts
+ reverse: true
+meta:
+ title: Unified Namespace (UNS) - Blog
+---
+
+{% include "blog/template.njk" %}
\ No newline at end of file
diff --git a/src/blueprints.njk b/src/blueprints.njk
index cddbfa03e5..b23077f138 100644
--- a/src/blueprints.njk
+++ b/src/blueprints.njk
@@ -1,11 +1,15 @@
---
-layout: nohero
+layout: default
sitemapPriority: 0.9
pagination:
data: collections.blueprints
size: 12
alias: blueprints
reverse: true
+title: Blueprint Library
+description:
+ Explore FlowFuse Blueprints, choose templates for quick setups, perfect for learning and fast solution-building.
+ Customizable for unique needs. Simplify your Node-RED projects with FlowFuse Blueprints!
meta:
title: Blueprints Library
---
diff --git a/src/blueprints/submit.njk b/src/blueprints/submit.njk
new file mode 100644
index 0000000000..489d349242
--- /dev/null
+++ b/src/blueprints/submit.njk
@@ -0,0 +1,52 @@
+---
+layout: default
+title: Submit Your Blueprint
+description:
Share your Blueprints to help the FlowFuse community build a best-in-class library of commercially useful content and build recognition of your company as top Node-RED experts.
We are accepting submissions of Blueprints that are commercially valuable and professionally well-constructed. Submissions will be reviewed by the FlowFuse team. Accepted submissions will be featured on the Blueprints page with acknowledgement of the company that authored the Blueprint.
+sitemapPriority: 0.7
+pagination:
+ data: collections.blueprints
+ size: 3
+ alias: blueprints
+ reverse: true
+meta:
+ description: Submit your own Blueprints for publishing in the FlowFuse Blueprint Library
+hubspot:
+ script: "hubspot/hs-form.njk"
+ formId: c627fbcb-a3e0-46dd-978b-122461b7835c
+ cta: "blueprint-upload"
+ reference: "blueprint-upload"
+---
+
+
+
+
+
{{ title }}
+
Share your Blueprints to help the FlowFuse community build a best-in-class library of commercially useful content and build recognition of your company as top Node-RED experts.
+
We are accepting submissions of Blueprints that are commercially valuable and professionally well-constructed.
Submissions will be reviewed by the FlowFuse team.
+
Accepted submissions will be featured on the Blueprints page with acknowledgement of the company that authored the Blueprint.
+
+
+
+ {% include hubspot.script %}
+
+
+
+
+
+
Existing Blueprints
+
Here are a few examples of Blueprints from our collection. You can take a look at the full collection in our Blueprint Library
\ No newline at end of file
diff --git a/src/book-demo.njk b/src/book-demo.njk
index 21d3acc632..f2b042422e 100644
--- a/src/book-demo.njk
+++ b/src/book-demo.njk
@@ -1,8 +1,8 @@
---
layout: layouts/mql-contact.njk
title: Book a demo
-subtitle: Discover the power of FlowFuse for Node-RED projects!
-description: Book a software demo to better understand how to supercharge your workflow with high availability, enhanced data manipulation, and simplified automation. Book now for efficient Node-RED deployments!
+subtitle: Get customised advice and recommendations to ensure you get the most out of FlowFuse
+description: Tap into our expertise to optimise operations, improve collaboration, and ensure compliance for your Node-RED solutions without any pressure or commitment.
sitemapPriority: 0.8
image: /images/og-book-demo.jpeg
meta:
diff --git a/src/changelog/2023/2023.json b/src/changelog/2023/2023.json
index c77695daa8..b83e738596 100644
--- a/src/changelog/2023/2023.json
+++ b/src/changelog/2023/2023.json
@@ -2,5 +2,7 @@
"tags": [
"changelog"
],
- "layout": "layouts/post-changelog.njk"
+ "layout": "layouts/post-changelog.njk",
+ "nav": "changelog",
+ "searchTitle": "Changelog"
}
diff --git a/src/changelog/2024/10/device-group-env-vars.md b/src/changelog/2024/10/device-group-env-vars.md
new file mode 100644
index 0000000000..e6e15594af
--- /dev/null
+++ b/src/changelog/2024/10/device-group-env-vars.md
@@ -0,0 +1,19 @@
+---
+title: Environment Variables for your Device Groups
+description: "Set Environment Variables in your Device Groups for its member devices to utilize"
+date: 2024-10-21 13:00:00.0
+
+authors: ["stephen-mclaughlin"]
+tags:
+ - changelog
+---
+
+We have added the ability to set Environment Variables on a Device Group.
+This allows you to set common values that all member devices can make use of.
+
+![Screenshot showing Device Group Environment Variables](images/device-group--with-env-vars.png){data-zoomable}
+_Screenshot showing Device Group Environment Variables_
+
+We hope this feature will make it easier to manage your devices and keep your configuration in one place.
+
+See the [Device Group](https://flowfuse.com/docs/user/device-groups) documentation for more information on how to set environment variables for your device groups.
diff --git a/src/changelog/2024/10/images/bulk-notifications.png b/src/changelog/2024/10/images/bulk-notifications.png
new file mode 100644
index 0000000000..309e810b01
Binary files /dev/null and b/src/changelog/2024/10/images/bulk-notifications.png differ
diff --git a/src/changelog/2024/10/images/device-group--with-env-vars.png b/src/changelog/2024/10/images/device-group--with-env-vars.png
new file mode 100644
index 0000000000..f82f7f2938
Binary files /dev/null and b/src/changelog/2024/10/images/device-group--with-env-vars.png differ
diff --git a/src/changelog/2024/10/images/snapshot-download--with-options.png b/src/changelog/2024/10/images/snapshot-download--with-options.png
new file mode 100644
index 0000000000..558eec1469
Binary files /dev/null and b/src/changelog/2024/10/images/snapshot-download--with-options.png differ
diff --git a/src/changelog/2024/10/images/snapshot-upload--with-options.png b/src/changelog/2024/10/images/snapshot-upload--with-options.png
new file mode 100644
index 0000000000..e5046da8cd
Binary files /dev/null and b/src/changelog/2024/10/images/snapshot-upload--with-options.png differ
diff --git a/src/changelog/2024/10/images/version-history-snapshots.png b/src/changelog/2024/10/images/version-history-snapshots.png
new file mode 100644
index 0000000000..5cbc4fd566
Binary files /dev/null and b/src/changelog/2024/10/images/version-history-snapshots.png differ
diff --git a/src/changelog/2024/10/images/version-history-timeline.png b/src/changelog/2024/10/images/version-history-timeline.png
new file mode 100644
index 0000000000..79140804e2
Binary files /dev/null and b/src/changelog/2024/10/images/version-history-timeline.png differ
diff --git a/src/changelog/2024/10/mqtt-service.md b/src/changelog/2024/10/mqtt-service.md
new file mode 100644
index 0000000000..0da5bec664
--- /dev/null
+++ b/src/changelog/2024/10/mqtt-service.md
@@ -0,0 +1,17 @@
+---
+title: MQTT Broker Service
+description: "Generic MQTT Broker Service"
+date: 2024-10-24 13:00:00.0
+authors: ["ben-hardill"]
+tags:
+ - changelog
+ - mqtt
+---
+
+To celebrate 25 years since the first release of the MQTT Specification we are happy announce a new MQTT Broker Service as part of FlowFuse Cloud.
+
+The initial deployment is available to Enterprise Teams and allows up to 20 clients to connect to the broker. Each team has their own independent topic space and can set their own topic ACLs to control what clients can access.
+
+From today, this feature is available to FlowFuse Cloud Enterprise Teams. We'll be bringing it to Self-Hosted customers in the near future, as well as adding the ability to purchase additional packs of clients.
+
+See the [broker documentation](https://flowfuse.com/docs/cloud/introduction/#enterprise-team-broker) for more details.
\ No newline at end of file
diff --git a/src/changelog/2024/10/notifications-bulk-actions.md b/src/changelog/2024/10/notifications-bulk-actions.md
new file mode 100644
index 0000000000..e47fcce7d0
--- /dev/null
+++ b/src/changelog/2024/10/notifications-bulk-actions.md
@@ -0,0 +1,15 @@
+---
+title: Managing Notifications
+description: "Interact with notifications"
+date: 2024-10-04 10:00:00.0
+
+authors: ["serban-costin"]
+tags:
+ - changelog
+---
+
+We have now added the ability to manage notifications in bulk. This allows users to select more than one notification so that they can be marked as read, or marked as unread, all in one go.
+
+We hope this small improvement saves you bundle of clicks and streamlines your operations.
+
+![bulk-notifications.png](images/bulk-notifications.png)
diff --git a/src/changelog/2024/10/snapshot-download-upload-options.md b/src/changelog/2024/10/snapshot-download-upload-options.md
new file mode 100644
index 0000000000..1c64808b9c
--- /dev/null
+++ b/src/changelog/2024/10/snapshot-download-upload-options.md
@@ -0,0 +1,34 @@
+---
+title: Snapshot Upload and Download Improvements
+description: "Components of a what to include in a snapshot can now be selected."
+date: 2024-10-14 13:00:00.0
+
+authors: ["stephen-mclaughlin"]
+tags:
+ - changelog
+---
+
+We have added the ability to select which components of a snapshot you want to keep when downloading or uploading a snapshot.
+
+The options available are:
+* Flows: Include the flows of the snapshot
+* Credentials: Include the credentials of the snapshots flows
+* Environment Variables
+ * Keys and Values: Include the keys and values of the environment variables
+ * Keys Only: Include only the keys of the environment variables
+
+
+![Screenshot showing snapshot download component options](images/snapshot-download--with-options.png){data-zoomable}
+_Screenshot showing snapshot download component options_
+
+
+![Screenshot showing snapshot upload component options](images/snapshot-upload--with-options.png){data-zoomable}
+_Screenshot showing snapshot upload component options_
+
+
+This feature can help you be specific about what you want to include in a downloaded snapshot. This is especially useful when
+you want to share a snapshot with others, but don't want to include sensitive information like credentials. Also,
+when you receive a snapshot that needs importing into a different FlowFuse platform or team, you can can now be selective
+about what to keep and what to exclude.
+
+See the [Snapshots](https://flowfuse.com/docs/user/snapshots) documentation for more information.
diff --git a/src/changelog/2024/10/version-history-timeline.md b/src/changelog/2024/10/version-history-timeline.md
new file mode 100644
index 0000000000..4be82a9162
--- /dev/null
+++ b/src/changelog/2024/10/version-history-timeline.md
@@ -0,0 +1,23 @@
+---
+title: Version History Timeline
+description: "Components of a what to include in a snapshot can now be selected."
+date: 2024-10-24 13:00:00.0
+
+authors: ["serban-costin"]
+tags:
+ - changelog
+---
+
+Instances can now make use of the new Timeline feature, providing a concise, chronological view of key activities within your Node-RED instance.
+
+The Timeline tracks important events such as pipeline stage deployments, snapshot restorations, flow deployments, snapshot creations, and updates to instance settings, offering clear insight into when and what changes have been made.
+
+The Timeline and Snapshots are now grouped together under the Version History tab, simplifying the navigation of your instance's history.
+
+This feature is only available to Enterprise license and Cloud Team users. Note that the Timeline can only be accessed at the instance level.
+
+![Screenshot showing the version history Timeline](images/version-history-timeline.png){data-zoomable}
+_Screenshot showing the new version history timeline_
+
+![version-history-snapshots.png](images/version-history-snapshots.png){data-zoomable}
+_Screenshot showing the relocated snapshot page under the version history tab_
diff --git a/src/changelog/2024/11/audit-log-hierarchy.md b/src/changelog/2024/11/audit-log-hierarchy.md
new file mode 100644
index 0000000000..54b7ff1978
--- /dev/null
+++ b/src/changelog/2024/11/audit-log-hierarchy.md
@@ -0,0 +1,17 @@
+---
+title: Audit logs show hierarchical events
+description: "Audit logs for Team, Application and Instance will now include child events"
+date: 2024-11-20 13:00:00.0
+
+authors: ["stephen-mclaughlin"]
+tags:
+ - changelog
+---
+
+In FlowFuse V2.11, we have updated the Audit Log views to let you see more of the events happening within your team. Previously, the Audit Log view would only show you top-level events happening to the application or team. With this release, it now provides an aggregated view of all of your resources.
+Additionally, each row contains an icon and name of the item raised the event that you can click to navigate straight to it making your workflow more streamlined.
+
+![Screenshot showing Audit Log with hierarchical events](images/audit-log-child-events.png)
+_Screenshot showing Audit Log with hierarchical events_
+
+We hope this feature will help you better understand and navigate your FlowFuse applications.
\ No newline at end of file
diff --git a/src/changelog/2024/11/device-agent-release.md b/src/changelog/2024/11/device-agent-release.md
new file mode 100644
index 0000000000..c336f0453e
--- /dev/null
+++ b/src/changelog/2024/11/device-agent-release.md
@@ -0,0 +1,19 @@
+---
+title: Device Agent 3.0 released
+description: "New version of the Device Agent drops support for old Node.js versions"
+date: 2024-11-08 13:00:00.0
+
+authors: ["nick-oleary"]
+tags:
+ - changelog
+---
+
+The FlowFuse Device Agent is the piece of software we provide to manage Node-RED instances running anywhere outside of the FlowFuse platform.
+
+Today we have released the latest version of the agent that now requires at least Node.js 18 to run. To reflect this change, we are releasing this as a new major version - 3.0.
+
+We recognise that software update lifecycles can be a challenge in some environments. This is why we've held off dropping support for older Node.js versions for as long as we could. However, we have to balance that against ensuring we continue to keep the Device Agent up to date with the latest security fixes.
+
+If your devices cannot be updated to the latest Node.js versions, then please ensure you stay on the 2.x release of the Device Agent until a time that you are able to update Node.js.
+
+Details for upgrading to this release are available [in the documentation](https://flowfuse.com/docs/device-agent/install/#upgrading-the-agent).
diff --git a/src/changelog/2024/11/images/audit-log-child-events.png b/src/changelog/2024/11/images/audit-log-child-events.png
new file mode 100644
index 0000000000..8d7afc9945
Binary files /dev/null and b/src/changelog/2024/11/images/audit-log-child-events.png differ
diff --git a/src/changelog/2024/11/images/screenshot-mqtt-hierarchy.png b/src/changelog/2024/11/images/screenshot-mqtt-hierarchy.png
new file mode 100644
index 0000000000..a9f6c96690
Binary files /dev/null and b/src/changelog/2024/11/images/screenshot-mqtt-hierarchy.png differ
diff --git a/src/changelog/2024/11/images/screenshot-search.png b/src/changelog/2024/11/images/screenshot-search.png
new file mode 100644
index 0000000000..c30c9a90c9
Binary files /dev/null and b/src/changelog/2024/11/images/screenshot-search.png differ
diff --git a/src/changelog/2024/11/mqtt-topic-hierarchy.md b/src/changelog/2024/11/mqtt-topic-hierarchy.md
new file mode 100644
index 0000000000..1cec2b948c
--- /dev/null
+++ b/src/changelog/2024/11/mqtt-topic-hierarchy.md
@@ -0,0 +1,18 @@
+---
+title: MQTT Topic Hierarchy view
+description: "View your in-use MQTT topics"
+date: 2024-11-21 10:00:00.0
+
+authors: ["nick-oleary"]
+tags:
+ - changelog
+---
+
+Having recently added [our very own MQTT Service](/blog/2024/10/announcement-mqtt-broker) to the platform, we're continuing to expand on the features and tools we provide to help teams build their solutions.
+
+We have added a view that shows you what MQTT topics are being used on the Team Broker. This helps give you clarity on the structure of your topic-space, whether you're using the MQTT Broker for a unified namespace (UNS) or any other use case.
+
+This is a small iteration of the feature but we'll have lots more to come.
+
+![Screenshot of the UI to explore your MQTT topic hierarchy](./images/screenshot-mqtt-hierarchy.png){data-zoomable}
+_Screenshot of the UI to explore your MQTT topic hierarchy_
diff --git a/src/changelog/2024/11/team-search.md b/src/changelog/2024/11/team-search.md
new file mode 100644
index 0000000000..f40299bed1
--- /dev/null
+++ b/src/changelog/2024/11/team-search.md
@@ -0,0 +1,18 @@
+---
+title: Team-wide search
+description:
+date: 2024-11-21 13:00:00.0
+
+authors: ["nick-oleary"]
+tags:
+ - changelog
+---
+
+A new search bar has been added that makes it quick and easy to find resources within your team.
+
+This expands on the search available on the Applications summary view - but by moving to the top header, it's now available on all pages.
+
+For this release, it searches your Applications, Instances and Devices. We'll be expanding its coverage in future iterations to include other resources in the team.
+
+![Screenshot of the team-wide search](./images/screenshot-search.png){data-zoomable}
+_Screenshot of the team-wide search_
diff --git a/src/changelog/2024/12/images/team-bom.png b/src/changelog/2024/12/images/team-bom.png
new file mode 100644
index 0000000000..671aed059e
Binary files /dev/null and b/src/changelog/2024/12/images/team-bom.png differ
diff --git a/src/changelog/2024/12/images/team-pipeline.png b/src/changelog/2024/12/images/team-pipeline.png
new file mode 100644
index 0000000000..422dc034df
Binary files /dev/null and b/src/changelog/2024/12/images/team-pipeline.png differ
diff --git a/src/changelog/2024/12/team-bom-timeline.md b/src/changelog/2024/12/team-bom-timeline.md
new file mode 100644
index 0000000000..4942c8a0c7
--- /dev/null
+++ b/src/changelog/2024/12/team-bom-timeline.md
@@ -0,0 +1,20 @@
+---
+title: Team BOM and Pipeline Views
+description:
+date: 2024-12-16 13:00:00.0
+authors: ["ben-hardill"]
+tags:
+ - changelog
+---
+
+Team-level views of all Pipelines and Bill of Materials have been added to provide a complete overview.
+
+The Bill of Materials view shows which components and their versions across all Node-RED Devices & Instances in the whole Team rather than at an Application level.
+
+![Team BOM view](./images/team-bom.png){data-zoomable}
+_Team BOM view_
+
+Similarly the Team Pipeline view shows all CI delivery pipelines in all the Applications in the Team, giving team members a quicker way to jump to a specific Pipeline.
+
+![Team Pipelines](./images/team-pipeline.png){data-zoomable}
+_Team Pipelines_
\ No newline at end of file
diff --git a/src/changelog/2024/2024.json b/src/changelog/2024/2024.json
index c77695daa8..b83e738596 100644
--- a/src/changelog/2024/2024.json
+++ b/src/changelog/2024/2024.json
@@ -2,5 +2,7 @@
"tags": [
"changelog"
],
- "layout": "layouts/post-changelog.njk"
+ "layout": "layouts/post-changelog.njk",
+ "nav": "changelog",
+ "searchTitle": "Changelog"
}
diff --git a/src/contact-us.njk b/src/contact-us.njk
index abf3342410..9250e23ecc 100644
--- a/src/contact-us.njk
+++ b/src/contact-us.njk
@@ -1,7 +1,7 @@
---
layout: layouts/mql-contact.njk
title: Contact us
-description:
Thank you for your interest in FlowFuse! Share your info, and our sales team will reach out to discuss tailored solutions for your business-critical applications.
+description:
Please fill out the form below, and we’ll get in touch shortly.
+ FlowFuse is your partner in teaching engineering, IoT, development, OT/IT integration, and automation to your students. FlowFuse offers a comprehensive suite of tools and resources for accredited educational institutions to accelerate learning, teaching, and research in Node-RED and industrial automation.
+
- FlowFuse is your partner in teaching engineering, IoT, development, OT/IT integration, and automation to your students. Free for educators and students. Contact us for an educational license.
+ Instructors and educational administrators are invited to contact us for an educational license, which will supply you and your students with 5 free months of FlowFuse Cloud Starter.
-Note alterations to the following agreement are only accepted on the Enterprise
-tier.
-
-{% include hubspot.script %}
+
Subscription Agreement
diff --git a/src/handbook/customer/sales/subscription-agreement-1.5.njk b/src/handbook/customer/sales/subscription-agreement-1.5.njk
new file mode 100644
index 0000000000..3d55f27004
--- /dev/null
+++ b/src/handbook/customer/sales/subscription-agreement-1.5.njk
@@ -0,0 +1,525 @@
+---
+# Note: Do not delete this file. It's still referenced in contracts and quotes.
+navTitle: Subscription Agreement 1.5
+navGroup: Customer Department
+hubspot:
+ script: "hubspot/hs-form.njk"
+ formId: "f5a6441c-63a5-4a4a-b676-87aab37df998"
+ cta: "subscription-agreement"
+ reference: "subscription-agreement"
+---
+
+
Below if the FlowFuse subscription agreement that applies to all self-hosted
+ installations. If you'd like to make alterations for your organisation, please
+ download the .docx file in the following form and initiate the legal part of
+ the negotiation through your account executive.
+
+
Note alterations to the following agreement are only accepted on the Enterprise tier.
+
+{% include hubspot.script %}
+
+
Subscription Agreement
+
+
+This Subscription Agreement (“Agreement”) is between FlowFuse Inc. DBA FlowFuse with offices at 548 Market St
+
+
+PMB 24889, San Francisco, California 94104-5401 (or, if a different corporate entity is listed as “FlowFuse” on an Quote [as defined below], (“FlowFuse”), and the individual or entity signing or electronically accepting this Agreement, or any Quote that references this Agreement (“Customer”). This Agreement is entered into on the earlier of, (a) Customer clicking “Agree” or “Yes” to the terms of this Agreement to gain initial access to, or use of, the Software, (b) FlowFuse and Customer agreeing to an Quote referencing this Agreement, or (c) Customer is given access to the Software (“Effective Date”).
+
+
+
+
Individual Signing on Behalf of Company. IF THE INDIVIDUAL ACCEPTING THIS AGREEMENT IS ACCEPTING ON BEHALF OF AN ENTERPRISE OR OTHER LEGAL ENTITY, SUCH INDIVIDUAL REPRESENTS THAT THEY HAVE THE AUTHORITY TO BIND SUCH ENTERPRISE AND ITS AFFILIATES TO THESE TERMS AND CONDITIONS, IN WHICH CASE THE TERM “CUSTOMER” SHALL REFER TO SUCH ENTERPRISE AND ITS AFFILIATES.
+
+
Individual Not Authorized to Sign on Behalf of Company. IF THE INDIVIDUAL ACCEPTING THIS AGREEMENT DOES NOT HAVE SUCH AUTHORITY, OR DOES NOT AGREE WITH THESE TERMS AND CONDITIONS, SUCH INDIVIDUAL MUST NOT ACCEPT THIS AGREEMENT AND MAY NOT USE THE SERVICES OR SOFTWARE.
+
+
Individual Signing on Behalf of Individual But Using Company Email. IF THE INDIVIDUAL ACCEPTING THIS AGREEMENT IS ACCEPTING THIS AGREEMENT ON HIS OR HER OWN BEHALF BUT USING AN ENTERPRISE EMAIL ADDRESS TO DO SO, SUCH INDIVIDUAL ACKNOWLEDGES AND AGREES THAT USE OF SUCH ENTERPRISE EMAIL ADDRESS WILL ESTABLISH A FLOWFUSE ACCOUNT THAT WILL BE ASSOCIATED WITH THE APPLICABLE ENTERPRISE, AND CAN AND WILL BE TRANSFERRED ENTIRELY (BOTH CONTROL AND DATA/INFORMATION WITHIN THE ACCOUNT) TO SUCH ENTERPRISE UPON SUCH COMPANY’S REQUEST WITHOUT NOTICE OR LIABILITY TO THE INDIVIDUAL. AS SUCH, TO ENSURE NO LOSS OF PERSONAL CONTENT, FLOWFUSE STRONGLY RECOMMENDS ESTABLISHING A FLOWFUSE ACCOUNT TIED TO A PERSONAL EMAIL ADDRESS.
+
+
1. DEFINITIONS
+
+
+
+“Acceptance” of a Quote shall occur at the earliest of the following: (a) execution of a Quote, (b) reference to an Quote Quote No. within a purchase order or similar document, or (c) the use of Software.
+
+
+“Affiliate” means any entity(ies) controlling, controlled by, and/or under common control with a party hereto, where “control” means the ownership of more than 50% of the voting securities in such an entity.
+
+
+“Appendix” are inclusions in this Agreement that state the terms by which Software is offered to Customer. The Appendices shall be considered part of the Agreement.
+
+
+“Authorized Partner” is a reseller or distributor that is enabled and authorized to sell Software.
+
+
+“Contractors” are defined as third parties that Customer has engaged to manage, or otherwise use the Software, solely on behalf of Customer.
+
+
+“Controlled Subject Matter” is the Software or any software or anything related thereto or any direct product thereof, collectively.
+
+
+“Customer Content” is all software, information, content and data provided by or on behalf of Customer or made available or otherwise distributed through the use of the Software.
+
+
+“Customer Records” collectively means books, records, contracts and accounts relating to the payments due to FlowFuse under this Agreement.
+
+
+“Customer Success Services” means adoption services which are provided as part of the Subscription, as set forth in Appendix 1. Customer Success Services include the collection of Operational Data (as further stated in Appendix 1). Customer Success Services are only available to Customers who are purchasing Software, and are not available for Free Software.
+
+
+“Customer Support” means technical support of the Software provided by FlowFuse.
+
+
+“Designated National” is any person or entity on the U.S. Department of Treasury’s List of Specially Designated Nationals or the U.S. Department of Commerce’s Table of Denial Orders.
+
+
+"Effective Price" means the actual price paid by Customer (List Price minus any applicable discount(s)) as set forth on a Quote or as purchased via the Website.
+
+
+“Embargoed Countries” refers collectively to countries to which the United States maintains an embargo.
+
+
+“Enterprise” means the organization, company, corporation and/or other type of entity which procures the Software to be used on its behalf pursuant to the terms of this Agreement.
+
+
+“Fees” are those fees set forth within the Quote, or, fees due immediately when purchasing via the web-portal.
+
+
+“Free Software” means a feature-limited version of Software provided to a Customer, User, end user, partner, or any other third party at no (or a greatly reduced cost) including but not limited to, the lowest tier offering of Software as made available by FlowFuse.
+
+
+“Individual” means a person who uses the Software on their own behalf, and not an Enterprise. An Individual must be over the age of thirteen (13) years old.
+
+
+"List Price" means the list price of the FlowFuse Software excluding (if applicable) any discount(s) set forth in a Quote or as purchased via the Website.
+
+
+“Node-RED instance” means a runtime, editor, or other part of the Node-RED software offering.
+
+
+“Open-Source Edition Software” means the publicly available, community-developed open-source software and components which may be provided with the Software. Open-Source Edition Software is provided as Free Software (as defined herein).
+
+
+“Quote” is a transactional document agreed to between the parties which states the Software and/or Supplemental Services being purchased, term of use, price, subscription duration, and other applicable transaction details. For the avoidance of doubt, the parties acknowledge and agree the terms and conditions stated within this Agreement and an executed Quote shall govern with respect to all matters contemplated herein.
+
+
+“Purchase Order” is a Customer’s processing document, or similar record, which is used by Customer to demonstrate internal approval and /or record of a purchase. Any terms stated within a Purchase Order shall be null and void and are expressly rejected by the parties.
+
+
+“Software” means software, and other branded offerings made available by FlowFuse or its Affiliate(s), including but not limited to, FlowFuse’s Application Platform.
+
+
+“Subscription” refers to the applicable services, support and function(s) of the Software as provided. Subscriptions are provided in tiers / levels as described in Appendix 1 and are based on the number of Node-RED instances and Users.
+
+
+“Subscription Start Date” is, unless otherwise agreed to in writing, the start date, (i) stated on an Quote, or, the date in which Customer is given access to the Software (whichever is later), or (ii) as indicated via a Website transaction, regardless if such purchase is direct with FlowFuse or via an Authorized Partner.
+
+
+“Subscription Term” shall begin on the Subscription Start Date and continue for twelve (12) months, unless the term length is otherwise agreed to in an Quote or web-portal purchase.
+
+
+“Supplemental Services” means additional capacity, functionality, storage and/or other elements that Customer may procure in addition to the Software. Such Supplemental Services may be purchased by Quote or web-portal. Supplemental Services purchased will be: (i) provided as a separate line item in an Quote or web-portal purchase, and (ii) co-termed to the underlying Subscription Term if not purchased on the Subscription Start Date. For the avoidance of doubt, Supplemental Services are not part of the Software, but rather, are provided in addition to the Software and Supplemental Services shall be subject to the terms and conditions of this Agreement.
+
+
+“User(s)” is defined as the unique and single Individual, employee, Contractor, or other third party individual or machine authorized by Customer (in accordance with this Agreement) that requires the provision of a seat within the admin platform, who are able to access the Software purchased under a Subscription, regardless of whether the User actually accesses or the frequency with which they access the Software. A User must be over the age of thirteen (13) years old.
+
+2.1 This Agreement establishes a framework that will enable FlowFuse to provide Customer with the Software. Software is provided as part of a Subscription, as described in Appendix 1. Software provided as a hosted solution, or Software-as-a-Service (“SaaS Software”), shall be subject to the attached Appendix 2 entitled “Software as a Service (SaaS) Offering”.
+
+
3. ORDERING PROCESS
+
+
+
+3.1 This Agreement applies to Software that Customer licenses directly from FlowFuse, a FlowFuse Affiliate, or from an Authorized Partner. For the avoidance of doubt, in the event Customer purchases from an Authorized Partner, FlowFuse shall have no obligations to Customer with respect to any terms and conditions outside of this Agreement unless otherwise agreed to in writing between Customer and FlowFuse.
+
+
+3.2 Unless otherwise agreed to between Customer and FlowFuse in writing, the terms of this Agreement shall govern any and all use of the Software. Purchases of Software may take place by either:
+
+
+(i) purchasing via the FlowFuse Website;
+
+
+(ii) executing a Quote with FlowFuse or an Affiliate of FlowFuse;
+
+
+(iii) upgrading a license via FlowFuse Cloud or, if Customer is self-hosted, by requesting generation of a new license (either method, a “License Upgrade”) or
+
+
+(iv) purchase from an Authorized Partner.
+
+
+3.3 License Upgrades will be invoiced quarterly if accessed via FlowFuse Cloud, or immediately if Customer is self-hosted and requests a License Upgrade. License Upgrades will be payable in accordance with Section 6 (six) of this Agreement.
+
+
+3.4 FlowFuse and Customer acknowledge and agree that Free Software may be: (i) modified and/or updated, without notice, and (ii) limited in functionality, features, maintenance, support and contain other limitations not present in Software purchased. NOTWITHSTANDING THE “WARRANTY” AND “INDEMNIFICATION” SECTIONS BELOW, FREE SOFTWARE AND SOFTWARE OFFERED ON A TRIAL BASIS (AS STATED IN AN QUOTE OR WEB-PORTAL PURCHASE) ARE PROVIDED “AS-IS” WITHOUT ANY WARRANTY AND FLOWFUSE SHALL HAVE NO INDEMNIFICATION OBLIGATIONS NOR LIABILITY OF ANY TYPE WITH RESPECT TO SUCH FREE SOFTWARE UNLESS SUCH EXCLUSION OF LIABILITY IS NOT ENFORCEABLE UNDER APPLICABLE LAW, IN WHICH CASE FLOWFUSE’S LIABILITY WITH RESPECT TO SUCH FREE SOFTWARE SHALL NOT EXCEED $1,000.00USD.
+
+
4. TERM AND TERMINATION
+
+
+
+4.1 The Agreement commences on the Effective Date and continues until it is terminated in accordance with this Section 4.
+
+
+4.2 A Subscription Term shall begin as of the Subscription Start Date and remain in effect for the term length indicated on the Quote (the "Initial Term") and automatically renew for successive twelve (12) month terms (each a "Renewal Term") unless either party gives notice of its intention not to renew thirty (30) days prior to the expiration of the current Subscription Term. Customer shall have the right to opt-out of such renewal, from within the Software, commencing upon the Subscription Start Date until thirty (30) days prior to the expiration of the Subscription Term. Subscriptions must be used during the Subscription Term and any unused Subscriptions will expire.
+
+
+4.3 Either party may terminate this Agreement and any Quote executed between the parties if:
+
+
+(a) the other party materially breaches this Agreement and does not cure the breach within thirty (30) days after written notice; or
+
+
+(b) the other party becomes the subject of a petition in bankruptcy or any other proceeding relating to insolvency, receivership, liquidation or assignment for the benefit of creditors.
+
+
+4.4 FlowFuse may (at its sole discretion) suspend delivering Subscriptions if Customer breaches the terms of Section 6 (Payment of Fees) until the breach is remedied.
+
+
+4.5 Unless otherwise stated herein, termination of this Agreement shall not affect any Subscriptions currently being delivered and this Agreement shall remain in full force and effect until the expiration of the then-current Subscription Term. In the event this Agreement is terminated by Customer in accordance with Section 4.3, FlowFuse will refund Customer any prepaid Fees for the prorated portion of unused Subscription Term. If this Agreement is terminated by FlowFuse in accordance with this Section 4, Customer will pay (if applicable) any unpaid Fees covering the remainder of the Subscription Term of all Quotes, to the extent permitted by applicable law. For the avoidance of doubt, in no event will termination relieve Customer of its obligation to pay any Fees payable to FlowFuse for the period prior to the effective date of termination. The terms and conditions of this Agreement will apply to any Renewal Term(s) provided that, absent an Effective Price as set forth in an Quote, Website purchase or other written agreement between the Parties, FlowFuse’s then-current List Price will apply with regard to any such Renewal Term(s). FlowFuse reserves the right to increase fees for any Renewal Term(s) with respect to its products and services, including the Software and Supplemental Services.
+
+
5. RESTRICTIONS AND RESPONSIBILITIES
+
+
+
+5.1 Customer will not, and will not permit any third party to (not otherwise defined as a User):
+
+
+(i) use the Software for any purpose other than as specifically authorized in this Agreement;
+
+
+(ii) use the Software in such a manner that would enable any unauthorized third party to access the Software;
+
+
+(iii) use the Software for time sharing or service bureau purposes (including without limitation, sublicensing, distributing, selling, reselling any Software);
+
+
+(iv) for any purpose other than its and its Affiliates’ own internal use, except as specifically set forth in a Reseller Agreement for authorized Sublicense Referrals;
+
+
+(v) use the Software other than in compliance with all applicable laws and regulations;
+
+
+(vi) use the Software in any manner that: (a) is harmful, fraudulent, deceptive, threatening, abusive, harassing, tortious, defamatory, vulgar, obscene, or libelous (including without limitation, accessing any computer, computer system, network, software, or data without authorization, breaching the security of another user or system, and/or attempting to circumvent any User authentication or security process); (b) impersonates any person or entity, including without limitation any employee or representative of FlowFuse; (c) includes content, with respect to the use of SaaS Software, which is illegal or violates the FlowFuse Community Code of Conduct found here https://github.com/FlowFuse/flowfuse/blob/main/CODE_OF_CONDUCT.md, or (d) contains a virus, trojan horse, worm, time bomb, unsolicited bulk, commercial, or “spam” message, or other harmful computer code, file, or program (including without limitation, password guessing programs, decoders, password gatherers, keystroke loggers, cracking tools, packet sniffers, and/or encryption circumvention programs); and
+
+
+(vii) except to the extent permitted by applicable law, disassemble, reverse engineer, or decompile the Software or access it to: (a) build a competitive product or service, (b) build a product or service using similar ideas, features, functions or graphics of the Software, (c) copy any ideas, features, functions or graphics of the Software, or (d) determine whether the Software are within the scope of any patent.
+
+
+5.2 Nothing in this Agreement shall prohibit Customer from using the Software for benchmark testing or comparative analysis. Customer will comply with all applicable data privacy and security laws and shall have appropriate technological, administrative, and physical controls in place to ensure such compliance.
+
+
+5.3 In addition to the obligations set forth in Section 5.4, and subject to the rights set forth in Section 5.7, Customer shall ensure the collection of data as required in order to use the Software (“Subscription Data”) shall remain unchanged. An overview of the Subscription Data can be found at https://flowfuse.com/docs/admin/telemetry/#collected-data.
+
+
+5.4 In accordance with this Agreement, FlowFuse has the right to verify electronically (or otherwise), and generate reports related to Customer’s installation of, access to, use of the Software to ensure compliance with the terms of this Agreement, and to ensure proper installation and use of the Software. Customer shall maintain Customer Records during the term of this Agreement and for two (2) years thereafter. FlowFuse may, upon thirty (30) days’ prior written notice to Customer and during Customer’s normal business hours and subject to industry-standard confidentiality obligations, hire an independent third-party auditor to audit the Customer Records only to verify the amounts payable under this Agreement with respect to Customer usage of the Software. If an audit reveals underpayment, Customer shall promptly pay the deficiency to FlowFuse plus late fees pursuant to Section 6. FlowFuse shall bear the cost of an audit unless the audit reveals underpayment by more than 5% for the audited period, in which case Customer shall promptly pay FlowFuse for the reasonable costs of the audit.
+
+
+5.5 Customer will be responsible for the following:
+
+
+(i) maintaining the security of Customer’s account, passwords (including, but not limited to, administrative and User passwords) and files, and for all uses of Customer account with or without Customer’s knowledge or consent; and
+
+
+(ii) any acts or omissions carried out by Contractors on Customer’s behalf. Customer shall ensure that Contractors are subject to terms no less stringent than those stated herein.
+
+
+(iii) ensuring no firewalls or any other technical device prevent the Software from sending periodic pings to FlowFuse to enable it to monitor Customer’s license compliance, or for any other reason.
+
+
+(iv) ensuring that Sublicense Referrals execute a Subscription Agreement with terms at least as restrictive as those set forth herein; for sake of clarity, Customer will be liable for Sublicense Referrals’ breach of this Agreement as though it were a Customer breach.
+
+
+5.6 Subject to this Agreement and the applicable Quote, FlowFuse will provide Customer Support to Customer for the Subscriptions, during the Subscription Term, at no additional cost. Details regarding Customer Support can be found in Appendix 1.
+
+
+5.7 Portions of the Software are governed by underlying open source licenses. This Agreement and applicable Appendix(eces) establish the rights and obligations associated with Subscriptions and Software and are not intended to limit Customer’s right to software code under the terms of an open source license.
+
+
+5.8 Customer acknowledges and agrees that:
+
+
+(i) Account names are administered by FlowFuse on a “first come, first serve” basis;
+
+
+(ii) Intentional name squatting, or purchasing, soliciting, or selling of an account name is prohibited; and
+
+
+(iii) FlowFuse reserves the right to remove, rename, or close inactive accounts at its discretion.
+
+
6. PAYMENT OF FEES
+
+
+
+6.1 With respect to purchases direct from FlowFuse, all web-portal purchase Fees shall be due and payable immediately.
+
+
+6.2 With respect to purchases direct from FlowFuse, the Quote shall: (i) reference this Agreement; (ii) state the Subscription Term(s) and Subscription(s) that are being purchased; and (iii) state the Fees due for the applicable Subscription(s).
+
+
+6.3 With respect to purchases direct from FlowFuse, such Quote is hereby incorporated into this Agreement by reference. The parties hereby agree to the terms and conditions stated within this Agreement and those found within an Quote to the exclusion of all other terms. The parties agree that all terms stated within a Purchase Order, or other similar document, shall be null and void and are expressly rejected.
+
+
+6.4 With respect to purchases direct from FlowFuse, Customer will pay FlowFuse the applicable Fees, including those for Supplemental Services, without any right of set-off or deduction. All payments will be made in accordance with the payment details stated within the applicable Quote. If not otherwise specified: (i) FlowFuse (or applicable FlowFuse Affiliate) will invoice Customer for the Fees upon the Acceptance of an Quote; and (ii) all Fees will be due and payable within thirty (30) days of Customer’s receipt of an invoice. Except as expressly set forth in this Agreement, all Fees paid or due hereunder (including prepaid amounts) are non-refundable, and no credit will be due, including without limitation if this Agreement is terminated in accordance with Section 4 herein.
+
+
+6.5 Any unpaid Fees are subject to a finance charge of one percent (1.0%) per month, or the maximum permitted by law, whichever is lower, plus all expenses of collection, including reasonable attorneys’ fees. Fees under this Agreement are exclusive of any and all taxes or duties, now or hereafter imposed by any governmental authority, including, but not limited to any national, state or provincial tax, sales tax, value-added tax, property and similar taxes, if any. Fees under this Agreement shall be paid without any withholding or deduction. In the case of any deduction or withholding requirements, Customer will pay any required withholding itself and will not reduce the amount to be paid to FlowFuse on account thereof.
+
+
7. CONFIDENTIALITY
+
+
+
+7.1 Each party (the “Receiving Party”) understands that the other party (the “Disclosing Party”) has disclosed or may disclose information relating to the Disclosing Party’s technology or business (hereinafter referred to as “Confidential Information”). Such Confidential Information shall be either: (i) identified as confidential at the time of disclosure; or (ii) the nature of such information and/or the manner of disclosure are such that a reasonable person would understand it to be confidential. Without limiting the foregoing, and subject to applicable open source license(s), the Software is considered FlowFuse Confidential Information.
+
+
+7.2 The Receiving Party agrees: (i) not to divulge to any third person any such Confidential Information; (ii) to give access to such Confidential Information solely to those employees with a need to have access thereto for purposes of this Agreement; and (iii) to take the same security precautions to protect against disclosure or unauthorized use of such Confidential Information that the party takes with its own confidential information, but in no event will a party apply less than reasonable precautions to protect such Confidential Information.
+
+
+7.3 The Disclosing Party agrees that Section 7.2 will not apply with respect to any information for which the Receiving Party can document: (i) is or becomes generally available to the public without any action by, or involvement of, the Receiving Party; or (ii) was in its possession or known by it prior to receipt from the Disclosing Party; or (iii) was rightfully disclosed to it without restriction by a third party, or (iv) was independently developed without use of any Confidential Information of the Disclosing Party.
+
+
+7.4 The parties’ obligations with respect to the protection of Confidential Information shall remain in force for a period three (3) years following the receipt of such Confidential Information and shall survive any termination or expiration of this Agreement.
+
+
+7.5 Nothing in this Agreement will prevent the Receiving Party from disclosing Confidential Information pursuant to any judicial or governmental order, provided that the Receiving Party gives the Disclosing Party, when legally possible, reasonable prior notice of such disclosure to allow the Disclosing Party to contest such order.
+
+
+7.6 Each party acknowledges and agrees that the other may suffer irreparable damage in the event of a breach of the terms of this Section 7 and that such party will be entitled to seek injunctive relief (without the necessity of posting a bond) in the event of any such breach.
+
+
+7.7 Both parties will have the right to disclose Confidential Information in connection with: (i) a required filing to a governmental authority (provided such party will use reasonable efforts to obtain confidential treatment or a protective order), or (ii) disclosures made to potential investors or acquirers, provided that at all times the Confidential Information shall be protected in a manner no less stringent as set forth in this Section 7.
+
+
+7.8 FlowFuse may collect data with respect to, and report on the aggregate response rate and other aggregate measures of, the Software performance and Customer’s usage of the Software. Notwithstanding the foregoing, FlowFuse will not identify Customer to any third party as the source of any such data without Customer’s prior written consent.
+
+
8. INTELLECTUAL PROPERTY RIGHTS
+
+
+
+8.1 Subject to the terms and conditions of this Agreement, FlowFuse hereby grants to Customer and its Affiliates a limited, non-exclusive, non-transferable, non-sublicensable license for Customer’s and its Affiliates’ Users to use, reproduce, modify, prepare derivative works based upon, and display the code of Software at the tier level selected by Customer, or as set forth in an Quote, solely for: (i) its internal use in connection with the development of Customer’s and/or its Affiliates’ own software; and (ii) the number of Users for which Customer has paid FlowFuse. Notwithstanding anything to the contrary, Customer agrees that FlowFuse and/or its licensors (as applicable) retain all right, title and interest in and to all Software incorporated in such modifications and/or patches, and all such Software may only be used, copied, modified, displayed, distributed, or otherwise exploited in full compliance with this Agreement, and with a valid Subscription for the correct number of Users.
+
+
+8.2 Except as expressly set forth herein, FlowFuse (and its licensors, where applicable) will retain all intellectual property rights relating to the Software and any suggestions, ideas, enhancement requests, feedback, or other recommendations provided by Customer, its Affiliates, Users or any third party relating to the Software (herein referred to as “Feedback Materials”), which are hereby assigned to FlowFuse. For the avoidance of doubt, Feedback Materials shall not include Customer Confidential Information or intellectual property owned by Customer. This Agreement does not constitute a sale of the Software and does not convey to Customer any rights of ownership in or related to the Software or any other intellectual property rights.
+
+
+8.3 Customer shall not remove, alter or obscure any of FlowFuse’s (or its licensors’) copyright notices, proprietary legends, trademark or service mark attributions, patent markings or other indicia of FlowFuse’s (or its licensors’) ownership or contribution from the Software.
+
+
+8.4 Customer represents it shall be responsible for, and retain all right, title, and interest in and to, Customer Content, subject to a limited license to FlowFuse necessary for FlowFuse’s provision of the Software as contemplated hereunder.
+
+
+8.5 Customer grants to FlowFuse the right to use Customer’s company name and logo in marketing and promotional materials, including earnings releases and calls, subject to Customer’s brand and trademark guidelines as provided to FlowFuse from time to time.
+
+
9. WARRANTY
+
+
+
+9.1 During the Subscription Term, FlowFuse represents and warrants that: (i) it has the authority to enter into this Agreement, (ii) the Software shall be provided in a professional and workmanlike manner by qualified personnel; and (iii) it will use commercial industry standard methods designed to ensure the Software provided to Customer does not include any computer code or other computer instructions, devices or techniques, including without limitation those known as disabling devices, trojans, or time bombs, that are intentionally designed to disrupt, disable, harm, infect, defraud, damage, or otherwise impede in any manner, the operation of a network, computer program or computer system or any component thereof, including its security or User data.
+
+
+9.2 If at any time FlowFuse fails to comply with the warranties in this Section 9, Customer may promptly notify FlowFuse in writing of any such noncompliance. FlowFuse will, within thirty (30) days of receipt of such written notification, either correct the noncompliance or provide Customer with a plan for correcting the noncompliance. If the noncompliance is not corrected or if a reasonably acceptable plan for correcting the non-compliance is not established during such period, Customer may terminate this Agreement and receive a prorated refund for the unused portion of the Subscription Term as its sole and exclusive remedy for such noncompliance.
+
+
+9.3 EXCEPT AS SPECIFICALLY SET FORTH IN THIS AGREEMENT, THE SOFTWARE, SUPPLEMENTAL SERVICES AND CONFIDENTIAL INFORMATION AND ANYTHING PROVIDED IN CONNECTION WITH THIS AGREEMENT ARE PROVIDED "AS-IS," WITHOUT ANY WARRANTIES OF ANY KIND. FLOWFUSE AND ITS LICENSORS HEREBY DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.
+
+
10. INDEMNIFICATION
+
+
+
+10.1 FlowFuse will defend Customer from any claim, demand, suit or proceeding made or brought against Customer by a third party alleging the Software (excluding Free Software as set forth in Section 3.3) provided by FlowFuse infringes or misappropriates such third party’s patent or copyright (a “Customer Claim”). FlowFuse will indemnify and hold Customer harmless from any damages, reasonable attorneys’ fees and costs finally awarded against Customer as a result of a Customer Claim, or for amounts paid by Customer under a settlement approved (in writing) by FlowFuse, provided Customer: (i) promptly notifies FlowFuse in writing of the Customer Claim; (ii) gives FlowFuse all reasonable assistance at FlowFuse’s expense; and (iii) gives FlowFuse sole control over defense and settlement thereof except that FlowFuse may not settle any Customer Claim unless it unconditionally releases Customer of all liability. The foregoing obligations do not apply if: (v) the Customer Claim arises from Software or any part thereof that is modified by Customer, or at Customer’s direction, after delivery by FlowFuse; (w) the Customer Claim arises from the use or combination of the Software or any part thereof with other products, processes or materials not provided by FlowFuse where the alleged infringement relates to such combination; (x) Customer continues allegedly infringing activity after being notified thereof or after being informed of modifications that would have avoided the alleged infringement; (y) the Customer Claim arises from software not created by FlowFuse, or (z) the Customer Claim results from Customer’s breach of this Agreement and/or applicable Quotes. Notwithstanding the foregoing, in the event of a Customer Claim, FlowFuse, at its discretion, option and expense, reserves the rights to: (a) modify the Software to make it non-infringing provided there is no material loss of functionality; (b) settle such claim by procuring the right for Customer to continue using the Software; or (c) if in FlowFuse’s reasonable opinion neither (a) or (b) are commercially feasible, terminate the license to the Software and refund a pro-rata portion of the amount paid by Customer for such Software for the unused portion of the Subscription Term.
+
+
+10.2 Customer will defend FlowFuse and its Affiliates against any claim, demand, suit or proceeding made or brought against FlowFuse by a third party alleging: (i) that any Customer Content or Customer’s use of Customer Content with the Software or any software (or combination of software) provided by Customer and used with the Software, infringes or misappropriates such third party’s intellectual property rights, or (ii) arising from Customer’s use of the Software in an unlawful manner or in violation of the Agreement, the applicable documentation, or Quote (each a “FlowFuse Claim”). Customer will indemnify FlowFuse from any damages, reasonable attorneys’ fees and costs finally awarded against FlowFuse as a result of, or for any amounts paid by FlowFuse under a settlement approved (in writing) by Customer of a FlowFuse Claim, provided FlowFuse: (x) promptly gives Customer written notice of the FlowFuse Claim, (y) gives Customer sole control of the defense and settlement of the FlowFuse Claim (except that Customer may not settle any FlowFuse Claim unless it unconditionally releases FlowFuse of all liability), and (z) gives Customer all reasonable assistance, at Customer’s expense. The above defense and indemnification obligations do not apply if a FlowFuse Claim arises from FlowFuse’s breach of this Agreement and/or applicable Quote.
+
+
+10.3 This Section 10 (Indemnification) states the indemnifying party’s sole liability to, and the indemnified party’s exclusive remedy against the other party for any third-party claim described in this section.
+
+
11. LIMITATION OF LIABILITY
+
+
+
+11.1 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL EITHER PARTY OR THEIR LICENSORS BE LIABLE FOR ANY INDIRECT, PUNITIVE, INCIDENTAL, SPECIAL, CONSEQUENTIAL DAMAGES, LOSS OF REVENUE, ANTICIPATED PROFITS, LOST BUSINESS OR LOST SALES, WHETHER BASED IN CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY, OR OTHERWISE, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF DAMAGES.
+
+
+11.2 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE TOTAL LIABILITY OF EACH PARTY AND ITS AFFILIATES AND LICENSORS ARISING OUT OF OR RELATED TO THIS AGREEMENT, WHETHER BASED IN CONTRACT, TORT (INCLUDING NEGLIGENCE OR STRICT LIABILITY), OR OTHERWISE, WILL NOT EXCEED, IN THE AGGREGATE, THE TOTAL AMOUNT PAID BY CUSTOMER OR ITS AFFILIATES HEREUNDER IN THE ONE YEAR PERIOD PRECEDING THE FIRST INCIDENT OUT OF WHICH THE LIABILITY AROSE. THE FOREGOING LIMITATIONS WILL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY, BUT WILL NOT LIMIT CUSTOMER'S OR ITS AFFILIATES’ PAYMENT OBLIGATIONS UNDER THE “PAYMENT OF FEES” SECTION ABOVE.
+
+
12. U.S. GOVERNMENT MATTERS
+
+
+
+12.1 Notwithstanding anything else, Customer may not provide to any person or export or re-export or allow the export or re-export of Controlled Subject Matter, in violation of any restrictions, laws or regulations of the United States Department of Commerce, the United States Department of Treasury Office of Foreign Assets Control, or any other United States or foreign agency or authority.
+
+
+12.2 Without limiting the foregoing, Customer acknowledges and agrees that the Controlled Subject Matter will not be used or transferred or otherwise exported or re-exported to Embargoed Countries, or to or by a national or resident thereof, or to or by Designated Nationals. The lists of Embargoed Countries and Designated Nationals are subject to change without notice. Use of the Software is representation and warranty that the Customer, Customer personnel, or Contractors are not located in, under the control of, or a national or resident of an Embargoed Country or a Designated National.
+
+
+12.3 The Controlled Subject Matter may use or include encryption technology that is subject to licensing requirements under the U.S. Export Administration Regulations.
+
+
+12.4 As defined in FAR section 2.101, any software and documentation provided by FlowFuse are “commercial items” and according to DFAR section 252.2277014(a)(1) and (5) are deemed to be “commercial computer software” and “commercial computer software documentation.” Consistent with DFAR section 227.7202 and FAR section 12.212, any use modification, reproduction, release, performance, display, or disclosure of such commercial software or commercial software documentation by the U.S. Government will be governed solely by the terms of this Agreement and will be prohibited except to the extent expressly permitted by the terms of this Agreement.
+
+
13. FORCE MAJEURE
+
+
+
+13.1 FlowFuse and Customer will not be liable for any default or delay in the performance of their respective non-monetary obligations, to the extent that such default or delay is caused, directly or indirectly, by fire, flood, earthquake, explosions, elements of nature, acts of God, acts or regulations of government bodies, nuclear, chemical or biological contamination, court orders arising out of circumstances other than a breach of this Agreement by the Non-performing Party (as defined below), acts of war, terrorism, riots, civil disorders, rebellions or revolutions, strikes, lockouts or labor difficulties, epidemics or by any other event or circumstance that is beyond the reasonable control of FlowFuse or Customer. The party that is unable to perform shall be referred to as the “Non-performing Party”. Such an event or circumstance giving rise to the default or delay is hereby referred to as a “Force Majeure Event”.
+
+
+13.2 The Non-performing Party will be excused from any further performance of the non-monetary obligations affected by such Force Majeure Event for as long as such Force Majeure Event continues and the Non-performing Party continues to use commercially reasonable efforts to resume performance.
+
+
+13.3 Except as expressly excused in this Section 13, each party will continue to perform its respective obligations under this Agreement during a Force Majeure Event.
+
+
14. SECURITY / DATA PROTECTION
+
+
+
+14.1 Without limiting FlowFuse’s obligations as stated in Section 7 (Confidentiality), FlowFuse shall be responsible for establishing and maintaining a commercially reasonable information security program that is designed to: (i) ensure the security and confidentiality of the Customer Content; (ii) protect against any anticipated threats or hazards to the security or integrity of the Customer Content; (iii) protect against unauthorized access to, or use of, the Customer Content; and (iv) ensure that all subcontractors of FlowFuse, if any, comply with all of the foregoing. In no case shall the safeguards of FlowFuse’s information security program be less stringent than the information security safeguards used by FlowFuse to protect its own commercially sensitive data. Customer shall use commercially reasonable security and anti-virus measures when accessing and using the Software and to prevent unauthorized access to, or use of the Software, and notify FlowFuse promptly of any such unauthorized access or use of which it becomes aware.
+
+
+14.2 With respect to the protection of information, the FlowFuse Privacy Statement located here https://flowfuse.com/privacy-policy/, shall apply. If this Agreement is entered into on behalf of an Enterprise, the terms of the data processing addendum at https://flowfuse.com/terms/#6.4-data-processing-agreement. (“DPA”) are hereby incorporated by reference and shall apply to the extent Customer Content includes Personal Data, as defined in the DPA. To the extent Personal Data from the European Economic Area (EEA), the United Kingdom and Switzerland are processed by FlowFuse, the Standard Contractual Clauses shall apply, as further set forth in the DPA. For the purposes of the Standard Contractual Clauses, Customer and its applicable Affiliates are each the data exporter, and Customer's acceptance of this Agreement, and an applicable Affiliate's execution of an Quote, shall be treated as its execution of the Standard Contractual Clauses.
+
+
+14.3 The parties acknowledge and agree that, (i) the Software is not designed for the purpose(s) of storing, processing, compiling or transmitting Sensitive Data (as defined herein), and (ii) Customer shall not use the Software, or otherwise provide to FlowFuse without prior written consent, Sensitive Data under this Agreement. “Sensitive Data” means: (a) special categories of data enumerated in European Union Regulation 2016/679, Article 9(1) or any successor legislation; (b) patient, medical, or other protected health information regulated by the Health Insurance Portability and Accountability Act (as amended and supplemented) (“HIPAA”); (c) credit, debit, or other payment card data or financial account information, including bank account numbers or other personally identifiable financial information; (d) social security numbers, driver’s license numbers, or other government identification numbers; (e) other information subject to regulation or protection under specific laws such as the Children’s Online Privacy Protection Act or Gramm-Leach-Bliley Act (“GLBA”) (or related rules or regulations); or (f) any data similar to the above protected under foreign or domestic laws. Customer further acknowledges that the Software and related features are not intended to meet any legal obligations for these uses, including HIPAA and GLBA requirements, and that FlowFuse is not a Business Associate as defined under HIPAA. Therefore, notwithstanding anything else in this Agreement, FlowFuse has no liability for Sensitive Data processed in connection with Customer’s use of the Software.
+
+
+14.4 To the extent Customer has Users of the SaaS Software located in the People’s Republic of China, Customer represents and warrants that it has complied with all requirements of a “personal information processor,” as that term is defined under the Personal Information and Protection Law of the People’s Republic of China (“PIPL”). This includes the requirement to provide adequate notice and obtain all necessary consents from relevant Users prior to the overseas transfer and processing of Personal Data by FlowFuse, as well as onward transfers and processing by FlowFuse’s third-party subprocessors. In addition, Customer warrants, where required, that it will not transfer Personal Data without a security assessment, as described in PIPL, from the Cyberspace Administration of China. Nothing in this section limits FlowFuse or Customer’s obligations under the DPA.
+
+
15. MISCELLANEOUS
+
+
+
+15.1 If any provision of this Agreement is found to be unenforceable or invalid, that provision will be limited or eliminated to the minimum extent necessary so that this Agreement will otherwise remain in full force and effect and enforceable.
+
+
+15.2 This Agreement is not assignable, transferable or sublicensable by either party without the other party’s prior written consent, not to be unreasonably withheld or delayed; provided that either party may transfer and/or assign this Agreement to a successor in the event of a sale of all, or substantially all, of its business or assets to which this Agreement relates.
+
+
+15.3 This Agreement is the complete and exclusive statement of the mutual understanding of the parties and supersedes and cancels all previous written and oral agreements, communications and other understandings relating to the subject matter of this Agreement. All waivers and modifications must be in a writing signed or otherwise agreed to by each party, except as otherwise provided herein.
+
+
+15.4 No agency, partnership, joint venture, or employment is created as a result of this Agreement and neither party has any authority of any kind to bind the other in any respect whatsoever.
+
+
+15.5 In any action or proceeding to enforce rights under this Agreement, the prevailing party will be entitled to recover costs and attorneys’ fees.
+
+
+15.6 All notices under this Agreement will be in writing and will be deemed to have been duly given when received, if personally delivered; when receipt is electronically confirmed, if transmitted by facsimile or e-mail; and upon receipt, if sent by certified or registered mail (return receipt requested), postage prepaid. Any notices to FlowFuse shall also include a copy to contact@flowfuse.com.
+
+
+15.7 In addition to any rights that accrued prior to termination, the provisions of Sections 3.3, and 5 through 15 shall survive any termination of this Agreement.
+
+
+15.8 This Agreement will be governed by the laws of the State of California, U.S.A. without regard to its conflict of laws provisions. The federal and state courts sitting in San Francisco County, California, U.S.A. will have proper and exclusive jurisdiction and venue with respect to any disputes arising from or related to the subject matter of this Agreement. The United Nations Convention on Contracts for the International Sale of Goods is expressly disclaimed by the Parties with respect to this Agreement and the transactions contemplated hereby.
+
+
+Both parties agree to the above terms by signing the Quote in which these terms are linked.
+
+
+
+
+
APPENDIX 1: FlowFuse Support Policies
+
+
+
+The applicable level of support and/or functionality of the Software, as set forth in the table below. In the event Customer does not reasonably comply with written specifications or instructions from FlowFuse’s service engineers, regarding any support issue or request (including without limitation, failure to make backups of Customer Content or versions of Software) (each, a “Support Issue”), FlowFuse may cease its support obligations to Customer with respect to such Support Issue upon fifteen (15) days written notice and Customer’s inability to cure such noncompliance within the notice period.
+
+
SUBSCRIPTIONS AND LEVELS OF SUPPORT
+
+
+
+
+
+
Subscription*
+
+
Level of Support (First Response Time)
+
+
Support Details
+
+
+
+
Open-Source
+
+
Node-RED Community Forum
+
+
+
+
+
+
Team
+
+
FlowFuse Standard Support
+
+
24 x 5 Support Next business day response (24 hour SLA) Submit Tickets at https://flowfuse.com/support/
+
+
+
+
Enterprise
+
+
FlowFuse Enterprise Support
+
+
24 X 5 Support
+
+First Response Time SLA 4 Hours. Submit Tickets at https://flowfuse.com/support/
+
+
+
+
+
+
+
+
+
APPENDIX 2: Software as a Service (SaaS) Offering
+
+
+
+With respect to Customer’s purchase and/or use of the SaaS Software, the following additional terms shall apply.
+
+
AVAILABILITY
+
+
+
+The SaaS Software will be available to Customer 99.5% of each calendar month commencing with the first full calendar month following the Effective Date (“Uptime”). Availability shall be calculated by subtracting the cumulative minutes of Downtime in a month from the total number of minutes in the applicable month, and representing the remaining minutes as a percentage of the total number of minutes that month (i.e., (total monthly minutes – cumulative minutes of Downtime) / (total monthly minutes). Availability to the SaaS Software will be measured, and reported on, by FlowFuse using instrumentation and observation tools specifically designed to provide a representative measure of service availability. Recent status, references to availability measurement definition, and historical reporting will be available at or linked from the FlowFuse system status site located at https://status.FlowFuse.com/.
+
+
+Subject to the exclusions herein, “Downtime” is defined as any period of time during which Customer is unable to access the SaaS Software. “Downtime” specifically excludes: (i) scheduled maintenance, which is conducted between 9:00 PM (PT) and 4:00 AM (PT); (ii) Customer’s systems, networks, equipment, or connections; (iii) Customer’s acts other than in accordance with the Agreement, including, without limitation, any negligence, willful misconduct or use of the SaaS Software in breach of this Agreement; or (iv) Force Majeure - circumstances beyond FlowFuse’s reasonable control including, without limitation, acts of any governmental body, war, insurrection, sabotage, embargo, fire, flood, strike or other labor disturbance, unavailability of or interruption or delay in telecommunications or third party services, failure of third party software or inability to obtain supplies used in or equipment needed for provision of the SaaS Software.
+
+
RESILIENCY
+
+
+
+FlowFuse will architect and maintain an underlying cloud infrastructure with commercially reasonable resiliency for all data, compute, and network services. At a minimum, FlowFuse will maintain the highest documented level of “FlowFuse Reference Architecture” as detailed at https://flowfuse.com/docs/.
+
+
BACKUPS
+
+
+
+FlowFuse will maintain a commercially reasonable system of data backup process and technology to ensure that primary data sources remain recoverable in the event of various system failures.
+
+
MONITORING AND INCIDENT RESPONSE
+
+
+
+FlowFuse will employ a system of instrumentation and observation tools to ensure that system behavior which may limit use of the SaaS Software is detected and announced. FlowFuse will also employ industry reasonable practices to maintain appropriate engineering personnel availability for the purposes of incident response(s).
+
+
UPDATES AND UPGRADES
+
+
+
+FlowFuse will update the SaaS Software as updates are available and when reasonably practical to implement said updates. Update timing and process will remain at FlowFuse’s discretion.
+
+
SCHEDULED SYSTEM MAINTENANCE
+
+
+
+FlowFuse will occasionally perform scheduled system maintenance which requires limits to the use of part or all of the SaaS Software features, or significantly reduces features and functions during the scheduled system maintenance period. FlowFuse will provide ten (10) business days notice for all scheduled system maintenance activities. FlowFuse will take a proactive approach to minimizing the need for such maintenance and will limit scheduled system maintenance to less than four (4) hours per calendar month. Notwithstanding the foregoing, in the event of an emergency or urgent issue which may negatively impact FlowFuse’s customers, FlowFuse has the right to carry out unscheduled maintenance to remedy such instance(s). For the avoidance of doubt, such unscheduled maintenance shall: (i) be limited to only those issues which may negatively impact customers; and (ii) will be carried out in such a manner to provide for the least amount of disruption to customers.
+
+
SUSPENSION OF SERVICE
+
+
+
+FlowFuse reserves the right to suspend service to the SaaS Software if: (i) Customer fails to comply with the Agreement and this Appendix; (ii) Customer exceeds set application limits, or (iii) requests or usage deemed malicious in nature is identified to be sourced from Customer accounts, personnel, or systems.
+
\ No newline at end of file
diff --git a/src/handbook/design/branding.md b/src/handbook/design/branding.md
index f9171da739..f78440d126 100644
--- a/src/handbook/design/branding.md
+++ b/src/handbook/design/branding.md
@@ -121,12 +121,18 @@ When only black or white are allowed, search for the file name ending with "blac
## Fonts
-In both the FlowFuse application and on our website, we use [Tailwind CSS](https://tailwindcss.com/). With Tailwind, comes the `font-sans` class, which we use across FlowFuse.
+The following fonts are used across the FlowFuse platform, website, and branded materials. The table below outlines where each font is applied.
-For branded materials such as videos and images we have two stylized fonts in-use:
+| Font | Logo | Platform | Website | Branded Materials |
+|--------------------------------------------------------|------|----------|---------|--------------------|
+| [**font-sans** (Tailwind CSS)](https://tailwindcss.com) | | * | | |
+| [**Heebo**](https://fonts.google.com/specimen/Heebo) | | | * | * |
+| [**Baloo Da 2**](https://fonts.google.com/specimen/Baloo+Da+2) | * | | | |
+
+#### Notes:
+- **Heebo:** When using this font, we aim to avoid weights heavier than *semi-bold* to maintain a clean and balanced design.
+- **Baloo Da 2:** Exclusively used in the FlowFuse logo.
-- ["DIN Alternate Bold"](https://fontsgeek.com/fonts/DIN-Alternate-Bold): Used in videos & social media content.
-- ["Baloo Da 2"](https://fonts.google.com/specimen/Baloo+Da+2): Used in the FlowFuse logo.
## Colour Palette
diff --git a/src/handbook/development/ops/staging.md b/src/handbook/development/ops/staging.md
index baef941ecb..6dd6b03c81 100644
--- a/src/handbook/development/ops/staging.md
+++ b/src/handbook/development/ops/staging.md
@@ -38,10 +38,14 @@ of short-lived testing of sign-up and user management.
The inboxes for these email addresses are publicly accessible if known, so the list
is available on [this private issue](https://github.com/FlowFuse/CloudProject/issues/135).
+### Accessing Staging
+
+To access the staging environment, log in with your @flowfuse.com account through Google SSO. The url for the staging environment is https://forge.flowfuse.dev.
+
## Using staging
When setting up a team you'll need to enter billing details. For credit card
details, use [the Stripe mock data](https://stripe.com/docs/testing#testing-interactively).
As the staging cluster is purposefully smaller than production, please be mindful of deleting
-resources after use.
\ No newline at end of file
+resources after use.
diff --git a/src/handbook/handbook.json b/src/handbook/handbook.json
index 5519fe61c9..970b507f65 100644
--- a/src/handbook/handbook.json
+++ b/src/handbook/handbook.json
@@ -1,6 +1,7 @@
{
"layout": "layouts/documentation.njk",
"nav": "handbook",
+ "searchTitle": "Handbook",
"tags": [
"handbook"
]
diff --git a/src/handbook/operations/billing.md b/src/handbook/operations/billing.md
index 9c49c91191..9b559ff4d7 100644
--- a/src/handbook/operations/billing.md
+++ b/src/handbook/operations/billing.md
@@ -4,14 +4,11 @@ navTitle: Billing
# Billing
-We use Stripe to bill our customers and to manage subscriptions for FlowFuse.
-Team members will be given a login to the Stripe dashboard as required for
+Subscriptiona and their invoices are all stored in Hubspot, and Stripe is used for payment processing for contracted
+revenue. For FlowFuse's montly self-service customers Stripe also tracks the subscription instead of Hubspot.
+Team members will be given a login to the relevant Stripe and Hubspot dashboard as required for
their role with an appropriate level of access.
-We also contract with Formation Financial to help assist with business administration and billing support. You can direct any billing related requests to billing@flowfuse.com for their assistance if preferred.
-
-You should first get approval from the CEO or CTO to make any changes to existing subscriptions. Use coupons as described below when providing customer access to resources subscribed to through pre-paid deals.
-
## Providing support
The main use of the Stripe dashboard will be to answer queries on a customers subscription, this should only be in relation to a ticket raised by the customer and we *must* confirm that the customer team in question on the support ticket is the same one you are looking at it Stripe. Remember that the email address in Stripe may not match that of the FlowFuse user as this is a "billing email". You should use the team ID numbers in the metadata field to confirm.
@@ -20,25 +17,31 @@ The customer must first configure their billing details within their FlowFuse ac
## Invoices
-For all monthly recurring invoices Stripe will automatically generate an invoice
+Monthly subscriptions will be automatically generated in Stripe
and charge customers based on their payment method filed with Stripe.
-For annual subscriptions, which could also be self-managed, invoices are created
-in HubSpot. These invoices are created manually *after* the customer has agreed
-on the [quote](/handbook/customer/sales/engagements#generating-a-quote-and-order-form) and
-[terms](/handbook/customer/sales/legal/#subscription-agreement).
+Annual subscriptions and invoices are managed in HubSpot, please see instructions below.
-### Creating an invoice
+### Creating a subscription invoice
To generate an invoice, the corresponding deal and quote must first be in place in HubSpot. This ensures the correct products and amounts are auto-populated.
+1. Ensure the company details are updated, and include an address and country.
1. On the Deal page, find the Invoices section on the right-hand side, then click Add and Convert Deal to Subscription.
2. Change the dates, terms, products, discounts, PO number, contact, and company information if required (most will be correct, since it is pulling from the signed quote).
3. Make sure both ACH and Credit Card options are checked for payment.
4. Click the Finalize button on the top right.
5. It will prompt to send the invoice automatically to the billing contact you designated, change date of send if needed.
-## Coupons
+### Creating a PS invoice
+
+For new customers an invoice should be generated in [Hubspot's Invoice section](https://app-eu1.hubspot.com/contacts/26586079/objects/0-53/views/all/list).
+
+1. Ensure the company details are updated, and include an address and country.
+2. Ensure the customer provided a PO number if they require one.
+3. Create a one-time invoice through Hubspot -- If the customer already is used to paying through Stripe, use best judgement when to switch them over
+
+## Adding a Coupon
From time to time we may wish to provide a user with some free access to
the managed FlowFuse platform. In this situation we will create a coupon code
@@ -62,6 +65,16 @@ To create a couple on Stripe:
That coupon code can now be used when you are asked to provide payment card details.
+## Removing a Coupon
+
+The preferred course of action is to create coupons that will expire on their own. However, in the event that a coupon needs to be removed manually, follow these steps.
+
+1. Find the customer's subscription.
+2. Click 'Actions' in the upper-right corner.
+3. Choose 'Update a Subscription'. The customer's subscription details are now open.
+4. Locate the coupon and remove it.
+5. Click 'Update Subscription' to save the changes.
+
## Credits
Occasionally we may need to apply a credit to a customers account as a goodwill gesture to cover an issue they have experienced, this should be the exception and must be approved by either CTO or CEO. We will also check to see if the customer has received any previous credits on their account.
diff --git a/src/handbook/peopleops/leave.md b/src/handbook/peopleops/leave.md
index 726e6340a7..da94d6dc46 100644
--- a/src/handbook/peopleops/leave.md
+++ b/src/handbook/peopleops/leave.md
@@ -25,6 +25,9 @@ team members. To prevent an undefined number of vacation days to start a race to
the bottom, we recommend each team member to take a minimum of 25 days a year,
and at least 5 days a quarter.
+Due to legal limitations, Canadian employees can not be offered unlimited PTO and
+will have the aforementioned 25 days instead.
+
## Sick leave
Sick leave, or having limited availability is not recorded currently. Keep your
diff --git a/src/handbook/product/feedback.md b/src/handbook/product/feedback.md
index 9e1e1423f8..42dffeabe3 100644
--- a/src/handbook/product/feedback.md
+++ b/src/handbook/product/feedback.md
@@ -58,7 +58,7 @@ The Product Manager should set up a minimum of one poll every six months, to col
### GitHub Voting
By allowing users to vote on issues or proposed epics, we can gain insight into what changes or improvements are most demanded by the users. This democratic approach ensures we prioritize features that resonate most with our user base.
-Our website [Roadmap page](/product/roadmap/) provides an overview of Epics that are currently under consideration.
+Our website [Roadmap page](/changelog/) provides an overview of Epics that are currently under consideration.
### Node-RED Community
diff --git a/src/handbook/product/metrics.md b/src/handbook/product/metrics.md
index b66fb3436d..47c75cca00 100644
--- a/src/handbook/product/metrics.md
+++ b/src/handbook/product/metrics.md
@@ -40,7 +40,7 @@ Each metric we track provides unique insights into different facets of our produ
4. **Snapshot Adoption Rate**: This rate evaluates the prevalence of active instances using one or more [snapshots](/docs/user/snapshots/). It's determined by dividing the number of active instances with one or more snapshots by the total number of active instances.
-5. **Device Adoption Rate**: This metric demonstrates the rate at which teams adopt [devices](/docs/user/devices/), determined by dividing the number of teams with one or more devices by the total number of teams.
+5. **Device Adoption Rate**: This metric demonstrates the rate at which teams adopt [devices](/docs/device-agent/introduction/), determined by dividing the number of teams with one or more devices by the total number of teams.
6. **Weekly Active Users**: This fundamental metric provides insight into the overall usage and engagement with our product on a weekly basis.
diff --git a/src/handbook/product/verticals.md b/src/handbook/product/verticals.md
index d56c94136e..a4670b12b1 100644
--- a/src/handbook/product/verticals.md
+++ b/src/handbook/product/verticals.md
@@ -4,7 +4,16 @@ navTitle: Market Segments
# Market Segments
-By understanding the various markets in which we fit, we can align our [product strategy](./strategy.md) to meet those specific needs. For this overview, we will focus on three distinct product markets: Industrial IoT Platforms, Low-Code Tools, and Data Integration Tools.
+By understanding the various markets in which we fit, we can align our [product strategy](./strategy.md) to meet those specific needs. For this overview, we will focus on four distinct product markets: Enterprise-Grade Node-RED, Industrial IoT Platforms, Low-Code Tools, and Data Integration Tools.
+
+## Enterprise Grade Node-RED
+
+For companies who are already adopting Node-RED as the base technology, they are looking for a solution to mature their use of Node-RED.
+
+We believe FlowFuse is the only viable commercial solution in this space. Our main competitor here is in-house built solutions; where companies are faced with building their own ways to manage Node-RED securely and at scale. This is usually not their core business, so a commercial solution is an attractive alternative.
+
+Where companies have already invested in their own automations around Node-RED, it is important for FlowFuse to demonstrate the additional value it can bring.
+
## Industrial IoT Platforms
@@ -105,4 +114,4 @@ Some of the companies that are in this market include:
### Positioning
-FlowFuse should highlight its capabilities as an advanced data integration platform, emphasizing its ability to simplify data collection and transmission. Showcasing partnerships with major database providers and cloud systems could enhance its appeal as a capable and versatile data integration tool.
\ No newline at end of file
+FlowFuse should highlight its capabilities as an advanced data integration platform, emphasizing its ability to simplify data collection and transmission. Showcasing partnerships with major database providers and cloud systems could enhance its appeal as a capable and versatile data integration tool.
diff --git a/src/images/bg-flow-gradient-w.png b/src/images/bg-flow-gradient-w.png
new file mode 100644
index 0000000000..5e10130892
Binary files /dev/null and b/src/images/bg-flow-gradient-w.png differ
diff --git a/src/images/home-logos/wenco-logo.svg b/src/images/home-logos/wenco-logo.svg
new file mode 100644
index 0000000000..9af36d633b
--- /dev/null
+++ b/src/images/home-logos/wenco-logo.svg
@@ -0,0 +1,30 @@
+
+
\ No newline at end of file
diff --git a/src/images/home/ff_ot_it.png b/src/images/home/ff_ot_it.png
new file mode 100644
index 0000000000..9d8e69c96c
Binary files /dev/null and b/src/images/home/ff_ot_it.png differ
diff --git a/src/images/solutions/ff-uns.png b/src/images/solutions/ff-uns.png
new file mode 100644
index 0000000000..c4061a5c21
Binary files /dev/null and b/src/images/solutions/ff-uns.png differ
diff --git a/src/images/solutions/flowfuse-uns.png b/src/images/solutions/flowfuse-uns.png
new file mode 100644
index 0000000000..0156f18467
Binary files /dev/null and b/src/images/solutions/flowfuse-uns.png differ
diff --git a/src/images/team/headshot-gayan.png b/src/images/team/headshot-gayan.png
deleted file mode 100644
index 1ff50f3d9a..0000000000
Binary files a/src/images/team/headshot-gayan.png and /dev/null differ
diff --git a/src/images/uns/uns.png b/src/images/uns/uns.png
deleted file mode 100644
index d87e98845f..0000000000
Binary files a/src/images/uns/uns.png and /dev/null differ
diff --git a/src/images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg b/src/images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg
new file mode 100644
index 0000000000..89f86a770f
Binary files /dev/null and b/src/images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg differ
diff --git a/src/images/webinars/webinar-node-red-wago.jpg b/src/images/webinars/webinar-node-red-wago.jpg
index 2a656834bd..b3345e489c 100644
Binary files a/src/images/webinars/webinar-node-red-wago.jpg and b/src/images/webinars/webinar-node-red-wago.jpg differ
diff --git a/src/index.njk b/src/index.njk
index 5733f5e298..f59b58744e 100644
--- a/src/index.njk
+++ b/src/index.njk
@@ -13,22 +13,22 @@ hubspot:
Empowering you to unlock data and build applications faster
- Supporting your OT and IT teams with the tools and safeguards they need to drive operational
- efficiency
- and deliver real business value.
+ Supporting your OT and IT teams with the tools and safeguards they need to drive operational efficiency and deliver real business value.
+
+ {% set metrics = [
+ {
+ number: "20x",
+ text: "Increase in DevOps pipeline speed with automation"
+ },
+ {
+ number: "20%",
+ text: "Reduction in developer time spent on new solutions"
+ },
+ {
+ number: "9x",
+ text: "Faster Prototyping, from days to hours for back-end services"
+ }]
+ %}
+
- {% include "components/icons/building-office-2.svg" %}
-
-
On Premise
-
Deploy FlowFuse on your hardware for enhanced flexibility. Opt for self-hosted deployment with FlowFuse, enabling on-premises installation and full control over your deployment process.
Our managed hosted solution, maintained and supported by the FlowFuse team. Experience flexibility, scalability, and expert assistance to drive your business forward.
+ Integrate data between OT and IT systems efficiently. With low-code solutions and seamless integration, FlowFuse empowers engineers to collect, visualise, and act on data rapidly, maintaining compliance and security standards. Achieve operational excellence by enabling faster innovation and smoother data flow across your organisation.
+
diff --git a/src/integrations/index.njk b/src/integrations/index.njk
new file mode 100644
index 0000000000..4a546b9b43
--- /dev/null
+++ b/src/integrations/index.njk
@@ -0,0 +1,367 @@
+---
+layout: default
+sitemapPriority: 0.9
+title: Integrations
+description:
+ Explore the list of integrations and modules available for your Node-RED projects. Created (and curated) by FlowFuse and the Node-RED community.
+meta:
+ title: Integrations
+---
+
+{% extends 'layouts/catalog.njk' %}
+
+{% block title %}
+Integrations
+{% endblock %}
+
+{% block description %}
+Explore the list of integrations and modules available for your Node-RED projects. Created (and curated) by FlowFuse and the Node-RED community.
+{% endblock %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
X Integrations
+
Loading...
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
+
+
\ No newline at end of file
diff --git a/src/landing/accelerating-industrial-innovation-with-low-code-platforms.njk b/src/landing/accelerating-industrial-innovation-with-low-code-platforms.njk
new file mode 100644
index 0000000000..47831a5d5a
--- /dev/null
+++ b/src/landing/accelerating-industrial-innovation-with-low-code-platforms.njk
@@ -0,0 +1,52 @@
+---
+layout: layouts/base.njk
+image: /landing/images/low-code-whitepaper.png
+title: Empowering Engineers to Drive Innovation
+tags:
+ - whitepaper
+thumbnail: /resources/images/Whitepaper_Accelerating-Industrial-Innovation-With-Low-Code-Platforms.png
+meta:
+ title: "Accelerating Industrial Innovation with Low-Code Platforms"
+ description: "Discover how low-code platforms are accelerating industrial innovation, and how you can leverage them to drive digital transformation in your manufacturing business."
+hubspot:
+ script: "hubspot/hs-form.njk"
+ formId: b9b00a26-31ee-435a-b5fc-ebc38cd90055
+ cta: "cta-download-now"
+ reference: "low-code-whitepaper"
+---
+
The competitive industrial landscape puts immense pressure on companies to innovate. However, traditional IT processes often hinder operational technology (OT) engineers, preventing them from quickly implementing solutions that drive efficiency.
+
+
+
+
+
+
+
Accelerating Industrial Innovation with Low-Code Platforms
+
We explore the challenges faced by engineers and introduce low-code platforms as a powerful solution. By empowering domain experts, low-code platforms like Node-RED enable rapid application development, prototyping, and iteration, fostering a culture of continuous improvement and driving significant cost reduction. Add to this FlowFuse enterprise-grade features and you have powerful production-ready solutions.
+
+
+ {% include "social-proof.njk" %}
+
+
+
+
+
Download our whitepaperto learn how to unleash your engineers' potential and accelerate industrial innovation.
+ {% include hubspot.script %}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/landing/cloud-signup/index.njk b/src/landing/cloud-signup/index.njk
deleted file mode 100644
index 68e7dee3fc..0000000000
--- a/src/landing/cloud-signup/index.njk
+++ /dev/null
@@ -1,135 +0,0 @@
----
-layout: page
-nohero: true
-meta:
- title: Start using Node-RED online for free
- keywords: Node-RED, FlowFuse Cloud, Node-RED use cases, Node-RED FAQs, Node-RED tips, Node-RED concepts
- robots: noindex
----
-
-
-
-
-
-
-
- Low-Code
-
-
Programming
-
Integration
-
Visualisation
-
-
-
- Start using Node-RED online for free
-
-
- Enhanced Node-RED security, collaboration, and features in our fully managed FlowFuse Cloud. Simplify integration, elevate visualization, and streamline workflows effortlessly.
-
- Node-RED facilitates seamless integration with a wide array of digital services, including protocols (OPC-UA, Modbus, Siemens S7), databases, APIs, and devices.
-
-
- See more customer stories {% include "components/icons/chevron-right-sm.svg" %}
-
diff --git a/src/landing/images/low-code-whitepaper.png b/src/landing/images/low-code-whitepaper.png
new file mode 100644
index 0000000000..41e31c0a6a
Binary files /dev/null and b/src/landing/images/low-code-whitepaper.png differ
diff --git a/src/node-red/adoption-maturity.njk b/src/node-red/adoption-maturity.njk
deleted file mode 100644
index 95119630a3..0000000000
--- a/src/node-red/adoption-maturity.njk
+++ /dev/null
@@ -1,10 +0,0 @@
----
-layout: page
-nohero: true
-meta:
- title: Node-RED Adoption Maturity
-description:
- FlowFuse helps you assess your Node-RED adoption maturity level
----
-
-
\ No newline at end of file
diff --git a/src/node-red/database/timescaledb.md b/src/node-red/database/timescaledb.md
index 59214502d1..be7588e68a 100644
--- a/src/node-red/database/timescaledb.md
+++ b/src/node-red/database/timescaledb.md
@@ -265,4 +265,4 @@ DROP TABLE IF EXISTS sensor_data;
1. To test the imported flows, you need to deploy them. To do that, click on the deploy button located in the top right corner.
-After deploying the flow, you can test each operation such as creating, deleting, updating, and other queries by clicking on the inject button. Upon successful operation, you will be able to see the results in the debug panel of the sidebar. If you want to learn any additional information about PostgreSQL, you can refer to the [Using PostgreSQL with Node-RED](/blog/2024/02/postgresql-with-node-red/) where you will also find the section which shows the messages received after a successful operation by the PostgresWQL node.
\ No newline at end of file
+After deploying the flow, you can test each operation such as creating, deleting, updating, and other queries by clicking on the inject button. Upon successful operation, you will be able to see the results in the debug panel of the sidebar. If you want to learn any additional information about PostgreSQL, you can refer to the [Using PostgreSQL with Node-RED](/node-red/database/postgresql/) where you will also find the section which shows the messages received after a successful operation by the PostgresWQL node.
\ No newline at end of file
diff --git a/src/node-red/getting-started/editor/index.md b/src/node-red/getting-started/editor/index.md
index 5416fb29a5..27862cacb3 100644
--- a/src/node-red/getting-started/editor/index.md
+++ b/src/node-red/getting-started/editor/index.md
@@ -1,11 +1,12 @@
---
eleventyNavigation:
key: Editor
+ order: 1
parent: Getting Started
meta:
- title: Node-RED Editor
+ title: Getting Started with the Node-RED Editor
description: Learn about the powerful features of Node-RED Editor.
- keywords: node-red, node-red editor
+ keywords: node red editor, node-red editor, nodered flow, node-red flows, nodered workspace
---
# {{meta.title}}
diff --git a/src/node-red/getting-started/images/adding-breakpoints.gif b/src/node-red/getting-started/images/adding-breakpoints.gif
new file mode 100644
index 0000000000..65241c9151
Binary files /dev/null and b/src/node-red/getting-started/images/adding-breakpoints.gif differ
diff --git a/src/node-red/getting-started/images/breakpoint-debugging.gif b/src/node-red/getting-started/images/breakpoint-debugging.gif
new file mode 100644
index 0000000000..2d104caec6
Binary files /dev/null and b/src/node-red/getting-started/images/breakpoint-debugging.gif differ
diff --git a/src/node-red/getting-started/images/breakpoints-section.png b/src/node-red/getting-started/images/breakpoints-section.png
new file mode 100644
index 0000000000..98fdfb2224
Binary files /dev/null and b/src/node-red/getting-started/images/breakpoints-section.png differ
diff --git a/src/node-red/getting-started/images/debugger-controls.png b/src/node-red/getting-started/images/debugger-controls.png
new file mode 100644
index 0000000000..750f724d88
Binary files /dev/null and b/src/node-red/getting-started/images/debugger-controls.png differ
diff --git a/src/node-red/getting-started/images/disable-enable-button.png b/src/node-red/getting-started/images/disable-enable-button.png
new file mode 100644
index 0000000000..958aa08929
Binary files /dev/null and b/src/node-red/getting-started/images/disable-enable-button.png differ
diff --git a/src/node-red/getting-started/images/disabling-breakpoints.gif b/src/node-red/getting-started/images/disabling-breakpoints.gif
new file mode 100644
index 0000000000..9c42de0b54
Binary files /dev/null and b/src/node-red/getting-started/images/disabling-breakpoints.gif differ
diff --git a/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png
new file mode 100644
index 0000000000..7a00120b8c
Binary files /dev/null and b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png differ
diff --git a/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png
new file mode 100644
index 0000000000..d16f0fee02
Binary files /dev/null and b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png differ
diff --git a/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png
new file mode 100644
index 0000000000..ff5cc83b07
Binary files /dev/null and b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png differ
diff --git a/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png
new file mode 100644
index 0000000000..b719f2427a
Binary files /dev/null and b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png differ
diff --git a/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-switch-node.png b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-switch-node.png
new file mode 100644
index 0000000000..be28e9b5e5
Binary files /dev/null and b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-data-with-node-red-switch-node.png differ
diff --git a/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-switch-node.png b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-switch-node.png
new file mode 100644
index 0000000000..e6e0f59830
Binary files /dev/null and b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-switch-node.png differ
diff --git a/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-with-node-red.png b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-with-node-red.png
new file mode 100644
index 0000000000..1f6517c649
Binary files /dev/null and b/src/node-red/getting-started/images/filtering-mapping-sorting-reducing-with-node-red.png differ
diff --git a/src/blog/2024/09/images/if-else-with-node-red.png b/src/node-red/getting-started/images/if-else-with-node-red.png
similarity index 100%
rename from src/blog/2024/09/images/if-else-with-node-red.png
rename to src/node-red/getting-started/images/if-else-with-node-red.png
diff --git a/src/node-red/getting-started/images/message-section.png b/src/node-red/getting-started/images/message-section.png
new file mode 100644
index 0000000000..255e7bc5b7
Binary files /dev/null and b/src/node-red/getting-started/images/message-section.png differ
diff --git a/src/node-red/getting-started/images/proceeding-further-execution.gif b/src/node-red/getting-started/images/proceeding-further-execution.gif
new file mode 100644
index 0000000000..228265ecb7
Binary files /dev/null and b/src/node-red/getting-started/images/proceeding-further-execution.gif differ
diff --git a/src/node-red/getting-started/images/removing-breakpoints.gif b/src/node-red/getting-started/images/removing-breakpoints.gif
new file mode 100644
index 0000000000..c1426bf55c
Binary files /dev/null and b/src/node-red/getting-started/images/removing-breakpoints.gif differ
diff --git a/src/node-red/getting-started/index.md b/src/node-red/getting-started/index.md
index 3ae0dc4129..dfc5ce119d 100644
--- a/src/node-red/getting-started/index.md
+++ b/src/node-red/getting-started/index.md
@@ -13,3 +13,5 @@ meta:
This section provides an overview of Node-RED, a robust visual tool designed for integrating IoT devices and automating workflows without needing extensive programming knowledge.
- **Node-RED Editor**: This [documentation](./editor/) provides a detailed overview of the Node-RED Editor, covering each feature included in the editor.
+- **Node-RED Messaging**: This [documentation](./node-red-messages.md)]provides practical guide to working with Node-RED messages, ensuring error-free flows and optimized data handling.
+-- **Node-RED Programming**: This [documentation](./programming/) provides guide on the foundational programming concepts of Node-RED to enhance your development process.
\ No newline at end of file
diff --git a/src/node-red/getting-started/node-red-messages.md b/src/node-red/getting-started/node-red-messages.md
index 27024e4dc1..2fd84742a0 100644
--- a/src/node-red/getting-started/node-red-messages.md
+++ b/src/node-red/getting-started/node-red-messages.md
@@ -1,6 +1,7 @@
---
eleventyNavigation:
- key: Node-RED Messages
+ key: Working with Messages
+ order: 2
parent: Getting Started
meta:
title: Understanding Node-RED Messages
@@ -217,10 +218,4 @@ This mistake often occurs in the change node where an inject node sends `msg.pay
By mastering the intricacies of Node-RED message objects and avoiding common pitfalls, you can build more robust and efficient workflows. Understanding how to work with JSON data, cloning messages, and correctly handling properties ensures that your data flows smoothly between nodes.
-As you continue exploring and building with Node-RED, keep these best practices in mind to maintain error-free and high-performance flows.
-
-### Up Next
-
-- [Understanding Node, Flow, Global, and Environment Variables in Node-RED](/blog/2024/05/understanding-node-flow-global-environment-variables-in-node-red/)
-- [How to Filter, Map, Sort, and Reduce Data in Node-RED](/blog/2024/06/filtering-mapping-sorting-reducing-with-node-red/).
-- [How to Use If-Else Logic in Node-RED: A Step-by-Step Guide](/blog/2024/09/node-red-if-else-logic-guide/)
+As you continue exploring and building with Node-RED, keep these best practices in mind to maintain error-free and high-performance flows.
diff --git a/src/blog/2024/06/filtering-mapping-sorting-reducing-with-node-red.md b/src/node-red/getting-started/programming/data-tranformation.md
similarity index 91%
rename from src/blog/2024/06/filtering-mapping-sorting-reducing-with-node-red.md
rename to src/node-red/getting-started/programming/data-tranformation.md
index 521675baca..3990e0197a 100644
--- a/src/blog/2024/06/filtering-mapping-sorting-reducing-with-node-red.md
+++ b/src/node-red/getting-started/programming/data-tranformation.md
@@ -1,19 +1,12 @@
---
-title: How to Filter, Map, Sort, and Reduce Data in Node-RED
-subtitle: Step-by-step guide to use the most common data transformation operations like filtering, mapping, sorting and reducing in Node-RED.
-description: Learn how to perform data transformation in Node-RED with a low-code approach.
-date: 2024-06-26
-authors: ["sumit-shinde"]
-image: /blog/2024/06/images/filtering-mapping-sorting-reducing-with-node-red.png
-tags:
- - posts
- - node-red
- - how to filter data in node-red
- - how to map array in node-red
- - how to map data in node-red
- - how to sort data in node-red
- - how to reduce data in node-red
- - data transformation in node-red
+eleventyNavigation:
+ key: Data Tranformation
+ parent: Programming
+meta:
+ title: How to Filter, Map, Sort, and Reduce Data in Node-RED
+ description: Learn how to perform data transformation in Node-RED with a low-code approach.
+ keywords: how to filter data in node-red, how to map array in node-red, how to map data in node-red, how to sort data in node-red, how to reduce data in node-red, data transformation in node-red
+image: /node-red/getting-started/images/filtering-mapping-sorting-reducing-with-node-red.png
---
[Node-RED](/node-red/) is a visual programming platform known for its user-friendly interface and low-code approach widely used for IoT application developement. In IoT applications, efficient data processing is crucial, and operations such as filter, map, sort, and reduce are essential for simplifying data transformations. However, many users struggle to implement these operations while sticking to a low-code approach, often relying on function nodes, which can introduce unnecessary complexity. In this guide, we will show you how to filter, map, sort, and reduce data with Node-RED for efficient data tranformation while sticking to low-code approach.
@@ -103,11 +96,11 @@ Mapping often refers to the process of applying a function to each item in a lis
1. Drag a Split node onto the canvas, the Split node will Split a message into a sequence of messages which will allow us to operate on each message, additioanlly split node bind the metadata to each of the object splitted, this metadata will helps join node to merge the all of message sequence back to an array.
2. Drag a Change node onto the canvas, set the `msg.payload.temperature` to `payload.temperature - 273.15` as JSONata expression.
-!["Screenshot of the change node converting temperature kelvin data from celsius"](./images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png "Screenshot of the change node converting temperature kelvin data from celsius"){data-zoomable}
+!["Screenshot of the change node converting temperature kelvin data from celsius"](../images/filtering-mapping-sorting-reducing-data-with-node-red-change-node.png "Screenshot of the change node converting temperature kelvin data from celsius"){data-zoomable}
3. Now drag the Join node onto the canvas and set the Mode to "Automatic". This will automatically join all the messages originating from the Split node into an array.
-!["Screenshot join node creating new array by combining message sequnce"](./images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png "Screenshot join node creating new array by combining message sequnce"){data-zoomable}
+!["Screenshot join node creating new array by combining message sequnce"](../images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-combining-node.png "Screenshot join node creating new array by combining message sequnce"){data-zoomable}
{% renderFlow %}
[{"id":"306d455509a3747e","type":"inject","z":"977143edb097b685","name":"Inject the sample data","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[ {\"timestamp\":\"2024-06-17T10:00:00Z\",\"temperature\":298.15}, {\"timestamp\":\"2024-06-17T11:00:00Z\",\"temperature\":299.15}, {\"timestamp\":\"2024-06-17T10:30:00Z\",\"temperature\":300.15}, {\"timestamp\":\"2024-06-17T10:15:00Z\",\"temperature\":301.15}, {\"timestamp\":\"2024-06-17T10:45:00Z\",\"temperature\":303.15}, {\"timestamp\":\"2024-06-18T09:00:00Z\",\"temperature\":297.15}, {\"timestamp\":\"2024-06-18T10:00:00Z\",\"temperature\":300.15}, {\"timestamp\":\"2024-06-18T11:00:00Z\",\"temperature\":301.15}, {\"timestamp\":\"2024-06-18T12:00:00Z\",\"temperature\":302.15}, {\"timestamp\":\"2024-06-19T10:00:00Z\",\"temperature\":298.15}, {\"timestamp\":\"2024-06-19T11:00:00Z\",\"temperature\":299.15} ]","payloadType":"json","x":500,"y":540,"wires":[["9d9c0688468e1aae"]]},{"id":"9d9c0688468e1aae","type":"split","z":"977143edb097b685","name":"Splits a message into a sequence of messages.","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":860,"y":540,"wires":[["785125a70fbdc554"]]},{"id":"785125a70fbdc554","type":"change","z":"977143edb097b685","name":"Converting the temperature data from kelvin to celsius","rules":[{"t":"set","p":"payload.temperature","pt":"msg","to":"payload.temperature - 273.15","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1340,"y":540,"wires":[["9cd6e05b88ec26fd"]]},{"id":"9cd6e05b88ec26fd","type":"join","z":"977143edb097b685","name":"Creating new array by combining message sequence","mode":"auto","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":1820,"y":540,"wires":[["244660d81bf5e5b2"]]},{"id":"244660d81bf5e5b2","type":"debug","z":"977143edb097b685","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":2140,"y":540,"wires":[]}]
@@ -121,7 +114,7 @@ Filtering is the process of selecting specific items from an array to create a n
2. Set the condition to check whether `msg.payload.timestamp` includes '2024-06-17' This condition ensures that only messages containing the specified date in their timestamp are sent further.
3. Next, In the switch node checked the option "recreate message sequences" that will repair the `msg.parts` metadata added by Split node if any messages are dropped by the switch node.
-!["Screenshot of switch node filtering data bases on timestamp"](./images/filtering-mapping-sorting-reducing-switch-node.png "Screenshot switch node filtering data bases on timestamp"){data-zoomable}
+!["Screenshot of switch node filtering data bases on timestamp"](../images/filtering-mapping-sorting-reducing-switch-node.png "Screenshot switch node filtering data bases on timestamp"){data-zoomable}
{% renderFlow %}
[{"id":"4e76a2328451b4c3","type":"inject","z":"977143edb097b685","name":"Inject the sample data","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"timestamp\":\"2024-06-17T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-17T11:00:00Z\",\"temperature\":299.15},{\"timestamp\":\"2024-06-17T10:30:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-17T10:15:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-17T10:45:00Z\",\"temperature\":303.15},{\"timestamp\":\"2024-06-18T09:00:00Z\",\"temperature\":297.15},{\"timestamp\":\"2024-06-18T10:00:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-18T11:00:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-18T12:00:00Z\",\"temperature\":302.15},{\"timestamp\":\"2024-06-19T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-19T11:00:00Z\",\"temperature\":299.15}]","payloadType":"json","x":380,"y":480,"wires":[["f4e07a31f505a50c"]]},{"id":"f4e07a31f505a50c","type":"split","z":"977143edb097b685","name":"Splits a message into a sequence of messages.","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":680,"y":480,"wires":[["fcd6a0a1497203a9"]]},{"id":"bed1a7d861fa9e3d","type":"join","z":"977143edb097b685","name":"Creating new array by combining message sequence","mode":"auto","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"0","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":1940,"y":480,"wires":[["2449811ec79bc220"]]},{"id":"2449811ec79bc220","type":"debug","z":"977143edb097b685","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2240,"y":480,"wires":[]},{"id":"7797594a508cfb46","type":"switch","z":"977143edb097b685","name":"Routing message sequence based on condition","property":"payload.timestamp","propertyType":"msg","rules":[{"t":"cont","v":"2024-06-17","vt":"str"}],"checkall":"true","repair":true,"outputs":1,"x":1520,"y":480,"wires":[["bed1a7d861fa9e3d"]]},{"id":"fcd6a0a1497203a9","type":"change","z":"977143edb097b685","name":"Converting the temperature data from kelvin to celsius","rules":[{"t":"set","p":"payload.temperature","pt":"msg","to":"payload.temperature - 273.15","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1100,"y":480,"wires":[["7797594a508cfb46"]]}]
@@ -135,7 +128,7 @@ To perform sorting, we have to use the Node-RED Sort Node.
1. Drag the Sort node on the canvas.
2. Set the key to `timestamp` as the JSONata expression and then set the order to 'ascending'. We set the key to timestamp because we want to sort the data based on the timestamp. You can set it to temperature if you want to sort based on that instead.
-!["Screenshot of sort node sorting data in ascending order based on timestamp"](./images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png "Screenshot of sort node sorting data in ascending order based on timestamp"){data-zoomable}
+!["Screenshot of sort node sorting data in ascending order based on timestamp"](../images/filtering-mapping-sorting-reducing-data-with-node-red-sort-node.png "Screenshot of sort node sorting data in ascending order based on timestamp"){data-zoomable}
{% renderFlow %}
[{"id":"8b66990baca45f2d","type":"inject","z":"977143edb097b685","name":"Inject the sample data","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"timestamp\":\"2024-06-17T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-17T11:00:00Z\",\"temperature\":299.15},{\"timestamp\":\"2024-06-17T10:30:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-17T10:15:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-17T10:45:00Z\",\"temperature\":303.15},{\"timestamp\":\"2024-06-18T09:00:00Z\",\"temperature\":297.15},{\"timestamp\":\"2024-06-18T10:00:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-18T11:00:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-18T12:00:00Z\",\"temperature\":302.15},{\"timestamp\":\"2024-06-19T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-19T11:00:00Z\",\"temperature\":299.15}]","payloadType":"json","x":400,"y":540,"wires":[["f0d48b57cbd10fdd"]]},{"id":"f0d48b57cbd10fdd","type":"split","z":"977143edb097b685","name":"Splits a message into a sequence of messages.","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":740,"y":540,"wires":[["fdc21a267f7583e7"]]},{"id":"fdc21a267f7583e7","type":"change","z":"977143edb097b685","name":"Correcting the temperature property","rules":[{"t":"set","p":"payload.temperature","pt":"msg","to":"payload.temperature - 273.15","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1080,"y":540,"wires":[["7d4ce2d4e21cd914"]]},{"id":"c273215c8c9cebee","type":"join","z":"977143edb097b685","name":"Creating new array by combining message sequence","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":1860,"y":540,"wires":[["c423efbd0581367a"]]},{"id":"e70d15ced7405755","type":"debug","z":"977143edb097b685","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2480,"y":540,"wires":[]},{"id":"7d4ce2d4e21cd914","type":"switch","z":"977143edb097b685","name":"Routing message sequence based on condition","property":"payload.timestamp","propertyType":"msg","rules":[{"t":"cont","v":"2024-06-17","vt":"str"}],"checkall":"true","repair":true,"outputs":1,"x":1440,"y":540,"wires":[["c273215c8c9cebee"]]},{"id":"c423efbd0581367a","type":"sort","z":"977143edb097b685","name":"Sorting data based on timestamp","order":"ascending","as_num":false,"target":"payload","targetType":"msg","msgKey":"timestamp","msgKeyType":"jsonata","seqKey":"payload.timestamp","seqKeyType":"jsonata","x":2240,"y":540,"wires":[["e70d15ced7405755"]]}]
@@ -149,14 +142,10 @@ Reducing refers to the process of combining elements of a data structure (such a
2. Drag Join another node onto the canvas.
2. Select the mode to "reduce sequence", set Reduce exp to `$A+ payload.temperature`, initial value to 0 and the Fix-up exp to `$A/$N`
-!["Screenshot of join node calculating average of the temperature"](./images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png "Screenshot of join node calculating average of the temperature"){data-zoomable}
+!["Screenshot of join node calculating average of the temperature"](../images/filtering-mapping-sorting-reducing-data-with-node-red-join-node-calculating-avg.png "Screenshot of join node calculating average of the temperature"){data-zoomable}
In this configuration, the Join node is set to reduce sequence mode. The initial value of the accumulator ($A) is initialized to 0. As each message is processed, the current temperature (payload.temperature) is added to $A. Once all messages have been processed, the accumulated sum $A is divided by the total number of messages ($N) to compute the average temperature.
{% renderFlow %}
[{"id":"5ff0902202c21e85","type":"inject","z":"977143edb097b685","name":"Inject the sample data","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"timestamp\":\"2024-06-17T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-17T11:00:00Z\",\"temperature\":299.15},{\"timestamp\":\"2024-06-17T10:30:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-17T10:15:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-17T10:45:00Z\",\"temperature\":303.15},{\"timestamp\":\"2024-06-18T09:00:00Z\",\"temperature\":297.15},{\"timestamp\":\"2024-06-18T10:00:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-18T11:00:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-18T12:00:00Z\",\"temperature\":302.15},{\"timestamp\":\"2024-06-19T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-19T11:00:00Z\",\"temperature\":299.15}]","payloadType":"json","x":580,"y":620,"wires":[["993ffc096c3e8089"]]},{"id":"993ffc096c3e8089","type":"split","z":"977143edb097b685","name":"Splits a message into a sequence of messages.","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":900,"y":620,"wires":[["3bbb68c2dc2a0f5c"]]},{"id":"3bbb68c2dc2a0f5c","type":"change","z":"977143edb097b685","name":"Correcting the temperature property","rules":[{"t":"set","p":"payload.temperature","pt":"msg","to":"payload.temperature - 273.15","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":1280,"y":620,"wires":[["580210c585730f97"]]},{"id":"01e7066b3ff012e7","type":"join","z":"977143edb097b685","name":"Creating new array by combining message sequence","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2060,"y":620,"wires":[["27cc5d5e90f7facd","6116c1efc3f7f682"]]},{"id":"580210c585730f97","type":"switch","z":"977143edb097b685","name":"Routing message sequence based on condition","property":"payload.timestamp","propertyType":"msg","rules":[{"t":"cont","v":"2024-06-17","vt":"str"}],"checkall":"true","repair":true,"outputs":1,"x":1640,"y":620,"wires":[["01e7066b3ff012e7"]]},{"id":"27cc5d5e90f7facd","type":"sort","z":"977143edb097b685","name":"Sorting data based on timestamp","order":"ascending","as_num":false,"target":"payload","targetType":"msg","msgKey":"timestamp","msgKeyType":"jsonata","seqKey":"payload.timestamp","seqKeyType":"jsonata","x":2440,"y":620,"wires":[["f1f93a7b4575daf1"]]},{"id":"362ec9c482688cf6","type":"debug","z":"977143edb097b685","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":3140,"y":740,"wires":[]},{"id":"b9f2f83a330140ca","type":"join","z":"977143edb097b685","name":"Calculating the the average of temperature","mode":"reduce","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":true,"timeout":"","count":"","reduceRight":false,"reduceExp":"$A+ payload.temperature","reduceInit":"0","reduceInitType":"num","reduceFixup":"$A/$N","x":2890,"y":740,"wires":[["362ec9c482688cf6"]]},{"id":"f1f93a7b4575daf1","type":"debug","z":"977143edb097b685","name":"debug 3","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":2720,"y":620,"wires":[]},{"id":"6116c1efc3f7f682","type":"split","z":"977143edb097b685","name":"Splits a message into a sequence of messages.","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":2460,"y":740,"wires":[["b9f2f83a330140ca"]]}]
{% endrenderFlow %}
-
-## Conclusion
-
-Using Node-RED’s low-code approach for filtering, mapping, sorting, and reducing data allows you to process and transform data effectively without relying on complex programming languages. This approach helps maintain flows that are easy to understand and modify which contributes to efficient application development.
diff --git a/src/node-red/getting-started/programming/debugging-flows.md b/src/node-red/getting-started/programming/debugging-flows.md
new file mode 100644
index 0000000000..45bfc338c8
--- /dev/null
+++ b/src/node-red/getting-started/programming/debugging-flows.md
@@ -0,0 +1,168 @@
+---
+eleventyNavigation:
+ key: Debugging
+ parent: Programming
+meta:
+ title: How to Debug Node-RED Flows Using Debugger
+ description: Debug Node-RED flows using the Debugger. Learn to set breakpoints, step through execution, and inspect messages for efficient troubleshooting.
+ keywords: node-red-debugger, node red debug, nodered debug, node-red debug, how to debug nodered flows, how to debug node-red flows
+---
+
+# {{meta.title}}
+
+When it comes to debugging application flows in Node-RED, the tool most Node-RED developers often reach for is the [Debug](/node-red/core-nodes/debug/) node. It provides a simple way to output message payloads or other data to the debug sidebar, helping you gain insights into how your flow is working. But what if you needed more control and visibility over the flow’s execution? What if you wanted to step through each node in detail, inspect variables, or pause the flow at specific points to understand what’s happening?
+
+
+
+In these cases, using the **Node-RED Debugger** becomes invaluable. The debugger allows you to trace the execution of your flows interactively, set breakpoints, and gain deeper insights beyond what the Debug node offers. This Documentation will show you how to effectively use the Node-RED Debugger to pinpoint issues and fine-tune your applications.
+
+## What is Debugging, and Why is it crucial in Node-RED Flows?
+
+Debugging is finding and fixing issues in your code or workflow. In Node-RED, debugging helps you understand how your flows function by providing insights into the data being processed and identifying where things might go wrong.
+
+Typically, developers use the **Debug** node to output message payloads and view them in the sidebar. While this is useful for simple debugging, it can be limiting when you need to troubleshoot more complex scenarios. As flows become larger and more interconnected, pinpointing the exact source of an issue using just a Debug node can be like searching for a needle in a haystack.
+
+That’s where the **Node-RED Debugger** steps in, offering a more granular approach to debugging. The debugger allows you to:
+
+- **Manual stop**: to manually stop the runtime and execution of the flow
+- **Step through** the execution of nodes one by one.
+- **Set breakpoints** to pause the flow at critical points.
+- **Inspect messages** and data in real-time, including message payloads, context, and more.
+
+## Installing and Enabling Node-RED Debugger
+
+To install the Node-RED Debugger:
+
+1. Click the menu icon in the top-right corner.
+2. Select **Manage palette** and switch to the **Install** tab.
+3. Search for [node-red-debugger](https://flows.nodered.org/node/node-red-debugger).
+4. Click **Install** to add the package.
+
+### Enabling the Debugger
+
+![Image showing the option to turn the debugger on and off in the sidebar](../images/disable-enable-button.png
+){data-zoomable}
+_Image showing the option to turn the debugger on and off in the sidebar_
+
+Once installed, open the debugger tab in the sidebar by clicking the collapsible arrow icon in the right sidebar and selecting **Flow Debugger**.
+
+In the new Debugger tab, toggle the switch at the sidebar's top-left corner to enable the debugger. By default, it is disabled, so enable it before proceeding further.
+
+## Using the Debugger for Debugging Flows
+
+To illustrate how to use the Node-RED Debugger effectively, let’s consider a flow that simulates sensor data processing. The flow consists of an Inject node that sends a set of simulated sensor data, including temperature readings in Kelvin and their corresponding dates. The subsequent nodes perform the following operations:
+
+1. Convert the temperature from Kelvin to Celsius.
+2. Filter the data to forward specific date entries.
+3. Create a new array from the filtered results.
+4. Split the array and calculate the average temperature.
+
+{% renderFlow %}
+[{"id":"3c012808d6b397e2","type":"group","z":"8d55eeb793510c58","style":{"stroke":"#b2b3bd","stroke-opacity":"1","fill":"#f2f3fb","fill-opacity":"0.5","label":true,"label-position":"nw","color":"#32333b"},"nodes":["5ff0902202c21e85","993ffc096c3e8089","3bbb68c2dc2a0f5c","580210c585730f97","362ec9c482688cf6","b9f2f83a330140ca","6116c1efc3f7f682","01e7066b3ff012e7"],"x":2674,"y":199,"w":532,"h":642},{"id":"5ff0902202c21e85","type":"inject","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"Inject the sample data","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[{\"timestamp\":\"2024-06-17T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-17T11:00:00Z\",\"temperature\":299.15},{\"timestamp\":\"2024-06-17T10:30:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-17T10:15:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-17T10:45:00Z\",\"temperature\":303.15},{\"timestamp\":\"2024-06-18T09:00:00Z\",\"temperature\":297.15},{\"timestamp\":\"2024-06-18T10:00:00Z\",\"temperature\":300.15},{\"timestamp\":\"2024-06-18T11:00:00Z\",\"temperature\":301.15},{\"timestamp\":\"2024-06-18T12:00:00Z\",\"temperature\":302.15},{\"timestamp\":\"2024-06-19T10:00:00Z\",\"temperature\":298.15},{\"timestamp\":\"2024-06-19T11:00:00Z\",\"temperature\":299.15}]","payloadType":"json","x":2820,"y":240,"wires":[["993ffc096c3e8089"]]},{"id":"993ffc096c3e8089","type":"split","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"Splits a message into a sequence of messages.","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":2920,"y":320,"wires":[["3bbb68c2dc2a0f5c"]]},{"id":"3bbb68c2dc2a0f5c","type":"change","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"Kelvin to celcius","rules":[{"t":"set","p":"payload.temperature","pt":"msg","to":"payload.temperature - 273.15","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":2840,"y":400,"wires":[["580210c585730f97"]]},{"id":"580210c585730f97","type":"switch","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"Routing message sequence based on condition","property":"payload.timestamp","propertyType":"msg","rules":[{"t":"cont","v":"2024-06-17","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":2940,"y":480,"wires":[["01e7066b3ff012e7"]]},{"id":"362ec9c482688cf6","type":"debug","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2940,"y":800,"wires":[]},{"id":"b9f2f83a330140ca","type":"join","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"Calculating the the average of temperature","mode":"reduce","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","useparts":true,"accumulate":true,"timeout":"","count":"","reduceRight":false,"reduceExp":"$A+ payload.temperature","reduceInit":"0","reduceInitType":"num","reduceFixup":"$A/$N","x":2970,"y":700,"wires":[["362ec9c482688cf6"]]},{"id":"6116c1efc3f7f682","type":"split","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"Splits a message into a sequence of messages.","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":2980,"y":640,"wires":[["b9f2f83a330140ca"]]},{"id":"01e7066b3ff012e7","type":"join","z":"8d55eeb793510c58","g":"3c012808d6b397e2","name":"Creating new array by combining message sequence","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","useparts":true,"accumulate":false,"timeout":"","count":"","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":2980,"y":560,"wires":[["6116c1efc3f7f682"]]}]
+{% endrenderFlow %}
+
+However, clicking the **Inject** node once does not produce the expected results; instead, it requires clicking again to get the output. This indicates that there might be a timing issue or a logic flaw in the flow that prevents it from processing correctly on the first click. Let's debug the flow with a debugger now.
+
+### Understanding the Debugger sidebar tab
+
+Before proceeding further, let's first understand the Debugger tab and its different sections. The Debugger tab contains two main areas: **Breakpoints** and **Messages**.
+
+![Image showing the breakpoint section in the sidebar](../images/breakpoints-section.png
+){data-zoomable}
+_Image showing the breakpoint section in the sidebar_
+
+
+1. **Breakpoints**: This section lists all the breakpoints you have set within your flow. It allows you to manage and navigate through the breakpoints effectively.
+
+![Image showing the messages section in the sidebar](../images/message-section.png){data-zoomable}
+_Image showing the messages section in the sidebar_
+
+2. **Messages**: This section shows any messages currently queued up in the runtime, giving you visibility into the data being processed at various stages of your flow.
+
+![Image showing the controls in the sidebar](../images/debugger-controls.png){data-zoomable}
+_Image showing the controls in the sidebar_
+
+At the top of the Debugger tab, you will find controls to stop the runtime manually and buttons to resume execution and step through the flow one input or output at a time when it is paused.
+
+### Pausing the Runtime Manually and Navigating Through Each Step
+
+Now, let's diagnose the flow. We’ll manually pause the runtime, then step through each part of the flow using the debugger controls, observing the changes at each step.
+
+![Image shows the execution of flow while debugger enabled and how to proceed to subsequent execution](../images/proceeding-further-execution.gif){data-zoomable}
+_Image show the execution of flow while debugger enabled and how to proceed to subsequent execution_
+
+Follow these steps:
+
+1. Go to the **Debugger** tab in the sidebar.
+2. Click the **Pause** button in the top-right corner to halt the runtime.
+3. Next, click the **Inject** button to start the execution of the flow.
+4. Once paused, you'll notice that the flow executes step by step, depending on the total inputs, outputs, and number of messages they produce and the message length. Each message will be printed in the **Messages** section of the debugger tab. At the top of each message, the name of the node that generated it will be displayed.
+5. To proceed, click the **step forward** button (represented as an array icon next to the pause button). As you move forward, the **Messages** field will update with the message sent by each node, and the execution will also resume at the next step. Additionally, the input/output of the node sending the message will be highlighted in the flow with a light-bordered rectangle.
+6. As we progress through the execution, everything works fine up to the **Switch** node, where the message passes through correctly. However, when you reach the **Join** node, the highlighted box does not move forward, and no message is printed in the debugger tab. This indicates the issue lies between the **Switch** node and the **Join** node.
+
+Manually stepping through the flow is useful for understanding how the flow operates, making it easier to identify where breakpoints should be placed effectively.
+
+## Adding Breakpoints for Debugging Flows
+
+Now that we've pinpointed the problem to be somewhere between the[Switch](/node-red/core-nodes/switch/) node and the [Join](/node-red/core-nodes/join/) node, it’s time to leverage breakpoints for a more efficient debugging experience. These breakpoints allow you to pause the flow automatically allowing you to inspect messages and context without having to step through each node manually. This is especially useful for larger or more intricate flows.
+
+First, let’s discuss where exactly we should add breakpoints. Our previous debugging shows that all 11 messages are correctly reaching the input of the Switch node. However, we need to check how many messages pass through the Switch node's condition and whether they contain the required part object for the Join node to create a single value (array).
+
+To do this, we should add breakpoints at the output of the Switch node to monitor how many messages pass through, as well as at the input and output of the Join node. This will help us determine how many messages are reaching the input of the Join node and whether they contain the part object necessary for the Join node to automatically convert them into an array of those objects.
+
+![Image showing how to add breakpoints](../images/adding-breakpoints.gif){data-zoomable}
+_Image showing how to add breakpoints_
+
+To add a breakpoint:
+
+1. In the flow, find the node where you want to add the breakpoint.
+2. Hover over the input or output of the desired node; a dotted rectangle will appear.
+3. Click within that rectangle to add the breakpoint. It will turn solid blue, indicating that your breakpoint has been added.
+4. The breakpoint will appear in the debugger sidebar tab list once added.
+
+### Debugging: Pinpointing the Exact Problem and Solving the Issue in the Flow
+
+![Image showing the execution of the flow with added breakpoints, indicating the number of each input/output being sent and received for debugging.](../images/breakpoint-debugging.gif){data-zoomable}
+_Image showing the execution of the flow with added breakpoints, indicating the number of each input/output being sent and received for debugging._
+
+Start by clicking the inject node to trigger execution, which will pause at the output of the switch node. Check the blue rectangle to see how many messages have passed through; it shows only a few, not 11, indicating that only those messages met the condition. As you proceed, you will see those messages also reaching the input of the join node correctly.
+
+Next, look in the debugger tab's messages section to verify if these messages have the `parts` property, noting the value of `count`. You will see that the count value is 11, which means the join node is waiting for all 11 messages to create a single message; otherwise, it will not send anything. Click the arrow button to see how many messages reach the output of the join node; you’ll notice that nothing reaches the output, indicating that the join node is still waiting for the remaining messages. This is likely due to an issue with the `parts.count` property.
+
+While the split node previously set the count to 11 automatically, which is correct, the switch node filtered some messages, resulting in only a few passing through. Therefore, the count should be corrected to reflect the correct number of messages that passed through the switch node instead of 11.
+
+## Disabling and Removing Breakpoints
+
+Now that you’ve learned how to add breakpoints and pinpoint problems, lets look at how to manage them. Sometimes you may need to disable specific breakpoints to allow the flow to run without interruption, or you may want to remove them once you’ve finished debugging.
+
+### Disabling Breakpoints
+
+![Image showing two ways of disabling breakpoints](../images/disabling-breakpoints.gif){data-zoomable}
+_Image showing two ways of disabling breakpoints_
+
+To disable a breakpoint without removing it:
+
+1. Go to the **Debugger** tab in the sidebar.
+2. Locate the list of active breakpoints; you will see a checkbox on the left side for each breakpoint.
+3. Click the checkbox for the breakpoint you wish to disable. This will toggle its state and no longer pause execution when reached.
+4. Alternatively, locate the breakpoints you have added to the flow. Click on the breakpoint once, and it will turn into a transparent blue rectangle with a border, indicating it is disabled.
+5. To enable them again, click on the checkbox or the breakpoints again.
+
+### Removing Breakpoints
+
+![Image showing two ways of removing breakpoints](../images/removing-breakpoints.gif){data-zoomable}
+_Image showing two ways of removing breakpoints_
+
+To remove a breakpoint:
+
+1. In the **Debugger** tab, find the breakpoint you want to remove.
+2. Click the **x** button located to the right of the breakpoint.
+3. Alternatively, locate the breakpoint on the flow and click it twice until it is a transparent rectangle with a dotted border, indicating it is removed.
+
+In conclusion, debugging in Node-RED is a great way to verify and improve your flows. While the Debug node is excellent for quick insights, the Node-RED Debugger adds another level of insight. Setting breakpoints can significantly streamline your troubleshooting process and help you identify issues more effectively.
+
+## Up Next
+
+- [Monitoring and Optimizing Node-RED Flows with Open Telemetry](/blog/2024/08/opentelemetry-with-node-red/): Learn how to Monitor and Optimize Node-RED Flows using Open Telemetry that will help you spot and fix delays in your flows quickly.
+
+- [Format your Node-RED flows for better team collaboration](/blog/2022/12/node-red-flow-best-practice/): Learn how to format your flows for readability to providing explicit comments on nodes and groups, a little bit of effort upfront can save your team many headaches down the road.
diff --git a/src/blog/2024/09/node-red-if-else-logic-guide.md b/src/node-red/getting-started/programming/if-else.md
similarity index 93%
rename from src/blog/2024/09/node-red-if-else-logic-guide.md
rename to src/node-red/getting-started/programming/if-else.md
index ced3cc5e66..8337774386 100644
--- a/src/blog/2024/09/node-red-if-else-logic-guide.md
+++ b/src/node-red/getting-started/programming/if-else.md
@@ -1,30 +1,17 @@
---
-title: "How to Use If-Else Logic in Node-RED: A Step-by-Step Guide"
-subtitle: "Mastering Conditional Flows in Node-RED: A Practical Walkthrough."
-description: Learn how to implement If-Else logic in Node-RED with our step-by-step guide. Use Function and S witch nodes for dynamic, conditional flows.
-date: 2024-09-09
-authors: ["sumit-shinde"]
-image: /blog/2024/09/images/if-else-with-node-red.png
-tags:
- - posts
- - node red if else
- - nodered switch
- - node-red conditional flow
- - node red function if else
- - node red if then else example
- - node red switch example
- - node red switch node example
- - node red function multiple outputs example
- - node red function example
- - node red function if
- - node red if
- - node red if node
- - node red if then
+eleventyNavigation:
+ key: If-Else
+ parent: Programming
+meta:
+ title: How to Use If-Else Logic in Node-RED
+ description: Learn how to implement If-Else logic in Node-RED with our step-by-step guide. Use Function and Switch nodes for dynamic, conditional flows.
+ keywords: node red if else, nodered switch, node-red conditional flow, node red function if else, node red if then else example, node red switch example, node red switch node example, node red function multiple outputs example, node red function example,node red function if, node red if, node red if node, node red if then
+image: /node-red/getting-started/images/if-else-with-node-red.png
---
-Human decision-making is often guided by a series of "if this, then that" choices—whether it's deciding what to wear based on the weather or determining the quickest route to work depending on traffic. This kind of logic is equally crucial in systems, especially those built in Node-RED. Just as we make decisions based on various factors, systems must evaluate conditions and choose the appropriate course of action.
+# {{meta.title}}
-
+Human decision-making is often guided by a series of "if this, then that" choices—whether it's deciding what to wear based on the weather or determining the quickest route to work depending on traffic. This kind of logic is equally crucial in systems, especially those built in Node-RED. Just as we make decisions based on various factors, systems must evaluate conditions and choose the appropriate course of action.
When developing automated solutions in Node-RED, the ability to replicate this human-like decision-making process is essential. By implementing If-Else logic, your system can intelligently navigate different scenarios, adapting its behavior based on the inputs it receives. This guide will show you how to effectively incorporate If-Else logic into your Node-RED flows, ensuring your system can make smart, context-aware decisions—just like you would.
@@ -207,10 +194,4 @@ The Function node excels in scenarios where complex logic and detailed message p
In contrast, the Switch node is designed for simpler, value-based routing. It is ideal for straightforward scenarios where you need to route messages based on a single value with multiple possible outputs. This node enables you to create rules based on specific values or conditions without the need for complex logic or extensive message modifications. If your routing logic involves basic comparisons and does not require advanced processing or calculations, the Switch node provides a more streamlined and intuitive approach.
-In summary, choose the Function node for intricate decision-making and detailed message processing, while the Switch node is better suited for scenarios where simple value-based routing is sufficient.
-
-## Conclusion
-
-Whether you choose the Function node for more complex logic or the Switch node for simpler, visual routing, Node-RED provides flexible options to incorporate If-Else logic into your flows. By leveraging these tools, you can create dynamic and responsive systems that make intelligent decisions based on various conditions, just like human decision-making.
-
-Understanding and implementing conditional logic will empower you to build more advanced and adaptable automation, enhancing the functionality and efficiency of your Node-RED applications. So, experiment with both methods and find the best approach for your needs.
+In summary, choose the Function node for intricate decision-making and detailed message processing, while the Switch node is better suited for scenarios where simple value-based routing is sufficient.
\ No newline at end of file
diff --git a/src/node-red/getting-started/programming/index.md b/src/node-red/getting-started/programming/index.md
new file mode 100644
index 0000000000..333746d086
--- /dev/null
+++ b/src/node-red/getting-started/programming/index.md
@@ -0,0 +1,16 @@
+---
+eleventyNavigation:
+ key: Programming
+ order: 3
+ parent: Getting Started
+meta:
+ title: Node-RED Programming Concepts
+ description: Learn the foundational programming concepts of Node-RED to enhance your development process.
+ keywords: node red programming, node-red development, node-red concepts
+---
+
+# {{meta.title}}
+
+- **If-Else**: The [If-Else](./if-else.md) documentation explains how to implement conditional logic in Node-RED. This guide walks you through using Function and Switch nodes to create dynamic, decision-based flows.
+
+- **Data Transformation**: The [Data Transformation](./data-tranformation.md) documentation covers techniques for filtering, mapping, sorting, and reducing data in Node-RED. It explains how to transform data within your flows, providing practical examples on array mapping and data handling.
diff --git a/src/node-red/getting-started/programming/loop.md b/src/node-red/getting-started/programming/loop.md
new file mode 100644
index 0000000000..e361da4e0f
--- /dev/null
+++ b/src/node-red/getting-started/programming/loop.md
@@ -0,0 +1,208 @@
+---
+eleventyNavigation:
+ key: Loop
+ parent: Programming
+meta:
+ title: How to implement loops in Node-RED flows
+ description: Learn how to implement while, for, and for...of loops in Node-RED with core and custom nodes for efficient data processing and automation.
+ keywords: node red loop, nodered loop, node red for loop, node-red loop, nodered for of, node-red while loop, node-red do while loop
+---
+
+# {{meta.title}}
+
+Handling repetitive tasks is a common challenge in automation and data processing. Whether you need to iterate over large datasets, perform calculations, or execute operations based on conditions multiple times, using loops can significantly enhance efficiency and scalability.
+
+In this document, we’ll explore how to replicate different types of loops that are essential in various contexts. We’ll discuss their applications and provide examples to help you effectively implement them in Node-RED.
+
+## What is a Loop?
+
+A [loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Loops_and_iteration) is a programming construct that allows you to execute a block of code repeatedly until a certain condition is met. Different types of loops are suited to different scenarios, depending on how and when you want the code to repeat:
+
+- **For Loop**: Executes a block of code a specific number of times. This is useful when you know in advance how many times you need to iterate, such as iterating through a range of numbers or items in a list. It's also known as a fixed number loop.
+
+- **While Loop**: Repeats a block of code as long as a specified condition is true. This type of loop is useful when you don’t know how many times the loop will need to run beforehand. The loop continues executing until the condition becomes false.
+
+- **For...of / ForEach Loop**: These loops are used to iterate over iterable objects such as arrays or maps. They allow you to access each element in a collection. The **for...of** loop is used specifically for iterables, while **forEach** is a method available on arrays that applies a function to each element.
+
+Each type of loop serves a different purpose and can be chosen based on the requirements of the task at hand.
+
+## Implementing Loops in Node-RED
+
+In this section, we’ll explore how to implement loops in Node-RED. First, we’ll demonstrate how to achieve looping with core nodes. Then, we’ll show how to accomplish similar tasks using custom nodes. We’ll also cover some essential operations typically performed using loops, providing practical examples to enhance your Node-RED flows.
+
+### Implementing Loops in Node-RED with Core Nodes
+
+#### While Loop
+
+To demonstrate a while loop in Node-RED, we’ll create a flow that appends random characters to a string until it contains the character "Z". This example will help you understand how to simulate a while loop using Node-RED's core nodes.
+
+1. Drag an **Inject** node onto the canvas. This node will trigger the start of the loop.
+2. Add a **Change** node to initialize the string variable. Configure it to set `msg.i` to an empty string (`""`). Connect the **Inject** node to this **Change** node.
+3. Place a **Switch** node on the canvas. Set it to check if `msg.i` contains the character "Z" (`msg.i.includes('Z')`). Add an additional rule for when this condition is not met (`otherwise`). Connect the output of the **Change** node to the input of the **Switch** node.
+4. Add a **Function** node to append a random uppercase letter to the string. Use the following JavaScript code:
+ ```javascript
+ msg.i += String.fromCharCode(65 + Math.floor(Math.random() * 26)); // Append a random uppercase letter
+ return msg;
+ ```
+ Connect this **Function** node to the second output of the **Switch** node (where the condition is `msg.i` does not contain "Z"). Then, connect the output of this **Function** node back to the input of the **Switch** node to repeat the process.
+5. Drag a **Debug** node onto the canvas and connect it to the second output of the **Switch** node. This node will display the current value of `msg.i` in the debug panel.
+6. Add another **Change** node to signal completion. Configure it to set `msg.payload` to `"completed"`. Connect this **Change** node to the first output of the **Switch** node (where `msg.i` contains "Z"), and then link it to another **Debug** node to show the completion message.
+
+The flow will continuously append random letters to the string and print the value in the debug panel until the string contains "Z". Once the condition is met, the flow will print a "completed" message and terminate the loop.
+
+```mermaid
+graph TD
+ A["Inject Node Triggers the start of the loop"] --> B["Change Node Initialize String Sets msg.i = ' '"]
+ B --> C["Switch Node Check if msg.i contains 'Z'"]
+ C -->|"msg.i contains 'Z'"| D["Change Node Set msg.payload to 'completed'"]
+ D --> E["Debug Node Display Completion Message"]
+ C -->|"msg.i does not contain 'Z'"| F["Function Node Append Random Character Sets msg.i += random uppercase letter"]
+ F --> C
+ F --> G["Debug Node Display Current String"]
+```
+
+{% renderFlow %}
+[{"id":"e90dc2e50e40896c","type":"group","z":"a3aa840957f658c6","name":"While Loop","style":{"label":true},"nodes":["cf6ebf02d00eaca6","696d89aa4050cd13","0e2d9f0447cf6226","bb6074cdf4398cb6","e19304ab31199315","c467509c666ee400","06bb08e3f0d7888a"],"x":34,"y":139,"w":1092,"h":242},{"id":"cf6ebf02d00eaca6","type":"switch","z":"a3aa840957f658c6","g":"e90dc2e50e40896c","name":"Does the msg.i contains Z","property":"i","propertyType":"msg","rules":[{"t":"cont","v":"Z","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":590,"y":240,"wires":[["c467509c666ee400"],["0e2d9f0447cf6226","06bb08e3f0d7888a"]]},{"id":"696d89aa4050cd13","type":"debug","z":"a3aa840957f658c6","g":"e90dc2e50e40896c","name":"End","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1030,"y":180,"wires":[]},{"id":"0e2d9f0447cf6226","type":"debug","z":"a3aa840957f658c6","g":"e90dc2e50e40896c","name":"Output \"i\"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"i","targetType":"msg","statusVal":"","statusType":"auto","x":900,"y":260,"wires":[]},{"id":"bb6074cdf4398cb6","type":"inject","z":"a3aa840957f658c6","g":"e90dc2e50e40896c","name":"Start","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"[\"hello\",\"run\",\"why\"]","payloadType":"json","x":130,"y":240,"wires":[["e19304ab31199315"]]},{"id":"e19304ab31199315","type":"change","z":"a3aa840957f658c6","g":"e90dc2e50e40896c","name":"initilized i with empty string","rules":[{"t":"set","p":"i","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":320,"y":240,"wires":[["cf6ebf02d00eaca6"]]},{"id":"c467509c666ee400","type":"change","z":"a3aa840957f658c6","g":"e90dc2e50e40896c","name":"if not Set payload to \"completed\"","rules":[{"t":"set","p":"payload","pt":"msg","to":"Completed","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":790,"y":180,"wires":[["696d89aa4050cd13"]]},{"id":"06bb08e3f0d7888a","type":"function","z":"a3aa840957f658c6","g":"e90dc2e50e40896c","name":"Append Random Letter","func":"// add ASCII char from 32 to 126\nmsg.i += String.fromCharCode(Math.random()*26 + 65);\nreturn msg;","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":590,"y":340,"wires":[["cf6ebf02d00eaca6"]]}]
+{% endrenderFlow %}
+
+#### For Loop
+
+In traditional programming, `for` loops iterate a set number of times based on an index or range, while `while` loops execute as long as a condition is `true`.
+
+In Node-RED, you can simulate a `for` loop by managing a counter with nodes to iterate through array elements. By incrementing an index variable, you can access each element and perform operations, effectively mimicking the behavior of a traditional `for` loop.
+
+Here’s how you can set up a `for` loop in Node-RED:
+
+1. Drag an **Inject** node onto the canvas and set the `msg.payload` to `["foo","bar","foobar"]`. This node triggers the start of the loop and provides the array to process.
+2. Add a **Change** node to initialize the loop counter. Configure it to set `msg.i` to `0`, and connect the **Inject** node to this **Change** node.
+3. Next, drag a **Switch** node onto the canvas. Configure it to check if `msg.i` is equal to the array length (`msg.i == msg.payload.length`). Add an additional rule for when this condition is not met (`otherwise`). Connect the **Change** node to the **Switch** node.
+4. Add another **Change** node to increment the counter. Configure it to set `msg.i` to `i + 1` using a JSONata expression. Connect this **Change** node to the output of the **Switch** node where the condition (`msg.i < msg.payload.length`) is true (second output).
+5. To access and display the array elements, drag a **Change** node onto the canvas. Configure it to set `msg.payload` to `msg.payload[msg.i]`, accessing the array element at the current index. Connect this **Change** node to the **Switch** node's second output (`otherwise`).
+6. Attach a **Debug** node to the output of this **Change** node to print the current array element.
+7. For the final step, add another **Change** node to signal when the loop has completed. Configure it to set `msg.payload` to `completed`, and connect it to the first output of the **Switch** node where the loop condition is `msg.i == msg.payload.length`. Finally, attach a **Debug** node to display the completion message.
+
+This flow will iterate through the array, printing each element until all elements have been processed. Once the loop reaches the end of the array, it prints a "completed" message and terminates.
+
+```mermaid
+graph TD
+ A["Inject Node Sets msg.payload to array"] --> B["Change Node Initialize Counter Sets msg.i = 0"]
+ B --> C["Switch Node Check if msg.i == msg.payload.length"]
+ C -->|"msg.i < msg.payload.length"| D["Change Node Increment Counter Sets msg.i = msg.i + 1"]
+ D --> E["Change Node Access Element Sets msg.payload = msg.payload[msg.i]"]
+ E --> F["Debug Node Display Current Element"]
+ C -->|"msg.i == msg.payload.length"| G["Change Node Loop Completion Sets msg.payload = 'completed'"]
+ G --> H["Debug Node Display Completion Message"]
+```
+
+{% renderFlow %}
+[{"id":"3b546e0612673478","type":"group","z":"a3aa840957f658c6","name":"ForLoop","style":{"label":true},"nodes":["8ee16c1d06fca9fe","64a4a7329631d7ce","e67a34285a7e6979","e2074cf01ed451fd","811cedbe7cb89415","8bbccc2d10c36bfe","826d819a06810184","e7ebf7f66cda1370"],"x":14,"y":159,"w":1292,"h":242},{"id":"8ee16c1d06fca9fe","type":"switch","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"if msg.i == msg.payload.length","property":"i","propertyType":"msg","rules":[{"t":"eq","v":"payload.length","vt":"msg"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":550,"y":280,"wires":[["8bbccc2d10c36bfe"],["e7ebf7f66cda1370","826d819a06810184"]]},{"id":"64a4a7329631d7ce","type":"debug","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"End","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":1210,"y":200,"wires":[]},{"id":"e67a34285a7e6979","type":"debug","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"Output \"i\"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1080,"y":340,"wires":[]},{"id":"e2074cf01ed451fd","type":"inject","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"Start","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"[\"hello\",\"run\",\"why\"]","payloadType":"json","x":110,"y":280,"wires":[["811cedbe7cb89415"]]},{"id":"811cedbe7cb89415","type":"change","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"initilized i with 0","rules":[{"t":"set","p":"i","pt":"msg","to":"0","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":280,"y":280,"wires":[["8ee16c1d06fca9fe"]]},{"id":"8bbccc2d10c36bfe","type":"change","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"If 'i' equals array length, set payload to \"completed\".","rules":[{"t":"set","p":"payload","pt":"msg","to":"Completed","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":910,"y":200,"wires":[["64a4a7329631d7ce"]]},{"id":"826d819a06810184","type":"change","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"Access array element with i","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload[msg.i]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":860,"y":340,"wires":[["e67a34285a7e6979"]]},{"id":"e7ebf7f66cda1370","type":"change","z":"a3aa840957f658c6","g":"3b546e0612673478","name":"increment i by 1","rules":[{"t":"set","p":"i","pt":"msg","to":"i+1","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":360,"wires":[["8ee16c1d06fca9fe"]]}]
+{% endrenderFlow %}
+
+#### For...of / ForEach Loop
+
+In traditional programming, `for...of` and `forEach` loops are commonly used to iterate through arrays or object properties, allowing for individual element processing. Since Node-RED doesn’t include these specific constructs, you can replicate their functionality by using a combination of nodes, particularly the **[Split](/node-red/core-nodes/split/)** and **[Join](/node-red/core-nodes/join/)** nodes.
+
+Here’s how you can replicate this functionality in Node-RED:
+
+1. Drag an **Inject** node onto the canvas and set the `msg.payload` to `["foo", "bar", "foobar"]`.
+2. Drag a **Split** node onto the canvas. Keep the default settings. If you are working with a string, ensure you select the appropriate delimiter for splitting.
+3. Optionally, use a **Change** or **Function** node to perform operations on each element if needed.
+4. Drag a **Debug** node onto the canvas and connect it to the **Split** node’s output.
+
+When you click the **Inject** button, the **Split** node will process each element of the array individually, and the **Debug** node will display each one in the debug window.
+
+To explore how you can map, sort, filter, and reduce data using this approach, check out our guide: [How to Filter, Map, Sort, and Reduce Data in Node-RED](/node-red/getting-started/programming/data-tranformation/).
+
+```mermaid
+graph TD
+ A["Inject Node"] --> B["Split Node"]
+ B -->|Outputs Each Element Individually| C["Debug Node"]
+
+ A["Inject Node\nSets msg.payload to array"]
+ B["Split Node\nSplits array into individual elements"]
+ C["Debug Node\nDisplays each element"]
+```
+
+{% renderFlow %}
+[{"id":"2e67b2739f364a71","type":"group","z":"a3aa840957f658c6","style":{"stroke":"#999999","stroke-opacity":"1","fill":"none","fill-opacity":"1","label":true,"label-position":"nw","color":"#a4a4a4"},"nodes":["2add2705d262010d","40333c736844a0c1","3337ba024a363a15","2f7d2aab12b3b4e9"],"x":254,"y":219,"w":532,"h":162},{"id":"2add2705d262010d","type":"inject","z":"a3aa840957f658c6","g":"2e67b2739f364a71","name":"Array","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[\"foo\",\"bar\",\"foobar\"]","payloadType":"json","x":350,"y":340,"wires":[["40333c736844a0c1"]]},{"id":"40333c736844a0c1","type":"split","z":"a3aa840957f658c6","g":"2e67b2739f364a71","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","property":"payload","x":530,"y":320,"wires":[["3337ba024a363a15"]]},{"id":"3337ba024a363a15","type":"debug","z":"a3aa840957f658c6","g":"2e67b2739f364a71","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":690,"y":320,"wires":[]},{"id":"2f7d2aab12b3b4e9","type":"inject","z":"a3aa840957f658c6","g":"2e67b2739f364a71","name":"Object","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"first\":\"Hello World\",\"second\":8,\"third\":true}","payloadType":"json","x":350,"y":260,"wires":[["40333c736844a0c1"]]}]
+{% endrenderFlow %}
+
+#### Implementing Loops with the Function Node
+
+Implementing loops with the **[Function](/node-red/core-nodes/function/)** node is straightforward if you're familiar with JavaScript, as it allows you to write custom code. However, a common issue is figuring out how to send a message on each iteration without ending the loop after the first iteration. In this section, we’ll show you how to implement loops in the `Function` node correctly, ensuring that each iteration is processed and sent out properly without prematurely breaking the loop.
+
+For demonstration purposes, we will implement a `for` loop.
+
+1. Drag the **Inject** node onto the canvas and set the `msg.payload` to `[1, "hello", "%", true]`.
+2. Drag the **Function** node onto the canvas and add the following JavaScript code:
+ ```javascript
+ for (let i = 0; i < msg.payload.length; i++) {
+ // Create a new message for each item
+ let newMsg = { ...msg }; // Copy the original msg object
+ newMsg.payload = msg.payload[i]; // Set payload to the current item
+ node.send(newMsg); // Send the message
+ }
+ ```
+3. Drag a **Debug** node onto the canvas and connect it to the output of the **Function** node.
+
+When you deploy the flow and click the **Inject** button, each item in the array will be sent as a separate message and printed in the debug panel. This works because the `node.send()` method allows you to send messages asynchronously. Unlike `return`, which ends the execution of the **Function** node immediately, `node.send()` continues to process and send each message without halting the loop.
+
+By using `node.send()` inside the loop, you ensure that each iteration produces a separate message, and the Function node can handle multiple messages efficiently. For more information on on this, refer to [Documentation on Sending messages asynchronously](https://nodered.org/docs/user-guide/writing-functions#sending-messages-asynchronously).
+
+{% renderFlow %}
+[{"id":"50be2bac3b058be5","type":"group","z":"a3aa840957f658c6","name":"","style":{"label":true},"nodes":["97c288f32955c6ab","7a8404c44ac0749b","0d7b9cb51669ad9b"],"x":414,"y":499,"w":612,"h":82},{"id":"97c288f32955c6ab","type":"inject","z":"a3aa840957f658c6","g":"50be2bac3b058be5","name":"Array","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[1, \"hello\", \"%\", true]","payloadType":"json","x":510,"y":540,"wires":[["7a8404c44ac0749b"]]},{"id":"7a8404c44ac0749b","type":"function","z":"a3aa840957f658c6","g":"50be2bac3b058be5","name":"For Loop","func":"for (let i = 0; i < msg.payload.length; i++) {\n // Create a new message for each item\n let newMsg = { ...msg }; // Copy the original msg object\n newMsg.payload = msg.payload[i]; // Set payload to the current item\n node.send(newMsg)\n}","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":700,"y":540,"wires":[["0d7b9cb51669ad9b"]]},{"id":"0d7b9cb51669ad9b","type":"debug","z":"a3aa840957f658c6","g":"50be2bac3b058be5","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":920,"y":540,"wires":[]}]
+{% endrenderFlow %}
+
+### Implementing Loops in Node-RED with Custom node
+
+Throughtout this section we will show you how you can implement loops in Node-RED with custom nodes easily, there are plenty of custom nodes that can be used to achieve the loop but we will going use the popular one [node-red-contrib-loop](https://flows.nodered.org/node/node-red-contrib-loop), before moving further make sure to install it by palette manager also for demostration purpose we will use same example we used in the above sections with loops.
+
+#### While Loop
+
+1. Drag the **Inject** node onto the canvas.
+2. Drag the **Loop** node onto the canvas, double-click it, and set the kind to **Condition**. Set the condition to `msg.payload.includes("Z") != true` as JavaScript. The condition kind offers a lot of flexibility as it allows adding conditions in JavaScript, regex, and JSONata.
+
+3. Set the "When test" option:
+ - Choose "after" if you want the loop to execute at least once before checking the condition, similar to how a while loop operates when it checks the condition after the first iteration.
+ - Choose "before" if you want the loop to check the condition before executing, functioning like a traditional while loop that only runs if the condition is true at the start.
+
+4. Drag the **Function** node onto the canvas. Add the following JavaScript code to it and connect its input to the second output of the **Loop** node:
+
+ ```javascript
+ msg.i += String.fromCharCode(65 + Math.floor(Math.random() * 26)); // Append a random uppercase letter
+ return msg;
+ ```
+
+5. Drag the **Delay** node onto the canvas, set the delay to 0.5 milliseconds. When using the condition kind of loop, it is important to use the **Delay** node with this loop custom node to avoid creating an infinite loop. Connect the **Delay** node's input to the output of the **Function** node, and connect its output to the input of the **Loop** node.
+6. Drag a **Debug** node onto the canvas and connect its input to the output of the **Function** node. This will print the current `msg.payload` after each iteration.
+7. Drag another **Debug** node onto the canvas and connect its input to the first output of the **Loop** node. This will print when the loop exits, indicating that the condition has been met.
+
+{% renderFlow %}
+[{"id":"7ef4d41cf74f75c3","type":"group","z":"a3aa840957f658c6","name":"While Loop","style":{"label":true},"nodes":["3ba931b1.fb48d6","2d297dfa.6e660a","5aef28e.0f9e7d8","90c49008.053a58","9a725668.330148","e88b0e8c.d39858","9c48f336.471ea","66144af4.d1ec9c","75c6b326.e934d4","77ac6763.8e54b8","99b265b4.e2d3c8"],"x":174,"y":139,"w":672,"h":322},{"id":"3ba931b1.fb48d6","type":"loop","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"","kind":"cond","count":"10","initial":"1","step":"1","condition":"msg.payload.includes(\"Z\") != true","conditionType":"js","when":"after","enumeration":"enum","enumerationType":"msg","limit":"","loopPayload":"loop-keep","finalPayload":"final-last","x":500,"y":280,"wires":[["5aef28e.0f9e7d8"],["e88b0e8c.d39858"]]},{"id":"2d297dfa.6e660a","type":"inject","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":270,"y":280,"wires":[["3ba931b1.fb48d6"]]},{"id":"5aef28e.0f9e7d8","type":"debug","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"loop","targetType":"msg","statusVal":"","statusType":"auto","x":720,"y":280,"wires":[]},{"id":"90c49008.053a58","type":"comment","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"Example: Conditional loop","info":"","x":310,"y":180,"wires":[]},{"id":"9a725668.330148","type":"comment","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"Show final status","info":"","x":740,"y":240,"wires":[]},{"id":"e88b0e8c.d39858","type":"function","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"","func":"// add ASCII char from 32 to 126\nmsg.payload += String.fromCharCode(Math.random()*26 + 65);\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":340,"y":380,"wires":[["66144af4.d1ec9c","9c48f336.471ea"]]},{"id":"9c48f336.471ea","type":"debug","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":730,"y":380,"wires":[]},{"id":"66144af4.d1ec9c","type":"delay","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"","pauseType":"delay","timeout":"0.5","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":530,"y":355,"wires":[["3ba931b1.fb48d6"]]},{"id":"75c6b326.e934d4","type":"comment","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"Show string","info":"","x":730,"y":420,"wires":[]},{"id":"77ac6763.8e54b8","type":"comment","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"Add char to string","info":"","x":370,"y":420,"wires":[]},{"id":"99b265b4.e2d3c8","type":"comment","z":"a3aa840957f658c6","g":"7ef4d41cf74f75c3","name":"Repeat until string doesn't finish with \"Z\"","info":"","x":480,"y":240,"wires":[]}]
+{% endrenderFlow %}
+
+#### For Loop
+
+1. Drag an **Inject** node onto the canvas and set the `msg.payload` to `["foo", "bar", "foobar"]`. This node will trigger the start of the loop and provide the array we want to process.
+2. Drag a **Change** node onto the canvas. Configure it to set `msg.count` to `msg.payload.length`, which will store the length of the array. Connect the **Inject** node to this **Change** node.
+3. Drag a **Loop** node onto the canvas, double-click on it, and set the kind to **Fixed**. Leave the "count" field empty as we are setting it dynamically using `msg.count`. Set the initial value to `0` and the step value to `1`. Set the loop payload to the original `msg.payload`.
+4. Next, drag a **Change** node onto the canvas and configure it to either clear or set `msg.payload` to itself. This ensures that the payload remains unchanged. Connect its input to the output of the **Loop** node and then connect its output back to the input of the **Loop** node. This setup allows the loop to repeat.
+5. Then, drag another **Change** node onto the canvas. Configure this node to set `msg.payload` to `msg.payload[msg.loop.value]`, which extracts the current array element using the loop’s counter (`msg.loop.value`). The **Loop** node generates properties like `value`, which is the counter we are incrementing.
+6. Finally, drag a **Debug** node onto the canvas and connect it to the output of the previous **Change** node to print the current array element in each iteration.
+
+{% renderFlow %}
+[{"id":"ac4bfead30be7380","type":"group","z":"a3aa840957f658c6","name":"For Loop","style":{"label":true},"nodes":["2ffc3d07.23e6fa","6e1118b1.449db8","ea852667d724cfb1","880a2501f7d153ba","bd58a956.c036b","60a8f138.0909a","44f1a29403157bba"],"x":74,"y":199,"w":1132,"h":202},{"id":"2ffc3d07.23e6fa","type":"inject","z":"a3aa840957f658c6","g":"ac4bfead30be7380","name":"","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[\"foo\",\"bar\",\"foobar\"]","payloadType":"json","x":210,"y":260,"wires":[["880a2501f7d153ba"]]},{"id":"6e1118b1.449db8","type":"loop","z":"a3aa840957f658c6","g":"ac4bfead30be7380","name":"","kind":"fcnt","count":"","initial":"0","step":"1","condition":"","conditionType":"js","when":"before","enumeration":"enum","enumerationType":"msg","limit":"","loopPayload":"loop-orig","finalPayload":"final-last","x":710,"y":260,"wires":[["44f1a29403157bba"],["bd58a956.c036b"]]},{"id":"ea852667d724cfb1","type":"change","z":"a3aa840957f658c6","g":"ac4bfead30be7380","name":"Access array element with loop counter","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload[msg.loop.value]","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":840,"y":360,"wires":[["60a8f138.0909a"]]},{"id":"880a2501f7d153ba","type":"change","z":"a3aa840957f658c6","g":"ac4bfead30be7380","name":"Set Pass Count","rules":[{"t":"set","p":"count","pt":"msg","to":"payload.length","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":440,"y":260,"wires":[["6e1118b1.449db8"]]},{"id":"bd58a956.c036b","type":"change","z":"a3aa840957f658c6","g":"ac4bfead30be7380","name":"Repeat","rules":[],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":360,"wires":[["6e1118b1.449db8","ea852667d724cfb1"]]},{"id":"60a8f138.0909a","type":"debug","z":"a3aa840957f658c6","g":"ac4bfead30be7380","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1090,"y":360,"wires":[]},{"id":"44f1a29403157bba","type":"debug","z":"a3aa840957f658c6","g":"ac4bfead30be7380","name":"End Loop","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1000,"y":240,"wires":[]}]
+{% endrenderFlow %}
+
+#### For...of / ForEach Loop
+
+1. Drag an **Inject** node onto the canvas and set the `msg.payload` to `[6, 14, 36, -8, 100]`. This node will trigger the loop and provide the array of numbers to process.
+2. Drag a **Loop** node onto the canvas. Set the **Kind** to **Enumeration** and choose `msg.payload` as the enumeration source. This configuration will loop through each value in the array. Set the "loop payload" to the "value".
+3. Drag a **Change** node onto the canvas and configure it to either clear or set `msg.payload` to itself. This ensures that the payload remains unchanged during each iteration. Connect its input to the second output of the **Loop** node, then connect its output back to the input of the **Loop** node to create the loop.
+4. Finally, drag a **Debug** node onto the canvas and connect it to the second output of the **Loop** node. This will display the current value being processed in the loop.
+
+With the **Enumeration** kind, you can iterate through different types of data such as arrays, strings, objects, and more, making this loop versatile for handling various data structures.
+
+{% renderFlow %}
+[{"id":"65d854c9098393e8","type":"group","z":"a3aa840957f658c6","name":"For of/ for each","style":{"label":true},"nodes":["38630ff1.21721","f009e0e9.24576","cf52b6dd.5febb8","33031c0e.1b115c","b28b06f1.38eb48","6e593ff2.dc94c"],"x":334,"y":219,"w":722,"h":222},{"id":"38630ff1.21721","type":"inject","z":"a3aa840957f658c6","g":"65d854c9098393e8","name":"Object","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"first\":\"Hello World\",\"second\":8,\"third\":true}","payloadType":"json","x":430,"y":260,"wires":[["f009e0e9.24576"]]},{"id":"f009e0e9.24576","type":"loop","z":"a3aa840957f658c6","g":"65d854c9098393e8","name":"","kind":"enum","count":"","initial":"","step":"","condition":"","conditionType":"js","when":"before","enumeration":"payload","enumerationType":"msg","limit":"","loopPayload":"loop-val","finalPayload":"final-orig","x":740,"y":300,"wires":[["cf52b6dd.5febb8"],["33031c0e.1b115c","6e593ff2.dc94c"]]},{"id":"cf52b6dd.5febb8","type":"debug","z":"a3aa840957f658c6","g":"65d854c9098393e8","name":"Loop End","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"loop","targetType":"msg","statusVal":"","statusType":"auto","x":950,"y":280,"wires":[]},{"id":"33031c0e.1b115c","type":"change","z":"a3aa840957f658c6","g":"65d854c9098393e8","name":"Repeat","rules":[],"action":"","property":"","from":"","to":"","reg":false,"x":730,"y":400,"wires":[["f009e0e9.24576"]]},{"id":"b28b06f1.38eb48","type":"inject","z":"a3aa840957f658c6","g":"65d854c9098393e8","name":"Array","props":[{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"[\"foo\",\"bar\",\"foobar\"]","payloadType":"json","x":430,"y":320,"wires":[["f009e0e9.24576"]]},{"id":"6e593ff2.dc94c","type":"debug","z":"a3aa840957f658c6","g":"65d854c9098393e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":940,"y":400,"wires":[]}]
+{% endrenderFlow %}
diff --git a/src/node-red/index.njk b/src/node-red/index.njk
index 6a1d8decfa..d5df25ec28 100644
--- a/src/node-red/index.njk
+++ b/src/node-red/index.njk
@@ -18,7 +18,7 @@ meta:
answer: >
Node-RED can be used for a wide variety of use cases, including:
-
The manufacturing industry uses Node-RED for collecting data from different pieces of factory equipment.
+
The manufacturing industry uses Node-RED for collecting data from different pieces of factory equipment.
Creating dashboards that visualize data and allow for event triggers to occur based on the data.
Developing chatbot platforms that can collect interactions of a wide variety of social media platforms.
Extract, transform and integrate data from many different sources in the enterprise.
diff --git a/src/node-red/integration-technologies/index.md b/src/node-red/integration-technologies/index.md
index b3644886c8..2b21f9a3cd 100644
--- a/src/node-red/integration-technologies/index.md
+++ b/src/node-red/integration-technologies/index.md
@@ -10,7 +10,7 @@ meta:
# {{meta.title}}
-In today's interconnected world, developing powerful and scalable applications frequently necessitates the integration of various technologies. This integration is crucial for creating seamless and efficient systems that can handle complex tasks and large volumes of data. Whether you're working with REST APIs to enable communication between different services or implementing GraphQL for more efficient data querying, the ability to blend these technologies effectively is essential for modern application development.
+Developing powerful and scalable applications frequently necessitates the integration of various technologies. This integration is crucial for creating seamless and efficient systems that can handle complex tasks and large volumes of data. Whether you're working with REST APIs to enable communication between different services or implementing GraphQL for more efficient data querying, the ability to blend these technologies effectively is essential for modern application development.
Node-RED offers a versatile and robust platform to meet these needs. Its intuitive flow-based interface allows developers to easily design and deploy sophisticated workflows, which makes it an invaluable tool for integrating REST APIs, GraphQL, webhooks, and more.
diff --git a/src/node-red/node-red.json b/src/node-red/node-red.json
index f237361c4a..5dfbbb1e3e 100644
--- a/src/node-red/node-red.json
+++ b/src/node-red/node-red.json
@@ -2,7 +2,8 @@
"layout": "layouts/documentation.njk",
"hideTitle": "true",
"nav": "node-red",
+ "searchTitle": "Node-RED",
"tags": [
"learningResources"
]
-}
\ No newline at end of file
+}
diff --git a/src/node-red/protocol/images/client-testing.gif b/src/node-red/protocol/images/client-testing.gif
new file mode 100644
index 0000000000..86e5dd766b
Binary files /dev/null and b/src/node-red/protocol/images/client-testing.gif differ
diff --git a/src/node-red/protocol/images/server-testing.gif b/src/node-red/protocol/images/server-testing.gif
new file mode 100644
index 0000000000..69d601d7b7
Binary files /dev/null and b/src/node-red/protocol/images/server-testing.gif differ
diff --git a/src/node-red/protocol/images/websocket-handshake.png b/src/node-red/protocol/images/websocket-handshake.png
new file mode 100644
index 0000000000..14432d736a
Binary files /dev/null and b/src/node-red/protocol/images/websocket-handshake.png differ
diff --git a/src/node-red/protocol/opa-ua.md b/src/node-red/protocol/opc-ua.md
similarity index 100%
rename from src/node-red/protocol/opa-ua.md
rename to src/node-red/protocol/opc-ua.md
diff --git a/src/node-red/protocol/websocket.md b/src/node-red/protocol/websocket.md
new file mode 100644
index 0000000000..4a0b785280
--- /dev/null
+++ b/src/node-red/protocol/websocket.md
@@ -0,0 +1,110 @@
+---
+eleventyNavigation:
+ key: Websocket
+ parent: "Communication Protocols"
+meta:
+ title: Using Websocket with Node-RED
+ description:
+ keywords: node-red websocket, websocket in node-red, websocket node-red
+image:
+---
+
+# {{meta.title}}
+
+Let's look at how to use WebSocket in Node-RED for communication. We will explain the concepts through practical examples, covering how to connect and communicate as a WebSocket client and how to build a WebSocket server using Node-RED to communicate with clients.
+
+## What is Websocket?
+
+WebSocket technology facilitates real-time, two-way communication between a client (such as a web browser or IoT device) and a server. Unlike traditional HTTP requests, which are one-way and require establishing a new connection for each message, WebSockets maintain a persistent connection. This allows both the client and server to send messages to each other at any time, making it particularly suited for applications that require real-time data exchange.
+
+## How Does WebSocket Work?
+
+![WebSocket connection establishment process](./images/websocket-handshake.png){data-zoomable}
+_WebSocket connection establishment process_
+
+WebSocket establishes a persistent connection between a client (such as a web browser or IoT device) and a server. The process begins when the client sends an initial HTTP request to the server, indicating a desire to upgrade to a WebSocket connection. If the server supports WebSocket, it responds with a confirmation, and the connection is established.
+
+Once the connection is open, both the client and server can send messages to each other at any time. This two-way communication allows for real-time data exchange without the need to re-establish connections for each message. When the communication is no longer needed, either party can close the connection.
+
+## Using Websocket with Node-RED
+
+This document will explain how to communicate as both a server and a client using WebSocket in Node-RED. Practical examples will be provided to help you follow along, ensuring a comprehensive understanding of the concepts.
+
+## Understanding Servers and Clients in WebSocket Context
+
+In the context of WebSocket communication:
+
+- **WebSocket Server:** The WebSocket server is a application (such as a web browser or IoT device) that listens for incoming WebSocket connection requests from clients. It manages these connections and facilitates the exchange of messages in real time. The server can handle multiple clients simultaneously, allowing for concurrent communication.
+
+- **WebSocket Client:** The WebSocket client is the application (such as a web browser or IoT device) that initiates the connection to the WebSocket server. It sends requests to establish a WebSocket connection and can send and receive messages at any time once the connection is active.
+
+## Building a WebSocket Server in Node-RED and Communicating with Clients
+
+Before creating the server, it's important to understand that we will need to listen for incoming messages as well as send messages. Let’s first create the server to listen for connections.
+
+### Building the WebSocket Server to Listen
+
+1. Drag the **WebSocket In** node onto the canvas.
+2. Double-click the node and select the type as "Listen On."
+3. Click on the "+" icon to add the WebSocket configuration.
+4. Enter the path you want to listen on as the server (e.g., `/ws/listen`).
+5. Choose whether you want to send and receive the entire message or only `msg.payload`.
+6. Drag a **Debug** node onto the canvas and connect it to the WebSocket In node. This will allow you to see incoming messages in the debug window.
+
+**Note**: By default, the payload will contain the data sent over or received from the WebSocket. If configured to send the entire message, the object will be in JSON string format.
+
+### Making the Server Able to Send Data to Clients
+
+1. Drag the **Inject** node onto the canvas. This node will be used to send example data, but you can use any other data source node that you wish.
+2. Drag the **WebSocket Out** node onto the canvas. Double-click it and set the type to "Listen On."
+3. In the URL field, select the configuration you added while building the server in the previous section.
+4. Click the **Deploy** button to activate your flow.
+
+### Testing the WebSocket Server
+
+![Testing Server with Client](./images/server-testing.gif){data-zoomable}
+_Testing the WebSocket server with a Websocket client_
+
+Now that you have deployed the Node-RED flow, it is acting as a server that can both send and receive data. To test the server, you can use the [Simple WebSocket Client](https://chromewebstore.google.com/detail/simple-websocket-client/pfdhoblngboilpfeibdedpjgfnlcodoo?hl=en) extension in your browser. Make sure to install this extension if you want to test the server.
+
+1. In the extension interface, enter the URL to connect to your server:
+ - For a deployed server: `wss:///ws/listen`
+ - For a local server: `ws://localhost:1880/ws/listen` (Note: Use `ws` for unencrypted connections and `wss` for encrypted connections.)
+2. Click the **Open** button to connect to the server. Once connected, you should see the status change to "opened."
+3. In the request field, enter the message you want to send to the server and click **Send**. You will see the message printed in the debug window of Node-RED.
+4. To send a message from websocket server created in Node-RED to the client, click the **Inject** button with `msg.payload` set to the data you want to send. In the extension interface, you will see the sent data in the message log.
+
+With these steps, you will have successfully set up a WebSocket server in Node-RED and tested its functionality as both a server and client. This setup allows for real-time communication, which is essential for many applications.
+
+### Sending Data from Node-RED
+
+To send a message from Node-RED to the client, click the **Inject** button with `msg.payload` set to the data you want to send. In the extension interface, you will see the sent data in the message log.
+
+## Connecting to a WebSocket Server as a client in Node-RED and communicating
+
+Now, as the section states, we are going to see how you can connect to the WebSocket server as the client. To move further, ensure that you have a server to connect to, which you can create as shown in the above section in Node-RED.
+
+### Connecting to the WebSocket Server for Incoming Messages
+
+1. Drag the **WebSocket In** node onto the canvas.
+2. Double-click on it and select the type as "Connect To."
+3. Click on the "+" icon to add the WebSocket configuration.
+4. Enter the WebSocket server URL you want to connect to.
+5. Select 'payload' in the Send/Receive.
+6. Drag the **Debug** node onto the canvas and connect it to the WebSocket In node.
+
+### Making the Client Able to Send Messages
+
+1. Drag the **Inject** node onto the canvas. This node will be used to send example data.
+2. Drag the **WebSocket Out** node onto the canvas. Double-click it and set the type to "Connect To."
+3. In the URL field, select the configuration you added while connecting to the server for listening to incoming messages.
+4. Click the **Deploy** button.
+
+### Testing the WebSocket Client
+
+![Testing Client with Server](./images/client-testing.gif){data-zoomable}
+_Testing Websocket Client with Websocket Server_
+
+Now, to test the client, you can send messages from the server and see the debug window for that message in the client instance. Similarly, you can send messages from the client Instance to the server and observe the responses in the debug window of server instance.
+
+For more information on the advaced websocket node configuration refer to the [Websocket Node Documentation](/node-red/core-nodes/websocket/)
\ No newline at end of file
diff --git a/src/pricing/index.njk b/src/pricing/index.njk
index e7bda2a378..7aef98e62e 100644
--- a/src/pricing/index.njk
+++ b/src/pricing/index.njk
@@ -10,13 +10,7 @@ meta:
faq:
- question: "Does FlowFuse offer annual discounts for FlowFuse Cloud?"
answer: >
- Yes, we offer a 20% discount for Team customers who move from monthly to annual subscriptions. Please reach out to request the discount.
- - question: "Is there a minimum for purchase?"
- answer: >
- Yes, 5 instances on Team and 10 instances on Enterprise.
- - question: "Why isn't there an option for self-hosted Team?"
- answer: >
- Due to the configuration and support required for a self-hosted deployment, it is only possible through the Enterprise tier at this time.
+ Yes, customers on an annual subscription receive a 20% discount off of the monthly subscription price. Please reach out to request the discount. Please reach out to request the discount.
- question: "Why is self-hosted the same price as cloud?"
answer: >
Self-hosted environments require more support and configuration than FlowFuse Cloud, which offset any resources saved.
@@ -63,44 +57,45 @@ hubspot:
-
-
+
+
-
+
-
+
Starter
-
Ideal to get started. Quick
- hosting of Node-RED instances.
+
For smaller-scale applications. The fastest, easiest way to host Node-RED instances.
Tailored for businesses prioritizing data security, compliance, and regional flexibility, ideal for demanding efficiency and productivity in strict regulatory environments.
- Everything from Enterprise Tier, plus:
+ Top features:
Ready to dive deeper into the world of FlowFuse? Browse our library of whitepapers and ebooks and discover the power of our low-code industrial data platform.
+
+
+ {%- for item in collections.publications | sort(attribute='date') | reverse -%}
+
\ No newline at end of file
diff --git a/src/solutions/manufacturing.njk b/src/solutions/it-ot-middleware.njk
similarity index 99%
rename from src/solutions/manufacturing.njk
rename to src/solutions/it-ot-middleware.njk
index dd421bd14e..60d3e77739 100644
--- a/src/solutions/manufacturing.njk
+++ b/src/solutions/it-ot-middleware.njk
@@ -1,6 +1,6 @@
---
layout: solution
-title: FlowFuse for Manufacturing
+title: FlowFuse for IT/OT Integration
subtitle: FlowFuse allows teams to automate their manufacturing process through customized, reliable applications.
meta:
keywords: "FlowFuse, Manufacturing, Automation, DevOps, Integration, OT, IT, Data, Visualization, Event Triggers, Fleet Management, Monitoring, Collaborative Development, Environment, Application Deployment, Professional Support"
diff --git a/src/solutions/uns.njk b/src/solutions/uns.njk
new file mode 100644
index 0000000000..74260c9f8c
--- /dev/null
+++ b/src/solutions/uns.njk
@@ -0,0 +1,224 @@
+---
+layout: page
+nohero: true
+meta:
+ title: "FlowFuse for the Unified Namespace"
+ description: "FlowFuse simplifies UNS adoption for manufacturing companies by providing a user-friendly, low-code platform for deploying and using data from a UNS."
+ keywords: "FlowFuse, UNS, Unified Namespace, manufacturing, data, data integration, data management, data visualization, data analysis, data-driven decisions, data silos, real-time data, collaboration, Node-RED, MQTT Broker, low-code, open-source, rapid implementation, seamless integration"
+---
+
+
+
+
+
+
+
+ FlowFuse for the Unified Namespace
+
+
+ FlowFuse simplifies UNS adoption for manufacturing companies by providing a user-friendly, low-code platform for deploying and using data from a UNS.
+
+
+ {% image "./images/solutions/ff-uns.png", "FlowFuse hosting Node-RED connected to many devices", [400] %}
+
+ {% image "./images/solutions/ff-uns.png", "FlowFuse hosting Node-RED connected to many devices", [400] %}
+
+
+
+
+
+
+
+
Unlock the power of your real-time data
+
IT and data professionals are often challenged by the complexities of accessing and analyzing data scattered across disparate systems in manufacturing environments. UNS offers a solution to these challenges by providing a standardized way to access and utilize real-time data across your entire manufacturing operation.
+
+
+ {% set sections = [
+ {
+ "svgPath": "components/icons/circle-stack.svg",
+ "title": "Break down data silos",
+ "description": "Access data from any source, regardless of its format or location and make it available through a central hub. "
+ },
+ {
+ "svgPath": "components/icons/eye.svg",
+ "title": "Gain real-time visibility",
+ "description": "Monitor your operations with interactive visual dashboards."
+ },
+ {
+ "svgPath": "components/icons/bolt.svg",
+ "title": "Make faster, data-driven decisions",
+ "description": "Analyze data from across your organization to identify gaps and optimize processes."
+ },
+ {
+ "svgPath": "components/icons/lock-closed.svg",
+ "title": "Replace point-to-point connections",
+ "description": "Seamlessly share data across your entire operation."
+ },
+ {
+ "svgPath": "components/icons/arrows-pointing-out.svg",
+ "title": "Improved collaboration",
+ "description": "Adapt data across different systems with minimal data loss or loss of context."
+ }
+ ] %}
+
+
+
With FlowFuse adopting UNS has never been faster or easier
+
+ {% for section in sections %}
+
+
+
+
+ {% include section.svgPath %}
+
+
+
+
{{ section.title }}
+
+
+
+
+
{{ section.description | safe }}
+
+
+
+ {% endfor %}
+
+
+
From Data Source to Application:
+ Streamline Your UNS Workflows with FlowFuse
+ {% image "./images/solutions/flowfuse-uns.png", "FlowFuse UNS Workflow", [1024] %}
+
+
+
+
+
+
+
The FlowFuse Advantage
+
+ {% set sections = [
+ {
+ "title": "Built-in adaptation layer",
+ "description": "Leverage the power of Node-RED to transform and make your data available for UNS."
+ },
+ {
+ "title": "End-to-end UNS platform",
+ "description": "Everything you need to connect, manage, visualize and analyze your data in one place."
+ },
+ {
+ "title": "Seamless integration",
+ "description": "Built-in MQTT Broker ready to use alongside your Node-RED applications with robust
+ enterprise-grade features of the FlowFuse Platform."
+ },
+ {
+ "title": "Rapid implementation",
+ "description": "Get up and running quickly on FlowFuse Cloud."
+ },
+ {
+ "title": "Open-source",
+ "description": "Avoid vendor lock-in."
+ },
+ {
+ "title": "Low-Code",
+ "description": "Empowering your teams to build custom solutions with ease."
+ }
+ ] %}
+
+ {% for section in sections %}
+
+
{{ section.title }}
+
{{ section.description }}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
Ready to simplify your UNS journey and unlock the power of your industrial data?
-
-
-
-
-
\ No newline at end of file
+{% include "./_includes/layouts/common-js.njk" %}
diff --git a/src/thank-you/contact.njk b/src/thank-you/contact.njk
index 8a996bbf0c..5b31cfad17 100644
--- a/src/thank-you/contact.njk
+++ b/src/thank-you/contact.njk
@@ -1,8 +1,9 @@
---
title: Thank you for contacting us
-subtitle: We will get back to you soon to schedule a meeting. In the meantime explore more about FlowFuse and Node-RED
-description:
+subtitle: "Schedule a call right now"
+description: Or get inspired by our customer success stories while you wait for someone from our team to reach out to you.
downloadFollowUp: false
+readingResources: stories
hubspot:
cta: "cta-blog-subscribe"
reference: "thank-you-contact"
diff --git a/src/thank-you/download-platform-overview.njk b/src/thank-you/download-platform-overview.njk
index 6a3783edf9..80539db502 100644
--- a/src/thank-you/download-platform-overview.njk
+++ b/src/thank-you/download-platform-overview.njk
@@ -1,6 +1,6 @@
---
title: Thank you for your interest!
-subtitle: "Click here to access the The FlowFuse Paltform Overview"
+subtitle: "Click here to access the The FlowFuse Platform Overview"
description: "We've also sent a copy to your inbox"
downloadFollowUp: true
hubspot:
diff --git a/src/unified-namespace/index.njk b/src/unified-namespace/index.njk
deleted file mode 100644
index d67caab04c..0000000000
--- a/src/unified-namespace/index.njk
+++ /dev/null
@@ -1,239 +0,0 @@
----
-layout: page
-nohero: true
-faqTitle: "Frequently Asked Questions"
-faqSubtitle: "Have a question that you don't see answered here? Feel free to reach out to us via our Contact Us page"
-meta:
- title: "Unified Namespace (UNS)"
- keywords: Unified Namespace, UNS, Data Architecture, Digital Transformation, Data Integration, Data Management, Data Governance
- faq:
- - question: "What is the UNS?"
- answer: >
- The unified namespace is a new data architecture to accellerate digital transformation. All data, from sensors, systems, and machines are connected to make their data available to a unified network of data producers and consumers. This speeds up
- application building, system integration, and delivers faster insights into productivity.
- - question: "Why is the UNS important?"
- answer: >
- The UNS makes data available for more people to make better data-driven decisions. Furthermore, it allows for quick integration of new services and machines.
- - question: "How to implement a unified namespace?"
- answer: >
- To implement a unified namespace you'll adapt your data producers to talk to
- a common broker. The adaptation layer is usually Node-RED, where MQTT is the current
- default pick as broker protocol. Implementation can start piece-meal and the value
- the UNS delivers will grow expontially.
- - question: "How much does a unified namespace cost?"
- answer: >
- A proof-of-concept implementation can happen entirely with open-source software, and be free. For production and enterprise features
- and reliablity there's licenses for sale for both MQTT brokers, and message formatters like Node-RED.
----
-
-
-
-
-
-
-
-
- What is the unified namespace (UNS)?
-
-
- Making data available to many applications across the organisation for rapid
- iterative development and integration.
-
- Provide insight into the information available with a defined message structure.
-
-
-
-
-
- {% image "./images/pictograms/storage_blue.png", "Graphics depicting a data base.", [64] %}
-
-
- Data availability
-
-
-
- Break the ISA-95 chains and make data available for the whole shop floor, accellerate innovation.
-
-
-
-
-
-
-
-
-
-
-
-
Unlocking Data Power with Unified Namespaces
-
Unified Namespaces (UNS) provide a centralized, standardized approach to data management and governance
-
-
-
-
-
-
-
- Data Accessibility
-
-
- UNS serves as a unified repository, simplifying data discovery for rich applications.
-
-
-
-
- Faster System Integration
-
-
- UNS introduces a consistent naming convention, streamlining technology integration.
-
-
-
-
- Enhanced Scalability
-
-
- Designed for IT landscape growth, UNS seamlessly integrates new devices and systems.
-
-
-
-
-
-
-
- FlowFuse seamlessly integrates with UNS
-
-
- FlowFuse enhances implementation and data management. Users can refine and preprocess data before publishing it to the Unified Namespace. As a comprehensive platform, FlowFuse extends Node-RED's capabilities, serving as a centralized hub for data flows.
-
-
- With effortless integration into UNS, users gain control over data pipelines, ensuring continuous flow and integrity. For a successful UNS implementation, trust our expert team to guide your organization effectively, unlocking the full potential for actionable insights.
-
-
diff --git a/src/webinars/2023/building-scalable-ha-node-red.md b/src/webinars/2023/building-scalable-ha-node-red.md
index ce16c6dd15..5f1382b8c7 100644
--- a/src/webinars/2023/building-scalable-ha-node-red.md
+++ b/src/webinars/2023/building-scalable-ha-node-red.md
@@ -12,7 +12,7 @@ hubspot:
formId: b4ec9aa1-8648-47b3-b908-ec8597e8735d
---
-**In today's fast-paced and interconnected world, the demand for scalable and highly available applications is greater than ever. Node-RED, a powerful flow-based programming tool, has gained immense popularity due to its simplicity and versatility in building Internet of Things (IoT) and automation applications. However, when it comes to developing robust and resilient systems, scalability and high availability are crucial factors that cannot be overlooked.**
+**The demand for scalable and highly available applications is greater than ever. Node-RED, a powerful flow-based programming tool, has gained immense popularity due to its simplicity and versatility in building Internet of Things (IoT) and automation applications. However, when it comes to developing robust and resilient systems, scalability and high availability are crucial factors that cannot be overlooked.**
diff --git a/src/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md b/src/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md
index c13850b059..5e74737f2c 100644
--- a/src/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md
+++ b/src/webinars/2024/bringing-node-red-to-industrial-solutions-with-wago.md
@@ -3,13 +3,13 @@ title: "Bringing Node-RED to Industrial Solutions with Wago"
subtitle: Nick O'Leary, Co-Creator of Node-RED & CTO at FlowFuse, and Kurt Braun, Director of Automation Sales Engineering and Development at Wago, discuss how to bridge Node-RED to industrial solutions with Wago.
image: /images/webinars/webinar-node-red-wago.jpg
date: 2024-10-30
-time: 17:00 CET (11:00am ET)
+time: 16:00 CET (11:00am ET)
duration: 60
-video:
+video: vY1Py1zGres
hosts: ["nick-oleary", "kurt-braun"]
hubspot:
formId: 199b2015-0465-4f98-a95e-034744fb791c
- downloadFormId:
+ downloadFormId: 92556a27-b6bc-44d8-bf7a-93f2381b3e6c
---
**This webinar explores how Node-RED's low-code platform, coupled with FlowFuse's enterprise-grade management, empowers engineers to create innovative industrial automation solutions directly on WAGO hardware.**
@@ -18,15 +18,15 @@ hubspot:
The industrial automation landscape demands rapid innovation and agility. However, traditional development methods often struggle to keep pace with evolving requirements. Node-RED, a powerful low-code tool, offers a solution, enabling engineers to build and deploy applications with speed and efficiency.
-In this webinar, we will delve into real-world applications of Node-RED within industrial settings, highlighting how WAGO leverages this technology to empower their engineers and accelerate their automation projects.
+In this webinar, we delve into real-world applications of Node-RED within industrial settings, highlighting how WAGO leverages this technology to empower their engineers and accelerate their automation projects.
-Nick O'Leary, FlowFuse CTO and Node-RED creator, along with Kurt Braun, Director of Automation Sales Engineering and Development at WAGO, will talk about:
+Nick O'Leary, FlowFuse CTO and Node-RED creator, along with Kurt Braun, Director of Automation Sales Engineering and Development at WAGO, talk about:
- The evolution of Node-RED as a tool for industrial automation
- WAGO's successful use of Node-RED to simplify development and empower engineers
- Real-world case studies and demos showcasing Node-RED's impact in industrial projects
- How FlowFuse enhances Node-RED deployments with enterprise-grade management, scalability, and security
-There will also be a live demo of Node-RED flows integrated with dashboards on WAGO hardware.
+They also demo Node-RED flows integrated with dashboards on WAGO hardware.
This webinar is ideal for automation engineers, industrial system integrators, control systems engineers, and anyone interested in leveraging low-code development for industrial automation.
diff --git a/src/webinars/2024/flowfuse-mqtt-broker-for-industrial-transformation.md b/src/webinars/2024/flowfuse-mqtt-broker-for-industrial-transformation.md
new file mode 100644
index 0000000000..dbd1405206
--- /dev/null
+++ b/src/webinars/2024/flowfuse-mqtt-broker-for-industrial-transformation.md
@@ -0,0 +1,30 @@
+---
+title: "Unlocking the Power of Real-Time Data: FlowFuse MQTT Broker for Industrial Transformation"
+subtitle: This webinar introduces the new FlowFuse MQTT Broker service which helps simplify access to real-time data for optimizing your industrial processes.
+image: /images/webinars/flowfuse-mqtt-broker-for-industrial-transformation.jpg
+date: 2024-11-27
+time: 17:00 CET (11:00am ET)
+duration: 60
+video: FHsVS7LYE_4
+hosts: ["nick-oleary"]
+hubspot:
+ formId: a428b608-d71d-4955-8791-f0d309cf2fec
+ downloadFormId: 5be899dc-9908-4797-a207-89f47ace69c7
+---
+
+**Optimize your industrial processes with FlowFuse MQTT Broker, a new service that simplifies real-time data access.**
+
+
+
+Real-time data is essential for driving operational efficiency and fostering innovation within the industrial sector. Yet, effectively managing and leveraging this data can be a formidable challenge. Legacy systems, fragmented data sources, and intricate integration processes often prevent organizations from fully unlocking the potential of their industrial data.
+
+This is where an MQTT Broker can help. It acts as a central hub, facilitating communication between devices and applications by receiving, filtering, and distributing messages.
+
+In this webinar, we introduce the FlowFuse MQTT Broker, a seamless solution that enables you to manage all your MQTT clients, Node-RED instances, and devices from a single, centralized platform, eliminating the need for a separate broker service.
+
+Join Nick O’Leary, creator of Node-RED and CTO at FlowFuse to learn about
+- The advantages of MQTT for industrial communication
+- Key features and benefits of the FlowFuse MQTT Broker
+- How to integrate FlowFuse with existing industrial systems
+
+This webinar is ideal for automation engineers, and operational technology (OT) leaders seeking to optimize their data pipelines and accelerate digital transformation initiatives. Watch the recording or download the slides to gain valuable insights and discover how FlowFuse can revolutionize your approach to real-time data management in the industrial world.
diff --git a/src/webinars/webinars.json b/src/webinars/webinars.json
index c7bf5473f2..a86e35bc1f 100644
--- a/src/webinars/webinars.json
+++ b/src/webinars/webinars.json
@@ -2,5 +2,7 @@
"tags": [
"webinar", "event"
],
- "layout": "layouts/webinar.njk"
-}
\ No newline at end of file
+ "layout": "layouts/webinar.njk",
+ "nav": "webinars",
+ "searchTitle": "Webinars"
+}
diff --git a/src/whitepaper/accelerating-innovation-in-manufacturing-with-flowfuse.md b/src/whitepaper/accelerating-innovation-in-manufacturing-with-flowfuse.md
index 503b50050f..7383b8deed 100644
--- a/src/whitepaper/accelerating-innovation-in-manufacturing-with-flowfuse.md
+++ b/src/whitepaper/accelerating-innovation-in-manufacturing-with-flowfuse.md
@@ -4,6 +4,7 @@ meta:
title: Accelerating Innovation in Manufacturing with FlowFuse
description: Break down data silos & unlock innovation! Discover how FlowFuse leverages UNS, MQTT & Node-RED to create a unified data platform for agile application development in manufacturing. Download our whitepaper to see how FlowFuse empowers citizen developers & accelerates digital transformation.
image: /whitepaper/images/whitepaper-manufacturing.png
+thumbnail: /resources/images/Whitepaper_Accelerating-Innovation-in-Manufacturing-with-FlowFuse.png
hubspot:
script: "hubspot/hs-form.njk"
formId: ccb34689-88f5-4c32-b1d8-529c564d8c8a
diff --git a/src/whitepaper/open-source-software-for-manufacturing.md b/src/whitepaper/open-source-software-for-manufacturing.md
index 95b00cf457..f73afe0a80 100644
--- a/src/whitepaper/open-source-software-for-manufacturing.md
+++ b/src/whitepaper/open-source-software-for-manufacturing.md
@@ -5,6 +5,7 @@ meta:
title: Open Source Software for Manufacturing
description: In this free white paper get a comprehensive understanding of why open source software (OSS) is a smart choice for digital transformation and industrial agility
image: /whitepaper/images/whitepaper-oss-manufacturing.jpg
+thumbnail: /resources/images/Whitepaper_Open-Source-in-Manufacturing.png
hubspot:
script: "hubspot/hs-form.njk"
formId: 0ecb7f9a-cae9-403f-9067-50d4cf494255
diff --git a/src/whitepaper/whitepaper.json b/src/whitepaper/whitepaper.json
index 9e0ff5450d..fca68f8658 100644
--- a/src/whitepaper/whitepaper.json
+++ b/src/whitepaper/whitepaper.json
@@ -1,3 +1,6 @@
{
- "layout": "layouts/whitepaper.njk"
+ "layout": "layouts/whitepaper.njk",
+ "tags": [
+ "whitepaper"
+ ]
}
\ No newline at end of file
diff --git a/tailwind.config.js b/tailwind.config.js
index 2f6a1ac575..7ad21b6529 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -2,6 +2,10 @@ const plugin = require('tailwindcss/plugin')
module.exports = {
content: ['src/**/*.html','src/**/*.njk','src/**/*.md','src/**/*.svg','.eleventy.js'],
+ safelist: [
+ 'ml-4',
+ 'ml-8'
+ ],
theme: {
extend: {
typography: (theme) => ({