[{"data":1,"prerenderedAt":343},["ShallowReactive",2],{"application-guide-nav":3,"agmd-flowfuse-software-apps":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":49,"blurb":51,"body":120,"description":132,"extension":336,"guide":5,"meta":337,"navOrder":50,"navTitle":49,"navigation":338,"parent":26,"path":339,"seo":340,"slug":48,"stem":341,"__hash__":342},"applicationGuideDoc\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps.md",{"type":121,"value":122,"toc":333},"minimark",[123,126,133,135],[124,125,49],"h1",{"id":48},[127,128,129],"p",{},[130,131,132],"strong",{},"Software apps — start here",[127,134,51],{},[136,137,138,214,272],"guide-tabs",{},[139,140,142,147,150,156,162,167,195,200],"guide-tab",{"label":141},"Packaged App",[143,144],"flow-diagram",{":edges":145,":nodes":146},"[{\"from\":\"broker\",\"to\":\"instance\",\"label\":\"subscribes\"},{\"from\":\"instance\",\"to\":\"tables\",\"label\":\"writes\"}]","[{\"id\":\"broker\",\"label\":\"Team Broker\",\"sub\":\"MQTT\",\"accent\":\"teal\"},{\"id\":\"instance\",\"label\":\"Hosted Instance\",\"sub\":\"headless · no UI\",\"accent\":\"indigo\"},{\"id\":\"tables\",\"label\":\"FlowFuse Tables\",\"sub\":\"writes rows\",\"accent\":\"green\"}]",[127,148,149],{},"A headless, self-contained job that runs the same everywhere — an MQTT-to-DB connector, a pipeline, a scheduled task. No UI.",[127,151,152,155],{},[130,153,154],{},"Use it when"," — A self-contained job with no screen and no per-site settings: connectors, pipelines, scheduled work.",[127,157,158,161],{},[130,159,160],{},"How it works"," — Built and promoted through a pipeline; runs headless on a Hosted (or Remote) Instance. Everything is baked into the snapshot; only fixed env vars vary at deploy.",[127,163,164],{},[130,165,166],{},"Major components",[168,169,170,177,183,189],"ul",{},[171,172,173,176],"li",{},[130,174,175],{},"Team Broker (MQTT)"," — the event stream the app subscribes to",[171,178,179,182],{},[130,180,181],{},"Hosted Instance"," — FlowFuse-managed Node-RED running the headless app",[171,184,185,188],{},[130,186,187],{},"Packaged App (no UI)"," — the logic itself, no dashboard",[171,190,191,194],{},[130,192,193],{},"FlowFuse Tables"," — where the app writes its rows",[127,196,197],{},[130,198,199],{},"Where config & data live",[168,201,202,208],{},[171,203,204,207],{},[130,205,206],{},"Config"," — baked into the snapshot; only fixed env vars at deploy.",[171,209,210,213],{},[130,211,212],{},"Data"," — reads the Team Broker, writes FlowFuse Tables.",[139,215,217,221,224,229,234,238,256,260],{"label":216},"Data-Driven App",[143,218],{":edges":219,":nodes":220},"[{\"from\":\"users\",\"to\":\"instance\",\"label\":\"opens\",\"dir\":\"both\"},{\"from\":\"instance\",\"to\":\"tables\",\"label\":\"reads · writes\",\"dir\":\"both\"}]","[{\"id\":\"users\",\"label\":\"Users\",\"sub\":\"browser\",\"accent\":\"slate\"},{\"id\":\"instance\",\"label\":\"Hosted Instance\",\"sub\":\"data-driven app\",\"accent\":\"indigo\"},{\"id\":\"tables\",\"label\":\"FlowFuse Tables\",\"sub\":\"records\",\"accent\":\"green\"}]",[127,222,223],{},"A user-facing app on a Hosted Instance — a time clock, an asset manager — whose content is driven by data. It needs a backend and a data source to be complete.",[127,225,226,228],{},[130,227,154],{}," — Apps whose displayed settings or records change between deployments and grow over time: time clocks, registries, asset managers.",[127,230,231,233],{},[130,232,160],{}," — Same pipeline delivery to a Hosted Instance; the runtime loads its data from FlowFuse Tables or the Team Broker, served by a backend behind the screen.",[127,235,236],{},[130,237,166],{},[168,239,240,246,251],{},[171,241,242,245],{},[130,243,244],{},"Users (browser)"," — the people using the app's dashboard",[171,247,248,250],{},[130,249,181],{}," — runs the data-driven app and serves its UI",[171,252,253,255],{},[130,254,193],{}," — the records the app reads and writes",[127,257,258],{},[130,259,199],{},[168,261,262,267],{},[171,263,264,266],{},[130,265,206],{}," — app settings and records live in FlowFuse Tables (or context), editable without redeploying.",[171,268,269,271],{},[130,270,212],{}," — FlowFuse Tables for records, the Team Broker for live values.",[139,273,275,280,283,288,293,297,317,321],{"label":274},"Shared Building Block",[143,276],{":edges":277,":nodes":278,":legend":279},"[{\"from\":\"block\",\"to\":\"library\",\"label\":\"publish\"},{\"from\":\"library\",\"to\":\"instances\",\"label\":\"embedded in\",\"accent\":\"red\",\"dashed\":true}]","[{\"id\":\"block\",\"label\":\"Shared Building Block\",\"sub\":\"reusable subflows\",\"accent\":\"indigo\"},{\"id\":\"library\",\"label\":\"Team Library\",\"sub\":\"catalogue\",\"accent\":\"slate\"},{\"id\":\"instances\",\"label\":\"Hosted Instances\",\"sub\":\"embed & upgrade together\",\"accent\":\"indigo\",\"many\":true}]","[{\"line\":\"red\",\"dashed\":true,\"label\":\"embedded in\"}]",[127,281,282],{},"A reusable piece of UI or logic that other apps embed — not an app itself. Think a common dashboard surface many Hosted Instances present through.",[127,284,285,287],{},[130,286,154],{}," — Many apps should share one piece of UI or logic and upgrade it in lockstep.",[127,289,290,292],{},[130,291,160],{}," — Published as subflows to the Team Library with an example flow; updating the subflow updates every Hosted Instance that adopts the new version.",[127,294,295],{},[130,296,166],{},[168,298,299,305,311],{},[171,300,301,304],{},[130,302,303],{},"Shared Building Block (reusable subflows)"," — the block authored once",[171,306,307,310],{},[130,308,309],{},"Team Library"," — the catalogue it's published to",[171,312,313,316],{},[130,314,315],{},"Hosted Instances"," — the apps that embed it and upgrade together",[127,318,319],{},[130,320,199],{},[168,322,323,328],{},[171,324,325,327],{},[130,326,206],{}," — via the subflow's instance properties \u002F env where it's embedded.",[171,329,330,332],{},[130,331,212],{}," — none of its own; it embeds into the host app's data.",{"title":334,"searchDepth":67,"depth":67,"links":335},"",[],"md",{},true,"\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps",{"title":49,"description":132},"application-guide\u002Fflowfuse\u002Fsoftware-apps","JrK_ACyv67kKTjvA9dua0bGlx_D4C7ewCcY6NaWqDwA",1787068105900]