# Software apps

**Software apps — start here**

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).

<guide-tabs>
<guide-tab label="Packaged App">
<flow-diagram :edges="[{"from":"broker","to":"instance","label":"subscribes"},{"from":"instance","to":"tables","label":"writes"}]" :nodes="[{"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"}]">



</flow-diagram>

A headless, self-contained job that runs the same everywhere — an MQTT-to-DB connector, a pipeline, a scheduled task. No UI.

**Use it when** — A self-contained job with no screen and no per-site settings: connectors, pipelines, scheduled work.

**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.

**Major components**

- **Team Broker (MQTT)** — the event stream the app subscribes to
- **Hosted Instance** — FlowFuse-managed Node-RED running the headless app
- **Packaged App (no UI)** — the logic itself, no dashboard
- **FlowFuse Tables** — where the app writes its rows

**Where config & data live**

- **Config** — baked into the snapshot; only fixed env vars at deploy.
- **Data** — reads the Team Broker, writes FlowFuse Tables.

</guide-tab>

<guide-tab label="Data-Driven App">
<flow-diagram :edges="[{"from":"users","to":"instance","label":"opens","dir":"both"},{"from":"instance","to":"tables","label":"reads · writes","dir":"both"}]" :nodes="[{"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"}]">



</flow-diagram>

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.

**Use it when** — Apps whose displayed settings or records change between deployments and grow over time: time clocks, registries, asset managers.

**How it works** — 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.

**Major components**

- **Users (browser)** — the people using the app's dashboard
- **Hosted Instance** — runs the data-driven app and serves its UI
- **FlowFuse Tables** — the records the app reads and writes

**Where config & data live**

- **Config** — app settings and records live in FlowFuse Tables (or context), editable without redeploying.
- **Data** — FlowFuse Tables for records, the Team Broker for live values.

</guide-tab>

<guide-tab label="Shared Building Block">
<flow-diagram :edges="[{"from":"block","to":"library","label":"publish"},{"from":"library","to":"instances","label":"embedded in","accent":"red","dashed":true}]" :nodes="[{"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}]" :legend="[{"line":"red","dashed":true,"label":"embedded in"}]">



</flow-diagram>

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.

**Use it when** — Many apps should share one piece of UI or logic and upgrade it in lockstep.

**How it works** — Published as subflows to the Team Library with an example flow; updating the subflow updates every Hosted Instance that adopts the new version.

**Major components**

- **Shared Building Block (reusable subflows)** — the block authored once
- **Team Library** — the catalogue it's published to
- **Hosted Instances** — the apps that embed it and upgrade together

**Where config & data live**

- **Config** — via the subflow's instance properties / env where it's embedded.
- **Data** — none of its own; it embeds into the host app's data.

</guide-tab>
</guide-tabs>
