[{"data":1,"prerenderedAt":343},["ShallowReactive",2],{"agmd-flowfuse-software-apps":3,"application-guide-nav":235},{"id":4,"title":5,"blurb":6,"body":7,"description":20,"extension":225,"guide":226,"meta":227,"navOrder":228,"navTitle":5,"navigation":229,"parent":230,"path":231,"seo":232,"slug":13,"stem":233,"__hash__":234},"applicationGuideDoc\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps.md","Software apps","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).",{"type":8,"value":9,"toc":221},"minimark",[10,14,21,23],[11,12,5],"h1",{"id":13},"software-apps",[15,16,17],"p",{},[18,19,20],"strong",{},"Software apps — start here",[15,22,6],{},[24,25,26,102,160],"guide-tabs",{},[27,28,30,35,38,44,50,55,83,88],"guide-tab",{"label":29},"Packaged App",[31,32],"flow-diagram",{":edges":33,":nodes":34},"[{\"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\"}]",[15,36,37],{},"A headless, self-contained job that runs the same everywhere — an MQTT-to-DB connector, a pipeline, a scheduled task. No UI.",[15,39,40,43],{},[18,41,42],{},"Use it when"," — A self-contained job with no screen and no per-site settings: connectors, pipelines, scheduled work.",[15,45,46,49],{},[18,47,48],{},"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.",[15,51,52],{},[18,53,54],{},"Major components",[56,57,58,65,71,77],"ul",{},[59,60,61,64],"li",{},[18,62,63],{},"Team Broker (MQTT)"," — the event stream the app subscribes to",[59,66,67,70],{},[18,68,69],{},"Hosted Instance"," — FlowFuse-managed Node-RED running the headless app",[59,72,73,76],{},[18,74,75],{},"Packaged App (no UI)"," — the logic itself, no dashboard",[59,78,79,82],{},[18,80,81],{},"FlowFuse Tables"," — where the app writes its rows",[15,84,85],{},[18,86,87],{},"Where config & data live",[56,89,90,96],{},[59,91,92,95],{},[18,93,94],{},"Config"," — baked into the snapshot; only fixed env vars at deploy.",[59,97,98,101],{},[18,99,100],{},"Data"," — reads the Team Broker, writes FlowFuse Tables.",[27,103,105,109,112,117,122,126,144,148],{"label":104},"Data-Driven App",[31,106],{":edges":107,":nodes":108},"[{\"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\"}]",[15,110,111],{},"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.",[15,113,114,116],{},[18,115,42],{}," — Apps whose displayed settings or records change between deployments and grow over time: time clocks, registries, asset managers.",[15,118,119,121],{},[18,120,48],{}," — 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.",[15,123,124],{},[18,125,54],{},[56,127,128,134,139],{},[59,129,130,133],{},[18,131,132],{},"Users (browser)"," — the people using the app's dashboard",[59,135,136,138],{},[18,137,69],{}," — runs the data-driven app and serves its UI",[59,140,141,143],{},[18,142,81],{}," — the records the app reads and writes",[15,145,146],{},[18,147,87],{},[56,149,150,155],{},[59,151,152,154],{},[18,153,94],{}," — app settings and records live in FlowFuse Tables (or context), editable without redeploying.",[59,156,157,159],{},[18,158,100],{}," — FlowFuse Tables for records, the Team Broker for live values.",[27,161,163,168,171,176,181,185,205,209],{"label":162},"Shared Building Block",[31,164],{":edges":165,":nodes":166,":legend":167},"[{\"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\"}]",[15,169,170],{},"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.",[15,172,173,175],{},[18,174,42],{}," — Many apps should share one piece of UI or logic and upgrade it in lockstep.",[15,177,178,180],{},[18,179,48],{}," — Published as subflows to the Team Library with an example flow; updating the subflow updates every Hosted Instance that adopts the new version.",[15,182,183],{},[18,184,54],{},[56,186,187,193,199],{},[59,188,189,192],{},[18,190,191],{},"Shared Building Block (reusable subflows)"," — the block authored once",[59,194,195,198],{},[18,196,197],{},"Team Library"," — the catalogue it's published to",[59,200,201,204],{},[18,202,203],{},"Hosted Instances"," — the apps that embed it and upgrade together",[15,206,207],{},[18,208,87],{},[56,210,211,216],{},[59,212,213,215],{},[18,214,94],{}," — via the subflow's instance properties \u002F env where it's embedded.",[59,217,218,220],{},[18,219,100],{}," — none of its own; it embeds into the host app's data.",{"title":222,"searchDepth":223,"depth":223,"links":224},"",4,[],"md","flowfuse",{},3.2,true,"app-delivery-methods","\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps",{"title":5,"description":20},"application-guide\u002Fflowfuse\u002Fsoftware-apps","JrK_ACyv67kKTjvA9dua0bGlx_D4C7ewCcY6NaWqDwA",[236,243,247,253,256,261,266,272,277,279,284,290,295,300,306,312,318,323,328,333,337],{"guide":226,"slug":237,"title":238,"navOrder":239,"parent":240,"blurb":241,"path":242},"overview","Overview",1,null,"The map of the FlowFuse guide — apps, architectures, and a worked example.","\u002Fapplication-guide\u002Fflowfuse\u002Foverview\u002F",{"guide":244,"slug":237,"title":238,"navOrder":239,"parent":240,"blurb":245,"path":246},"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":226,"slug":248,"title":249,"navOrder":250,"parent":240,"blurb":251,"path":252},"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":244,"slug":248,"title":249,"navOrder":250,"parent":240,"blurb":254,"path":255},"The handful of concepts you need to build with Node-RED, and how they fit together.","\u002Fapplication-guide\u002Fnode-red\u002Ffoundations\u002F",{"guide":226,"slug":230,"title":257,"navOrder":258,"parent":240,"blurb":259,"path":260},"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":244,"slug":262,"title":263,"navOrder":258,"parent":240,"blurb":264,"path":265},"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":226,"slug":267,"title":268,"navOrder":269,"parent":230,"blurb":270,"path":271},"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":244,"slug":273,"title":274,"navOrder":269,"parent":262,"blurb":275,"path":276},"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":226,"slug":13,"title":5,"navOrder":228,"parent":230,"blurb":6,"path":278},"\u002Fapplication-guide\u002Fflowfuse\u002Fsoftware-apps\u002F",{"guide":244,"slug":280,"title":281,"navOrder":228,"parent":262,"blurb":282,"path":283},"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":244,"slug":285,"title":286,"navOrder":287,"parent":262,"blurb":288,"path":289},"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":226,"slug":291,"title":292,"navOrder":223,"parent":240,"blurb":293,"path":294},"data-plane","Data plane","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":244,"slug":296,"title":297,"navOrder":223,"parent":240,"blurb":298,"path":299},"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":244,"slug":301,"title":302,"navOrder":303,"parent":296,"blurb":304,"path":305},"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":244,"slug":307,"title":308,"navOrder":309,"parent":296,"blurb":310,"path":311},"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":226,"slug":313,"title":314,"navOrder":315,"parent":240,"blurb":316,"path":317},"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":226,"slug":319,"title":320,"navOrder":321,"parent":313,"blurb":240,"path":322},"it-architectures","IT architectures",5.1,"\u002Fapplication-guide\u002Fflowfuse\u002Fit-architectures\u002F",{"guide":226,"slug":324,"title":325,"navOrder":326,"parent":313,"blurb":240,"path":327},"ot-architectures","OT architectures",5.2,"\u002Fapplication-guide\u002Fflowfuse\u002Fot-architectures\u002F",{"guide":226,"slug":329,"title":330,"navOrder":331,"parent":313,"blurb":240,"path":332},"iiot-architectures","IIoT architectures",5.3,"\u002Fapplication-guide\u002Fflowfuse\u002Fiiot-architectures\u002F",{"guide":226,"slug":296,"title":297,"navOrder":334,"parent":240,"blurb":335,"path":336},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":226,"slug":338,"title":339,"navOrder":340,"parent":296,"blurb":341,"path":342},"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",1787843652356]