From da71617e5308886e7658ba54698d1eb3a16efff1 Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Tue, 4 Aug 2026 21:52:49 +0200 Subject: [PATCH 1/2] Use case pages: add a How It Works section Use case pages carried only what and why. This adds a howItWorks block to the layout covering the component breakdown, the design pattern chosen, an end-to-end architecture diagram and the hand-off into the product docs. Filled in for production monitoring and shop floor communication, with placehold.co stand-ins until the real diagrams are drawn. Two supporting fixes: section eyebrow numbers now derive from the nav array instead of being hardcoded, so they no longer drift when a page omits a block; and the architecture front-matter key on shop floor communication, which the layout never read, now renders as a link to the architecture page the use case sits on. --- src/_includes/layouts/use-case.njk | 143 +++++++++++++++++++-- src/use-cases/production-monitoring.njk | 38 ++++++ src/use-cases/shop-floor-communication.njk | 39 +++++- 3 files changed, 207 insertions(+), 13 deletions(-) diff --git a/src/_includes/layouts/use-case.njk b/src/_includes/layouts/use-case.njk index d3a0372a73..edcb7c0171 100644 --- a/src/_includes/layouts/use-case.njk +++ b/src/_includes/layouts/use-case.njk @@ -9,10 +9,33 @@ sitemapPriority: 0.7 problem hero sub-headline (the pain in one line) customerPain { heading, intro[], cards[ {icon,title,detail} ] } outcomeFirst { heading, intro, dimensions[ {label,title,detail} ] } + howItWorks { heading, intro, designPattern{}, diagram{}, pieces[], architecture, docsCta{} } whyItMatters { heading, intro, points[ {title,detail} ] } competition { heading, intro, traps[ {label,title,detail} ] } comparison { without[ {title,detail} ], with[ {title,detail} ] } + howItWorks answers "how does FlowFuse build this", which the pain, outcome + and comparison blocks deliberately do not. It is the bridge from the + marketing narrative into the product docs, so keep it high level here and + push every detail into a docs link. + + designPattern { kind, name, detail, docsUrl } + kind is the pattern family, e.g. "Hardware pattern" or + "Software pattern". name is the specific pattern chosen + for this use case. + diagram { src, alt, caption, width, height, placeholder } + End-to-end architecture drawing. src may be a placeholder + while the real diagram is commissioned; set + diagram.placeholder to true to render the placeholder + treatment and keep it visibly unfinished. width/height + default to 1200x630 and only exist to reserve the box, so + override them when the real asset is a different shape. + pieces [ {icon, title, detail, docsUrl} ] + The problem broken into the individual components that get + built. Order them the way you would build them. + architecture slug of a /use-cases/ architecture page this sits on + docsCta { label, url } + Legacy fall-back front-matter (simple skeleton, still supported): gap[], workflow[], outcomes[] @@ -23,11 +46,17 @@ sitemapPriority: 0.7 {% set nav = [] %} {% if customerPain %}{% set nav = nav.concat([{ id: "customer-pain", label: "Customer Pain" }]) %}{% endif %} {% if outcomeFirst %}{% set nav = nav.concat([{ id: "outcome-first", label: "Outcome First" }]) %}{% endif %} +{% if howItWorks %}{% set nav = nav.concat([{ id: "how-it-works", label: "How It Works" }]) %}{% endif %} {% if whyItMatters %}{% set nav = nav.concat([{ id: "why-it-matters", label: "Why It Matters" }]) %}{% endif %} {% if competition %}{% set nav = nav.concat([{ id: "competition", label: "Why Off-the-Shelf Fails" }]) %}{% endif %} {% if comparison %}{% set nav = nav.concat([{ id: "with-without", label: "With / Without FlowFuse" }]) %}{% endif %} {% if aiBuildLayer %}{% set nav = nav.concat([{ id: "ai-build-layer", label: "Build It With AI" }]) %}{% endif %} +{# --- section eyebrow numbers, derived from nav so they cannot drift --- + Pages omit blocks freely, so a hardcoded "03" desyncs from the nav as soon + as an earlier block is missing. Look the number up instead. #} +{% macro secNum(id) %}{%- for item in nav -%}{%- if item.id == id -%}{%- if loop.index < 10 -%}0{%- endif -%}{{ loop.index }}{%- endif -%}{%- endfor -%}{% endmacro %} +
-

01 · Customer pain

+

{{ secNum("customer-pain") }} · Customer pain

{{ customerPain.heading }}

{% for paragraph in customerPain.intro %} @@ -94,11 +123,11 @@ sitemapPriority: 0.7 {% if outcomeFirst %}
-

02 · Outcome first

+

{{ secNum("outcome-first") }} · Outcome first

{{ outcomeFirst.heading }}

{{ outcomeFirst.intro }}

@@ -114,13 +143,103 @@ sitemapPriority: 0.7
{% endif %} + {% if howItWorks %} + +
+
+

{{ secNum("how-it-works") }} · How it works

+

{{ howItWorks.heading or "How FlowFuse builds this" }}

+ {% if howItWorks.intro %} +

{{ howItWorks.intro }}

+ {% endif %} + + {% if howItWorks.designPattern %} +
+
+ {% include "components/icons/squares-2x2.svg" %} +
+
+ {{ howItWorks.designPattern.kind }} +

{{ howItWorks.designPattern.name }}

+

{{ howItWorks.designPattern.detail }}

+ {% if howItWorks.designPattern.docsUrl %} + + Read the pattern in the docs + {% include "components/icons/arrow-right.svg" %} + + {% endif %} +
+
+ {% endif %} + + {% if howItWorks.diagram %} +
+
+ {# width/height are here to reserve the box before the image + arrives; without them "h-auto" collapses the figure to + zero and the whole section below it jumps on load. #} + {{ howItWorks.diagram.alt }} +
+ {% if howItWorks.diagram.caption or howItWorks.diagram.placeholder %} +
{% if howItWorks.diagram.placeholder %}Placeholder diagram, pending art request. {% endif %}{{ howItWorks.diagram.caption }}
+ {% endif %} +
+ {% endif %} + + {% if howItWorks.pieces %} +

{{ howItWorks.piecesHeading or "The individual pieces" }}

+
+ {% for piece in howItWorks.pieces %} +
+
+
+ {% include "components/icons/" + piece.icon + ".svg" %} +
+ {% if loop.index < 10 %}0{% endif %}{{ loop.index }} +
+

{{ piece.title }}

+

{{ piece.detail }}

+ {% if piece.docsUrl %} + + Docs + {% include "components/icons/arrow-right.svg" %} + + {% endif %} +
+ {% endfor %} +
+ {% endif %} + + {% if howItWorks.docsCta or howItWorks.architecture %} +
+ {% if howItWorks.docsCta %} + {{ howItWorks.docsCta.label or "Read the docs" }} + {% endif %} + {% if howItWorks.architecture %} + + See the architecture this sits on + {% include "components/icons/arrow-right.svg" %} + + {% endif %} +
+ {% endif %} +
+
+ {% endif %} + {% if whyItMatters %}
-

03 · Why this is important

+

{{ secNum("why-it-matters") }} · Why this is important

{{ whyItMatters.heading }}

{{ whyItMatters.intro }}

@@ -140,11 +259,11 @@ sitemapPriority: 0.7 {% if competition %}
-

04 · Why off-the-shelf doesn't work

+

{{ secNum("competition") }} · Why off-the-shelf doesn't work

{{ competition.heading }}

{{ competition.intro }}

@@ -165,11 +284,11 @@ sitemapPriority: 0.7 {% if comparison %}
-

05 · With / without FlowFuse

+

{{ secNum("with-without") }} · With / without FlowFuse

Without FlowFuse

@@ -206,11 +325,11 @@ sitemapPriority: 0.7 {% if aiBuildLayer %}
-

06 · Build it with AI

+

{{ secNum("ai-build-layer") }} · Build it with AI

{{ aiBuildLayer.heading or "From described to deployed, with the FlowFuse Expert" }}

{{ aiBuildLayer.intro }}

diff --git a/src/use-cases/production-monitoring.njk b/src/use-cases/production-monitoring.njk index 5086a4a875..8dfbc56b0e 100644 --- a/src/use-cases/production-monitoring.njk +++ b/src/use-cases/production-monitoring.njk @@ -7,6 +7,44 @@ problem: "Your operation is running. You just can't see it clearly enough, until industries: ["automotive", "food-beverage", "life-sciences", "aviation-aerospace", "aerospace-components", "renewables", "semiconductors", "electronics-appliances"] values: ["production-performance"] +howItWorks: + heading: "How FlowFuse builds production monitoring." + intro: "Production monitoring is not one app you install. It is a handful of pieces you define once and then replicate. This is how the problem breaks down, and which FlowFuse pattern carries it across every line and site." + designPattern: + kind: "Hardware pattern" + name: "Pipeline plus environment variables" + detail: "The monitoring application is built once and distributed to every line by a DevOps pipeline. Everything site-specific, tag addresses, line names, shift boundaries, lives in environment variables instead of inside the flows, so the same snapshot runs everywhere without an edit." + docsUrl: "/docs/user/devops-pipelines/" + diagram: + placeholder: true + src: "https://placehold.co/1200x630/eef2ff/4338ca?text=Production+Monitoring+Architecture" + alt: "End-to-end architecture for production monitoring: PLCs and machines feeding edge instances, publishing to a broker and historian, with role-specific dashboards on top and a pipeline distributing the application across sites." + caption: "Machines and PLCs into edge instances, out over MQTT into your historian, role-specific dashboards on top, and one pipeline distributing the whole application across every line." + pieces: + - icon: "queue-list" + title: "Define the data model" + detail: "Name the equipment hierarchy and tag structure first: site, line, cell, signal. Every later piece depends on it, and this is exactly the part an off-the-shelf tool decides for you." + - icon: "chart" + title: "Derive the metrics" + detail: "Counts, cycle times, downtime reasons and OEE are calculated from the model rather than read off a machine. The logic sits in Node-RED flows your own team can read and change." + - icon: "device-agent" + title: "Collect at the edge" + detail: "The Device Agent runs an instance on existing edge hardware and speaks OPC-UA, Modbus, S7 or MQTT to whatever is already on the floor." + docsUrl: "/docs/device-agent/introduction/" + - icon: "arrows-right-left" + title: "Publish and store" + detail: "Contextualized data leaves the edge on a stable topic structure and lands in your historian or database. The schema and the storage stay yours." + - icon: "dashboard" + title: "Visualize per role" + detail: "A line view for the supervisor, trend detail for the maintenance engineer, a roll-up for the plant manager. FlowFuse Dashboard builds all three from the same data." + - icon: "rectangle-stack" + title: "Replicate across sites" + detail: "Snapshot the working application and let the pipeline push it to every other line, with each site's specifics supplied by environment variables." + docsUrl: "/docs/user/envvar/" + docsCta: + label: "Read the pipeline docs" + url: "/docs/user/devops-pipelines/" + aiBuildLayer: intro: "The FlowFuse Expert works on this use case with you: describe the monitoring you need and get a working starting flow, then query what it captures in plain language." steps: diff --git a/src/use-cases/shop-floor-communication.njk b/src/use-cases/shop-floor-communication.njk index 070eede175..a1a8645826 100644 --- a/src/use-cases/shop-floor-communication.njk +++ b/src/use-cases/shop-floor-communication.njk @@ -6,7 +6,44 @@ meta: problem: "The line stopped four minutes ago. The person who can fix it will find out when someone walks over." industries: ["automotive", "food-beverage", "aviation-aerospace", "electronics-appliances"] values: ["labor-operational-efficiency"] -architecture: "edge-connectivity" +howItWorks: + heading: "How FlowFuse builds connected andon." + intro: "Getting an event to the right person is a small number of pieces, not a product. The routing logic is identical at every site; only the people, channels and shift patterns differ, and that is what decides the pattern." + designPattern: + kind: "Hardware pattern" + name: "Pipeline plus external configuration" + detail: "The routing and escalation flows are built once and distributed by pipeline. Who responds, on which channel, during which shift is read at runtime from a central configuration source, so a rota change or a new contact never requires a redeploy." + docsUrl: "/docs/user/devops-pipelines/" + diagram: + placeholder: true + src: "https://placehold.co/1200x630/eef2ff/4338ca?text=Shop+Floor+Communication+Architecture" + alt: "End-to-end architecture for connected andon: machine signals and operator call buttons into edge instances, routed against a central directory of roles and shifts, delivered to displays, team channels and phones, with acknowledgment timing recorded." + caption: "Machine signals and call buttons into edge instances, routed against a central directory of roles and shifts, out to displays, team channels and phones, with every acknowledgment timed." + pieces: + - icon: "bell-alert" + title: "Capture the event" + detail: "Machine signals, alarm bits and operator call buttons all become the same kind of event, collected by an edge instance next to the equipment." + docsUrl: "/docs/device-agent/introduction/" + - icon: "queue-list" + title: "Model the event" + detail: "Each event carries type, area, severity and the role that should respond. Routing decisions are made against that shape, not against a machine address." + - icon: "users" + title: "Keep the directory outside the flow" + detail: "Roles, contacts, channels and the shift calendar live in configuration rather than inside the flows, so the floor can change who responds without touching the application." + docsUrl: "/docs/user/envvar/" + - icon: "share" + title: "Deliver where people look" + detail: "The same event fans out to andon displays, team channels and phones, each with the context the recipient needs to act on it." + - icon: "clock" + title: "Acknowledge and escalate" + detail: "An unacknowledged event climbs the chain on a timer. Nothing waits on someone happening to be free." + - icon: "circle-stack" + title: "Record the timing" + detail: "Event, notification and acknowledgment timestamps land in your database, which is what turns response time into a metric you can manage." + architecture: "edge-connectivity" + docsCta: + label: "Read the pipeline docs" + url: "/docs/user/devops-pipelines/" customerPain: heading: "Events travel at walking speed." From 35e2aa70e2cf6f7cd85a8a79e7b34680e69925df Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Tue, 4 Aug 2026 23:25:52 +0200 Subject: [PATCH 2/2] Use Cases: add Workforce Assignment Restores the Workforce Assignment page written in the earlier three-lens IA work and dropped when that work was cut back. Copy is recovered as written and still carries its template-copy marker for a Showcase pass. Adapted to the current layout: the architecture key moves inside a new howItWorks block covering the assignment decision from demand and skills through to publishing it back, and expertDock is dropped since nothing renders it. Diagram is a placehold.co stand-in. Links it from the homepage Operational Application System entry and the footer use case list. --- src/_includes/layouts/base.njk | 1 + src/index.njk | 1 + src/use-cases/workforce-assignment.njk | 137 +++++++++++++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 src/use-cases/workforce-assignment.njk diff --git a/src/_includes/layouts/base.njk b/src/_includes/layouts/base.njk index ceb8057f15..6671dd2bb3 100644 --- a/src/_includes/layouts/base.njk +++ b/src/_includes/layouts/base.njk @@ -414,6 +414,7 @@ eleventyComputed:
diff --git a/src/index.njk b/src/index.njk index b7f03ee6c6..4284cb645c 100644 --- a/src/index.njk +++ b/src/index.njk @@ -71,6 +71,7 @@ operationalSystem: - title: "OPERATIONAL WORKFLOWS" items: - name: "Workforce Assignment" + url: "/use-cases/workforce-assignment/" description: "Dynamic operator allocation using training, ergonomics, and demand data." - name: "Shop Floor Communication" url: "/use-cases/shop-floor-communication/" diff --git a/src/use-cases/workforce-assignment.njk b/src/use-cases/workforce-assignment.njk new file mode 100644 index 0000000000..78a0ca5e5a --- /dev/null +++ b/src/use-cases/workforce-assignment.njk @@ -0,0 +1,137 @@ +--- +title: "Workforce Assignment" +meta: + title: "Workforce Assignment | Use Cases | FlowFuse" + description: "Put the right person on the right task as conditions change: live assignment boards driven by real demand, skills and availability. Built on Node-RED, managed with FlowFuse." +problem: "The plan assigned people at 6 a.m. The floor changed by 6:40, and the plan did not." +industries: ["automotive", "food-beverage", "electronics-appliances"] +values: ["labor-operational-efficiency"] + +howItWorks: + heading: "How FlowFuse builds dynamic workforce assignment." + intro: "An assignment is a decision taken against constraints that change during the shift. This is how the problem breaks down and which FlowFuse pattern carries it." + designPattern: + kind: "Software pattern" + name: "Data-driven application" + detail: "The rules are data, not flows. Skills, training currency, ergonomic limits and demand come from the systems that already own them, so the same application serves a different plant by pointing at different sources." + docsUrl: "/docs/user/ff-tables/" + diagram: + placeholder: true + src: "https://placehold.co/1200x630/eef2ff/4338ca?text=Workforce+Assignment+Architecture" + alt: "End-to-end architecture for workforce assignment: demand pulled from MES and ERP, skills and training from HR systems, constraints applied, a supervisor-facing assignment view, and the result published back and recorded." + caption: "Demand from MES and ERP, skills and training from the systems that own them, constraints applied, and the supervisor left with a decision rather than a spreadsheet." + pieces: + - icon: "chart" + title: "Pull the demand" + detail: "What has to run this shift, in what order, on which lines, read from MES or ERP rather than retyped." + - icon: "users" + title: "Read skills and training currency" + detail: "Who is qualified for what, and whose certification is about to lapse, from the system that already tracks it." + - icon: "cog-6-tooth" + title: "Hold the constraints as data" + detail: "Ergonomic rotation limits, required coverage and site rules live in configuration, so changing a policy is not a development task." + docsUrl: "/docs/user/ff-tables/" + - icon: "dashboard" + title: "Give the supervisor a decision" + detail: "A proposed allocation on a screen on the floor, adjustable in the moment. The tool advises; the supervisor decides." + - icon: "arrows-right-left" + title: "Publish the assignment back" + detail: "The decision returns to the systems and screens that need it, so the plan and the floor stop diverging by 6:40." + - icon: "circle-stack" + title: "Record what actually happened" + detail: "Assignments and changes kept as history, which is what makes next quarter's coverage and training decisions evidence-based." + architecture: "it-ot-middleware" + docsCta: + label: "Read the tables docs" + url: "/docs/user/ff-tables/" + +customerPain: + heading: "Static plans meet a dynamic floor." + intro: + - "Shift plans are built on yesterday's assumptions: then a machine goes down, an order is expedited, two people call in sick, and reallocation happens by supervisor intuition and hallway conversations." + - "Skills and certifications live in spreadsheets nobody checks in the moment, so the reshuffle is slow, and sometimes puts the wrong person on a task that requires certification." + cards: + - icon: "users" + title: "Reallocation by walking around" + detail: "Supervisors spend the first hour of every disruption finding out who is where and moving people by hand." + - icon: "academic-cap" + title: "Skills matrices nobody can see" + detail: "Certification and training data sits in HR files, invisible at the moment of assignment." + - icon: "clock" + title: "Idle time and bottlenecks coexist" + detail: "One station starves while another queues, because nobody sees both at once." + - icon: "clip-list" + title: "No record of who did what" + detail: "Assignment history that audits and improvement work need does not exist." + #placeholder: template copy for review, refine per Showcase + +outcomeFirst: + heading: "Assignment that follows the floor." + intro: "FlowFuse joins live demand signals, machine states, order priorities, headcounts, with skills and availability data, and drives assignment boards that update as conditions change." + dimensions: + - label: "Operational" + title: "Live view of people, tasks and gaps" + detail: "Who is where, what needs doing, and which stations are at risk, on one board that reflects now." + - label: "Organizational" + title: "Qualified people on qualified tasks" + detail: "Assignments checked against skills and certifications at the moment they are made." + - label: "Financial" + title: "Less idle time, fewer bottlenecks" + detail: "Rebalancing in minutes recovers the labor hours static plans leave on the table." + +whyItMatters: + heading: "Labor is the most flexible asset, managed the least flexibly." + intro: "Machines get condition monitoring; people get a morning plan and good luck." + points: + - title: "Every disruption taxes labor first" + detail: "Downtime, rush orders and absences all resolve into people standing in the wrong place." + - title: "Certification errors are compliance events" + detail: "In regulated production, an unqualified assignment is not inefficiency, it is a finding." + - title: "Assignment data feeds planning" + detail: "Recorded assignment history shows where skills are thin and where training pays back fastest." + +competition: + heading: "Why the usual approaches stall." + intro: "Workforce tools plan the shift; almost none of them react to it." + traps: + - label: "Workforce management suites" + title: "Great at rosters, blind to the floor" + detail: "Scheduling tools know who is on shift, not what the line needs right now." + - label: "MES task lists" + title: "Tasks without people context" + detail: "Work queues exist, but skills, availability and certifications live elsewhere." + - label: "Whiteboards" + title: "The 6 a.m. snapshot" + detail: "Accurate for the first forty minutes of the shift." + +comparison: + without: + - title: "Reallocation by intuition" + detail: "Supervisors move people based on what they happen to see." + - title: "Certification checked after the fact" + detail: "Qualification issues surface in audits, not at assignment." + - title: "No assignment record" + detail: "Improvement work has no data to stand on." + with: + - title: "Boards driven by live demand" + detail: "Machine states and order priorities reshape assignments as they change." + - title: "Qualification enforced in the flow" + detail: "Only certified people are suggested for certified tasks." + - title: "Every assignment recorded" + detail: "History for audits, staffing decisions and training plans." + +aiBuildLayer: + intro: "The FlowFuse Expert works on this use case with you, from the demand joins to the board itself." + steps: + - title: "Describe it, get a starting flow" + detail: "Tell the Expert your demand signals and people data sources; it assembles a working starting flow. Currently in open beta on FlowFuse Cloud." + - title: "Refine with in-editor assistance" + detail: "Function Builder and completions handle the matching logic and the Dashboard assignment board." + - title: "Own and adapt what you built" + detail: "The flow explainer keeps assignment rules readable, so team leads can evolve them as the operation changes." + note: "AI capabilities noted as beta are in open beta on FlowFuse Cloud at time of writing. Placeholder template copy for internal review." + +closingCta: + heading: "Put flexibility where the flexibility is" + description: "Talk to an expert about live workforce assignment, or connect your first demand signal today." +---