[{"data":1,"prerenderedAt":432},["ShallowReactive",2],{"application-guide-nav":3,"agmd-flowfuse-data-plane":118},[4,12,16,22,25,31,36,42,47,53,58,64,70,75,81,87,93,98,103,108,112],{"guide":5,"slug":6,"title":7,"navOrder":8,"parent":9,"blurb":10,"path":11},"flowfuse","overview","Overview",1,null,"The map of the FlowFuse guide — apps, architectures, and a worked example.","\u002Fapplication-guide\u002Fflowfuse\u002Foverview\u002F",{"guide":13,"slug":6,"title":7,"navOrder":8,"parent":9,"blurb":14,"path":15},"node-red","The map of the Node-RED guide — the pattern families that turn an app into a clean flow.","\u002Fapplication-guide\u002Fnode-red\u002Foverview\u002F",{"guide":5,"slug":17,"title":18,"navOrder":19,"parent":9,"blurb":20,"path":21},"foundations","Foundations",2,"The foundation to build on: what FlowFuse is, its core pieces, and how code is shared across teams.","\u002Fapplication-guide\u002Fflowfuse\u002Ffoundations\u002F",{"guide":13,"slug":17,"title":18,"navOrder":19,"parent":9,"blurb":23,"path":24},"The handful of concepts you need to build with Node-RED, and how they fit together.","\u002Fapplication-guide\u002Fnode-red\u002Ffoundations\u002F",{"guide":5,"slug":26,"title":27,"navOrder":28,"parent":9,"blurb":29,"path":30},"app-delivery-methods","App delivery methods",3,"Two different units of code, delivered two ways. Ship the whole app — a complete, versioned project promoted through environments — or publish one reusable piece — a package the whole team installs and upgrades in one place. Pick by what you're shipping: the app, or a part of it.","\u002Fapplication-guide\u002Fflowfuse\u002Fapp-delivery-methods\u002F",{"guide":13,"slug":32,"title":33,"navOrder":28,"parent":9,"blurb":34,"path":35},"patterns","Patterns","The moves that turn an architecture into a clean, reusable flow — find the seams and reuse well, then handle data on the right paths.","\u002Fapplication-guide\u002Fnode-red\u002Fpatterns\u002F",{"guide":5,"slug":37,"title":38,"navOrder":39,"parent":26,"blurb":40,"path":41},"hardware-apps","Hardware apps",3.1,"The three shapes a FlowFuse app takes when it runs on a device. Pick by how much varies per site: nothing (Packaged App), a few settings (Configurable App), or you assemble it yourself (Edge Building Block).","\u002Fapplication-guide\u002Fflowfuse\u002Fhardware-apps\u002F",{"guide":13,"slug":43,"title":44,"navOrder":39,"parent":32,"blurb":45,"path":46},"design-patterns","Design patterns","The structural choices you select for a flow: find the seams it breaks into, then reuse each piece at the lightest level that solves it — link in\u002Fout, link call, subflow, or packaged node.","\u002Fapplication-guide\u002Fnode-red\u002Fdesign-patterns\u002F",{"guide":5,"slug":48,"title":49,"navOrder":50,"parent":26,"blurb":51,"path":52},"software-apps","Software apps",3.2,"The three shapes a FlowFuse app takes when it runs on the platform. Pick by what it needs: a headless job (Packaged App), a user-facing app driven by data (Data-Driven App), or a reusable piece other apps embed (Shared Building Block).","\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps\u002F",{"guide":13,"slug":54,"title":55,"navOrder":50,"parent":32,"blurb":56,"path":57},"handling-data","Handling data","Classify each signal by shape, purpose and direction, then pick the methods it needs — separate the paths, pace the flow, hold state in context, and manage config. The methods you select to move a flow's data.","\u002Fapplication-guide\u002Fnode-red\u002Fhandling-data\u002F",{"guide":13,"slug":59,"title":60,"navOrder":61,"parent":32,"blurb":62,"path":63},"good-form","Good form",3.3,"A clean flow isn't luck — it's a handful of habits. Wire for reading, lay it out on a grid, decouple UI from logic, catch errors where you can see them, and keep data on a stable contract. Follow these and a flow stays readable, reusable, and out of spaghetti.","\u002Fapplication-guide\u002Fnode-red\u002Fgood-form\u002F",{"guide":5,"slug":65,"title":66,"navOrder":67,"parent":9,"blurb":68,"path":69},"data-plane","Data plane",4,"Before you pick where things run, decide how data is handled. Two stores come built into every FlowFuse server install — the Team Broker and relational Tables — exposed to every instance with nothing extra to stand up. Everything else you bring your own: run it (a time-series DB, an existing database, a model) and expose it to the fleet over Project Link, no inbound ports. This is the data plane the architectures on the next pages all sit on.","\u002Fapplication-guide\u002Fflowfuse\u002Fdata-plane\u002F",{"guide":13,"slug":71,"title":72,"navOrder":67,"parent":9,"blurb":73,"path":74},"worked-examples","Worked examples","Turn an app concept into a Node-RED flow — or a few — leaning on the design patterns and data handling. The method, then the OEE apps end to end.","\u002Fapplication-guide\u002Fnode-red\u002Fworked-examples\u002F",{"guide":13,"slug":76,"title":77,"navOrder":78,"parent":71,"blurb":79,"path":80},"oee-edge-aggregator","OEE - Edge Aggregator",4.1,"The edge app from the OEE use case as a Node-RED flow — a straight-line flow packaged as a subflow and configured per line (its PLC tags, via a config UI and a get-config node), with the data treated as a stream and its counts held in context.","\u002Fapplication-guide\u002Fnode-red\u002Foee-edge-aggregator\u002F",{"guide":13,"slug":82,"title":83,"navOrder":84,"parent":71,"blurb":85,"path":86},"oee-central-dashboard","OEE - Central Dashboard",4.2,"The cloud app from the OEE use case as a Node-RED flow — one link out fanning to two link ins on separate tabs (dashboard and batched history), so the live and history paths stay separate and easy to read.","\u002Fapplication-guide\u002Fnode-red\u002Foee-central-dashboard\u002F",{"guide":5,"slug":88,"title":89,"navOrder":90,"parent":9,"blurb":91,"path":92},"architectures","Architectures",5,"Every FlowFuse deployment is the same building blocks arranged for where it runs — pick the world you're designing for.","\u002Fapplication-guide\u002Fflowfuse\u002Farchitectures\u002F",{"guide":5,"slug":94,"title":95,"navOrder":96,"parent":88,"blurb":9,"path":97},"it-architectures","IT architectures",5.1,"\u002Fapplication-guide\u002Fflowfuse\u002Fit-architectures\u002F",{"guide":5,"slug":99,"title":100,"navOrder":101,"parent":88,"blurb":9,"path":102},"ot-architectures","OT architectures",5.2,"\u002Fapplication-guide\u002Fflowfuse\u002Fot-architectures\u002F",{"guide":5,"slug":104,"title":105,"navOrder":106,"parent":88,"blurb":9,"path":107},"iiot-architectures","IIoT architectures",5.3,"\u002Fapplication-guide\u002Fflowfuse\u002Fiiot-architectures\u002F",{"guide":5,"slug":71,"title":72,"navOrder":109,"parent":9,"blurb":110,"path":111},6,"Start from a use case, break it into apps, and draw the architecture that ties them together — the same method a FlowFuse Proof of Value runs.","\u002Fapplication-guide\u002Fflowfuse\u002Fworked-examples\u002F",{"guide":5,"slug":113,"title":114,"navOrder":115,"parent":71,"blurb":116,"path":117},"worked-example","OEE, end to end",6.1,"One use case — OEE across three lines — broken into two apps and two shared services, then drawn out end to end.","\u002Fapplication-guide\u002Fflowfuse\u002Fworked-example\u002F",{"id":119,"title":66,"blurb":68,"body":120,"description":132,"extension":425,"guide":5,"meta":426,"navOrder":67,"navTitle":66,"navigation":427,"parent":9,"path":428,"seo":429,"slug":65,"stem":430,"__hash__":431},"applicationGuideDoc\u002Fapplication-guide\u002Fflowfuse\u002Fdata-plane.md",{"type":121,"value":122,"toc":422},"minimark",[123,126,133,135,408],[124,125,66],"h1",{"id":65},[127,128,129],"p",{},[130,131,132],"strong",{},"Data plane — start here",[127,134,68],{},[136,137,138,216,279,348],"guide-tabs",{},[139,140,142,148,155,158,164,170,175,203,208],"guide-tab",{"label":141},"Relational",[127,143,144,147],{},[130,145,146],{},"Built in"," — ships with every FlowFuse server install; exposed to every instance.",[149,150],"flow-diagram",{":edges":151,":groups":152,":legend":153,":nodes":154},"[{\"from\":\"instances\",\"to\":\"tables\",\"label\":\"query & update\",\"accent\":\"slate\"}]","[{\"label\":\"Built into every FlowFuse server install\",\"accent\":\"green\",\"nodes\":[\"tables\"]}]","[{\"line\":\"slate\",\"label\":\"Authenticated · every instance reaches it\"}]","[{\"id\":\"instances\",\"label\":\"Instances\",\"sub\":\"App A · B · C\",\"accent\":\"indigo\",\"many\":true},{\"id\":\"tables\",\"label\":\"FlowFuse Tables\",\"sub\":\"relational\",\"accent\":\"green\"}]",[127,156,157],{},"A place for records that relate to each other — assets, config, users, orders — that you look up, join and update in place. It's FlowFuse Tables, built into every FlowFuse server install and exposed to every instance on the team.",[127,159,160,163],{},[130,161,162],{},"Use it when"," — The data has structure and relationships, and apps across the team should read and write the same store.",[127,165,166,169],{},[130,167,168],{},"How it works"," — FlowFuse Tables (managed PostgreSQL) via the Query node; because it ships with the server, any instance on the team reaches it natively over an authenticated connection.",[127,171,172],{},[130,173,174],{},"In FlowFuse",[176,177,178,185,191,197],"ul",{},[179,180,181,184],"li",{},[130,182,183],{},"FlowFuse Tables"," — managed PostgreSQL, built into every FlowFuse install",[179,186,187,190],{},[130,188,189],{},"Query node"," — read, join and update from any instance",[179,192,193,196],{},[130,194,195],{},"Exposed to the whole team automatically"," — nothing to stand up",[179,198,199,202],{},[130,200,201],{},"Also any external Postgres"," — same node",[127,204,205],{},[130,206,207],{},"Good to know",[176,209,210],{},[179,211,212,215],{},[130,213,214],{},"Watch out"," — not for high-rate timestamped streams; use the time-series target for those.",[139,217,219,224,231,234,239,244,248,268,272],{"label":218},"Broker \u002F UNS",[127,220,221,223],{},[130,222,146],{}," — ships with every FlowFuse server install; publish once, many subscribe.",[225,226],"arch-diagram",{":edges":227,":groups":228,":legend":229,":nodes":230},"[{\"from\":\"pub\",\"to\":\"broker\",\"label\":\"publish\",\"accent\":\"teal\",\"dashed\":true},{\"from\":\"broker\",\"to\":\"dashboard\",\"label\":\"subscribe\",\"accent\":\"teal\",\"dashed\":true},{\"from\":\"broker\",\"to\":\"historian\",\"accent\":\"teal\",\"dashed\":true},{\"from\":\"broker\",\"to\":\"other\",\"accent\":\"teal\",\"dashed\":true}]","[{\"label\":\"Built into every FlowFuse install\",\"accent\":\"teal\",\"nodes\":[\"broker\"]}]","[{\"line\":\"teal\",\"dashed\":true,\"label\":\"MQTT · publish once, many subscribe\"}]","[{\"id\":\"dashboard\",\"label\":\"Dashboard\",\"sub\":\"subscribes\",\"accent\":\"blue\",\"col\":1,\"row\":1},{\"id\":\"historian\",\"label\":\"Historian\",\"sub\":\"subscribes\",\"accent\":\"green\",\"col\":2,\"row\":1},{\"id\":\"other\",\"label\":\"Other app\",\"sub\":\"subscribes\",\"accent\":\"slate\",\"col\":3,\"row\":1},{\"id\":\"broker\",\"label\":\"Team Broker\",\"sub\":\"built in · UNS\",\"accent\":\"teal\",\"col\":2,\"row\":2},{\"id\":\"pub\",\"label\":\"Instance\",\"sub\":\"publishes\",\"accent\":\"indigo\",\"col\":2,\"row\":3}]",[127,232,233],{},"A real-time bus, not storage: one instance publishes to a topic, any number subscribe. It's the Team Broker, built into every FlowFuse server install — the backbone of a Unified Namespace.",[127,235,236,238],{},[130,237,162],{}," — Live data needs to reach many consumers at once, decoupled, as it happens.",[127,240,241,243],{},[130,242,168],{}," — The built-in Team Broker with publish \u002F subscribe nodes; because it ships with the server, every instance on the team can publish and subscribe over MQTT. Pair with Tables when you also need to keep history.",[127,245,246],{},[130,247,174],{},[176,249,250,256,259,265],{},[179,251,252,255],{},[130,253,254],{},"Team Broker"," — built into every FlowFuse install, no separate product to stand up",[179,257,258],{},"publish \u002F subscribe nodes",[179,260,261,264],{},[130,262,263],{},"Topic structure"," — your Unified Namespace",[179,266,267],{},"Exposed to the whole team; pair with Tables for history",[127,269,270],{},[130,271,207],{},[176,273,274],{},[179,275,276,278],{},[130,277,214],{}," — it carries data, it doesn't store it; write to Tables too if you need history.",[139,280,282,288,294,297,302,307,311,337,341],{"label":281},"Time-series",[127,283,284,287],{},[130,285,286],{},"Bring your own"," — external today; FlowFuse has no built-in time-series DB.",[149,289],{":edges":290,":groups":291,":legend":292,":nodes":293},"[{\"from\":\"db\",\"to\":\"hosted\",\"label\":\"Postgres wire\",\"accent\":\"slate\"},{\"from\":\"hosted\",\"to\":\"fleet\",\"label\":\"Project Link\",\"accent\":\"red\",\"dashed\":true}]","[{\"label\":\"External · where the readings live\",\"accent\":\"slate\",\"nodes\":[\"db\"]}]","[{\"line\":\"slate\",\"label\":\"Postgres wire\"},{\"line\":\"red\",\"dashed\":true,\"label\":\"Project Link · target is a Hosted Instance\"}]","[{\"id\":\"db\",\"label\":\"Time-series DB\",\"sub\":\"Timescale \u002F QuestDB\",\"accent\":\"slate\"},{\"id\":\"hosted\",\"label\":\"Hosted Instance\",\"sub\":\"connects & fronts it\",\"accent\":\"indigo\"},{\"id\":\"fleet\",\"label\":\"Instances\",\"sub\":\"query by time\",\"accent\":\"slate\",\"many\":true}]",[127,295,296],{},"A store built for a steady stream of timestamped readings — sensor data, telemetry, trends — written fast and queried by time. FlowFuse has no built-in time-series database, so you run one and expose it to the fleet.",[127,298,299,301],{},[130,300,162],{}," — The data is a continuous stream of timestamped values, written at high rate and queried by time window.",[127,303,304,306],{},[130,305,168],{}," — Run TimescaleDB, QuestDB or InfluxDB where you want. A Hosted Instance connects to it — Timescale and Quest speak the Postgres wire, so the Query node connects exactly like Tables; InfluxDB connects through its own nodes — and fronts it; other instances reach it over Project Link, which always calls a Hosted Instance, with no inbound ports.",[127,308,309],{},[130,310,174],{},[176,312,313,319,325,331],{},[179,314,315,318],{},[130,316,317],{},"External"," — FlowFuse has no built-in time-series DB today",[179,320,321,324],{},[130,322,323],{},"TimescaleDB \u002F QuestDB"," — speak the Postgres wire; Query node connects like Tables",[179,326,327,330],{},[130,328,329],{},"Hosted Instance"," — connects to it and fronts it for the fleet",[179,332,333,336],{},[130,334,335],{},"Project Link"," — reaches it with no inbound ports (targets a Hosted Instance)",[127,338,339],{},[130,340,207],{},[176,342,343],{},[179,344,345,347],{},[130,346,214],{}," — not part of FlowFuse; you run and expose it. Pair with the Team Broker for live + history.",[139,349,350,355,361,364,369,374,378,396,400],{"label":286},[127,351,352,354],{},[130,353,286],{}," — expose any other store or service to the fleet over Project Link.",[149,356],{":edges":357,":groups":358,":legend":359,":nodes":360},"[{\"from\":\"store\",\"to\":\"hosted\",\"label\":\"connects\",\"accent\":\"slate\"},{\"from\":\"hosted\",\"to\":\"fleet\",\"label\":\"Project Link\",\"accent\":\"red\",\"dashed\":true}]","[{\"label\":\"Wherever it lives · you run it\",\"accent\":\"slate\",\"nodes\":[\"store\"]}]","[{\"line\":\"slate\",\"label\":\"connects\"},{\"line\":\"red\",\"dashed\":true,\"label\":\"Project Link · target is a Hosted Instance\"}]","[{\"id\":\"store\",\"label\":\"Your store \u002F service\",\"sub\":\"SQL · ML · gateway\",\"accent\":\"slate\"},{\"id\":\"hosted\",\"label\":\"Hosted Instance\",\"sub\":\"connects & fronts it\",\"accent\":\"indigo\"},{\"id\":\"fleet\",\"label\":\"Instances\",\"sub\":\"queries it\",\"accent\":\"slate\",\"many\":true}]",[127,362,363],{},"Any other store or service FlowFuse doesn't provide — an existing SQL database, an ML model, a site gateway. You run it where it already lives and expose it to the fleet of managed instances over Project Link, with no inbound ports.",[127,365,366,368],{},[130,367,162],{}," — You need to reach a store or service that isn't built in and isn't a time-series DB — an existing database, a model, a gateway.",[127,370,371,373],{},[130,372,168],{}," — A Hosted Instance connects to the store or service and fronts it; other instances reach it over Project Link — which always targets a Hosted Instance — as a secure API \u002F MCP endpoint, with no inbound ports and no copy into a warehouse.",[127,375,376],{},[130,377,174],{},[176,379,380,385,390,393],{},[179,381,382,384],{},[130,383,329],{}," — connects to the store \u002F service and fronts it",[179,386,387,389],{},[130,388,335],{}," — calls a Hosted Instance (only Hosted Instances are callable targets)",[179,391,392],{},"Any SQL database, ML model or gateway",[179,394,395],{},"Exposed as a secure API \u002F MCP endpoint, no inbound ports",[127,397,398],{},[130,399,207],{},[176,401,402],{},[179,403,404,407],{},[130,405,406],{},"Good for"," — keeping data and services where they already live and exposing them securely to the fleet. FlowFuse doesn't care what the target is.",[409,410,412],"callout",{"icon":411},"i-lucide-git-branch",[127,413,414,417,418],{},[130,415,416],{},"Single service?"," Calling one external endpoint from a flow — an HTTP request or webhook to one system — is a Node-RED decision, not a platform data target. ",[419,420,421],"a",{"href":57},"Node-RED guide →",{"title":423,"searchDepth":67,"depth":67,"links":424},"",[],"md",{},true,"\u002Fapplication-guide\u002Fflowfuse\u002Fdata-plane",{"title":66,"description":132},"application-guide\u002Fflowfuse\u002Fdata-plane","Qk71D8Ai3j7fDtwQ4ePjlhkYrIHofeKO2dfMAklYn1Y",1787068105494]