diff --git a/src/_includes/layouts/base.njk b/src/_includes/layouts/base.njk index ceb8057f15..c969aad312 100644 --- a/src/_includes/layouts/base.njk +++ b/src/_includes/layouts/base.njk @@ -414,6 +414,7 @@ eleventyComputed: 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/index.njk b/src/index.njk index b7f03ee6c6..a2a7a1b3fa 100644 --- a/src/index.njk +++ b/src/index.njk @@ -80,6 +80,7 @@ operationalSystem: - name: "Quality Validation" description: "Inline inspection and QA checks outside the core system." - name: "Track & Trace" + url: "/use-cases/track-and-trace/" description: "Part, component, and batch traceability across the plant." - title: "OPERATIONAL INFRASTRUCTURE" items: 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." diff --git a/src/use-cases/track-and-trace.njk b/src/use-cases/track-and-trace.njk new file mode 100644 index 0000000000..fa110c3feb --- /dev/null +++ b/src/use-cases/track-and-trace.njk @@ -0,0 +1,138 @@ +--- +title: "Track & Trace" +meta: + title: "Track & Trace | Use Cases | FlowFuse" + description: "Genealogy and traceability from raw material to shipped unit: capture every step with context, answer recalls in minutes. Built on Node-RED, managed with FlowFuse." +problem: "A recall question lands, and the answer lives in three systems, two spreadsheets and a binder." +industries: ["life-sciences", "food-beverage", "aviation-aerospace", "aerospace-components"] +values: ["quality-compliance"] + +howItWorks: + heading: "How FlowFuse builds genealogy and traceability." + intro: "Traceability is one record per unit, written as production happens rather than reconstructed afterwards. This is how the chain breaks down and which FlowFuse pattern carries it." + designPattern: + kind: "Software pattern" + name: "Data-driven application" + detail: "The genealogy record is the application. Which capture points exist, and what each contributes to the chain, is configuration rather than wiring, so a new process step is a data change." + docsUrl: "/docs/user/ff-tables/" + diagram: + placeholder: true + src: "https://placehold.co/1200x630/eef2ff/4338ca?text=Track+and+Trace+Architecture" + alt: "End-to-end architecture for track and trace: identity assigned at the first step, capture points along the line writing into one genealogy record with process context, queryable forwards and backwards for recalls and audits." + caption: "Identity assigned once, every capture point writing into a single genealogy record with process context attached, queryable in both directions." + pieces: + - icon: "pin" + title: "Assign identity once" + detail: "A serial, lot or batch identity created at the first step and carried forward. Everything else hangs off it." + - icon: "device-agent" + title: "Capture each step at the edge" + detail: "Scanners, machines and station PLCs report the move as it happens, so there is no gap to reconstruct later." + docsUrl: "/docs/device-agent/introduction/" + - icon: "chart" + title: "Attach process context" + detail: "Not only where a unit went but the conditions it was produced under, captured at the same moment as the move." + - icon: "circle-stack" + title: "Write one genealogy record" + detail: "Material moves from ERP, process steps from MES and machine conditions from the floor land in one chain instead of three systems." + docsUrl: "/docs/user/ff-tables/" + - icon: "eye" + title: "Query forwards and backwards" + detail: "From any lot, unit or shipment, in either direction, with the evidence attached to the answer." + - icon: "document-check" + title: "Answer audits as a query" + detail: "Compliance requests become a lookup against the chain rather than a cross-system research project." + architecture: "data-integration" + docsCta: + label: "Read the tables docs" + url: "/docs/user/ff-tables/" + +customerPain: + heading: "Traceability by reconstruction." + intro: + - "Which lots went into which batch, on which machine, under which conditions, shipped to whom: the data exists, but scattered across ERP, MES, machines and paper." + - "When an audit or recall asks the question, teams spend days reconstructing what a connected system could answer in minutes, and the exposure window stays wide open the whole time." + cards: + - icon: "queue-list" + title: "Genealogy gaps between systems" + detail: "Material moves are recorded in ERP, process steps in MES, machine conditions nowhere; the chain has holes." + - icon: "clip-list" + title: "Paper travelers, manual scans" + detail: "Handwritten lot numbers and missed scan points break the chain exactly where it matters." + - icon: "shield-exclamation" + title: "Recalls scoped by worst case" + detail: "When you cannot prove which units are affected, you recall everything that might be." + - icon: "book-open" + title: "Audit answers take days" + detail: "Every compliance request becomes a cross-system research project." + #placeholder: template copy for review, refine per Showcase + +outcomeFirst: + heading: "An unbroken chain, captured as it happens." + intro: "FlowFuse wires the capture points together: scanners, machines, MES and ERP feed one genealogy record per unit or batch, with process context attached at every step." + dimensions: + - label: "Compliance" + title: "Recall scope in minutes, not days" + detail: "Forward and backward trace from any lot, unit or shipment, with evidence attached." + - label: "Quality" + title: "Process context on every step" + detail: "Not just where a unit went, but the conditions it was produced under." + - label: "Financial" + title: "Smaller recalls, faster audits" + detail: "Precise scoping replaces worst-case recalls; audit requests become queries." + +whyItMatters: + heading: "Traceability is insurance you build in advance." + intro: "The value shows up on the worst day: a recall, an audit finding, a customer claim." + points: + - title: "Recall cost scales with uncertainty" + detail: "Every unit you cannot rule out is a unit you pay to recall. Precision is money." + - title: "Regulators expect data, not binders" + detail: "Digital genealogy with process context is becoming the audit baseline in regulated industries." + - title: "Trace data compounds into insight" + detail: "The same chain that answers recalls also reveals which conditions produce the best product." + +competition: + heading: "Why the usual approaches stall." + intro: "Traceability projects fail on the connections, not the concept." + traps: + - label: "ERP-only trace" + title: "Material moves without process truth" + detail: "ERP knows what was issued, not what actually happened at the machine." + - label: "Monolithic MES" + title: "Full-suite rollouts measured in years" + detail: "Enterprise MES traceability arrives with a multi-year implementation and per-site licensing." + - label: "Spreadsheet genealogy" + title: "Manual chains break silently" + detail: "One missed entry and the chain is fiction; nobody notices until it is needed." + +comparison: + without: + - title: "Chain reconstructed on demand" + detail: "Days of cross-system work per recall or audit question." + - title: "Worst-case recall scoping" + detail: "Recall everything that might be affected." + - title: "Capture depends on discipline" + detail: "Paper and manual scans break the chain silently." + with: + - title: "Chain captured continuously" + detail: "Scanners, machines and business systems feed one genealogy record automatically." + - title: "Precise scope with evidence" + detail: "Trace any direction from any point, conditions included." + - title: "Capture enforced by flows" + detail: "Missing steps block or alert in real time instead of surfacing at audit." + +aiBuildLayer: + intro: "The FlowFuse Expert works on this use case with you, from capture flows to answering trace questions." + steps: + - title: "Describe it, get a starting flow" + detail: "Tell the Expert your capture points and systems; it assembles a genealogy starting flow. Currently in open beta on FlowFuse Cloud." + - title: "Refine with in-editor assistance" + detail: "Function Builder and completions help with lot-number parsing, joins and record writes to your database or Tables." + - title: "Ask trace questions in plain language" + detail: "Expose the genealogy store through MCP tools and query it with Expert's Insights mode (beta): 'which shipments contain lot 4711?'" + 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: "Be ready for the worst day" + description: "Talk to an expert about end-to-end traceability, or wire your first capture point today." +---