diff --git a/.eleventy.js b/.eleventy.js index 348c8ca69e..43c6881c3c 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -122,8 +122,6 @@ module.exports = function(eleventyConfig) { eleventyConfig.addLayoutAlias('default', 'layouts/base.njk'); eleventyConfig.addLayoutAlias('page', 'layouts/page.njk'); eleventyConfig.addLayoutAlias('nohero', 'layouts/nohero.njk'); - eleventyConfig.addLayoutAlias('solution', 'layouts/solution.njk'); - eleventyConfig.addLayoutAlias('use-case', 'layouts/use-case.njk'); eleventyConfig.addLayoutAlias('catalog', 'layouts/catalog.njk'); eleventyConfig.addLayoutAlias('redirect', 'layouts/redirect.njk'); diff --git a/nuxt/components/NavIcon.vue b/nuxt/components/NavIcon.vue index beb9d2389b..fe775da98a 100644 --- a/nuxt/components/NavIcon.vue +++ b/nuxt/components/NavIcon.vue @@ -5,9 +5,12 @@ // carries the sizing class, leaving the file's own nested inside. This // reproduces that exactly, so a given icon key renders identically whichever // renderer served the page. -const props = withDefaults(defineProps<{ name?: string, solid?: boolean }>(), { +const props = withDefaults(defineProps<{ name?: string, solid?: boolean, size?: 'sm' | 'lg' }>(), { name: '', solid: false, + // `navoption` (nav and footer) wraps icons at ff-icon-sm; `ffIconLg`, which page + // content used, is the same wrapper at ff-icon-lg. One prop covers both shortcodes. + size: 'sm', }) const markup = computed(() => { @@ -23,8 +26,8 @@ const markup = computed(() => {
+
+

06 · Build it with AI

+

{{ block.heading || 'From described to deployed, with the FlowFuse Expert' }}

+

{{ block.intro }}

+
+
+
+ + Step {{ ordinal(i) }} +
+

{{ step.title }}

+

{{ step.detail }}

+
+
+
+ Get started with the Expert +
+

{{ block.note }}

+
+
+ diff --git a/nuxt/components/use-case/Card.vue b/nuxt/components/use-case/Card.vue new file mode 100644 index 0000000000..15dfe55f6a --- /dev/null +++ b/nuxt/components/use-case/Card.vue @@ -0,0 +1,21 @@ + + + diff --git a/nuxt/components/use-case/ClosingCta.vue b/nuxt/components/use-case/ClosingCta.vue new file mode 100644 index 0000000000..32f4d479ea --- /dev/null +++ b/nuxt/components/use-case/ClosingCta.vue @@ -0,0 +1,29 @@ + + + diff --git a/nuxt/components/use-case/Comparison.vue b/nuxt/components/use-case/Comparison.vue new file mode 100644 index 0000000000..7fb3822190 --- /dev/null +++ b/nuxt/components/use-case/Comparison.vue @@ -0,0 +1,43 @@ + + + diff --git a/nuxt/components/use-case/Competition.vue b/nuxt/components/use-case/Competition.vue new file mode 100644 index 0000000000..9c47d1eaef --- /dev/null +++ b/nuxt/components/use-case/Competition.vue @@ -0,0 +1,30 @@ + + + diff --git a/nuxt/components/use-case/Hero.vue b/nuxt/components/use-case/Hero.vue new file mode 100644 index 0000000000..e8fb3c78d4 --- /dev/null +++ b/nuxt/components/use-case/Hero.vue @@ -0,0 +1,17 @@ + + + diff --git a/nuxt/components/use-case/IndustryChips.vue b/nuxt/components/use-case/IndustryChips.vue new file mode 100644 index 0000000000..ed883bf423 --- /dev/null +++ b/nuxt/components/use-case/IndustryChips.vue @@ -0,0 +1,30 @@ + + + diff --git a/nuxt/components/use-case/Links.vue b/nuxt/components/use-case/Links.vue new file mode 100644 index 0000000000..92662b9992 --- /dev/null +++ b/nuxt/components/use-case/Links.vue @@ -0,0 +1,27 @@ + + + diff --git a/nuxt/components/use-case/Outcomes.vue b/nuxt/components/use-case/Outcomes.vue new file mode 100644 index 0000000000..5fcaee08b7 --- /dev/null +++ b/nuxt/components/use-case/Outcomes.vue @@ -0,0 +1,27 @@ + + + diff --git a/nuxt/components/use-case/Pain.vue b/nuxt/components/use-case/Pain.vue new file mode 100644 index 0000000000..8ee0230f17 --- /dev/null +++ b/nuxt/components/use-case/Pain.vue @@ -0,0 +1,33 @@ + + + diff --git a/nuxt/components/use-case/SectionNav.vue b/nuxt/components/use-case/SectionNav.vue new file mode 100644 index 0000000000..1c640dd2ab --- /dev/null +++ b/nuxt/components/use-case/SectionNav.vue @@ -0,0 +1,24 @@ + + + diff --git a/nuxt/components/use-case/SolutionHero.vue b/nuxt/components/use-case/SolutionHero.vue new file mode 100644 index 0000000000..ae069a8b85 --- /dev/null +++ b/nuxt/components/use-case/SolutionHero.vue @@ -0,0 +1,31 @@ + + + diff --git a/nuxt/components/use-case/WhyItMatters.vue b/nuxt/components/use-case/WhyItMatters.vue new file mode 100644 index 0000000000..501dc3e801 --- /dev/null +++ b/nuxt/components/use-case/WhyItMatters.vue @@ -0,0 +1,33 @@ + + + diff --git a/nuxt/content.config.ts b/nuxt/content.config.ts index b433e940da..a7ad8765f6 100644 --- a/nuxt/content.config.ts +++ b/nuxt/content.config.ts @@ -185,9 +185,11 @@ export default defineContentConfig({ hubspot: z.object({ formId: z.string(), }), - // Raw frontmatter still writes this as "meta:" - the content:file:beforeParse - // hook in nuxt.config.ts rewrites it to "structuredData:" before parsing, same - // shim the blog collection uses, so existing story files don't need editing. + // Story frontmatter writes "structuredData:" directly, unlike the blog and + // webinars, whose files still say "meta:" and go through the rewrite hook in + // nuxt.config.ts. The name matters either way: `meta` is reserved by + // @nuxt/content (it holds the excerpt) and a collection that + // declares its own `meta` field silently loses everything under it. structuredData: z.object({ // Falls back to "Frequently Asked Questions" (the blog's fixed heading) // when unset - only set this when a story wants its own FAQ heading. @@ -427,6 +429,79 @@ export default defineContentConfig({ form: z.object({ title: z.string() }).optional(), }) }), + // The two operational use-cases (the ones carrying `values:`) were pure 11ty + // frontmatter with no template body - layouts/use-case.njk rendered a fixed set of + // optional blocks from it. That is a data collection, rendered by + // pages/use-cases/[slug].vue through the components in components/use-case/. + // The six architecture pages had real markup bodies and stay hand-written Vue + // pages; they appear on the listing via useCaseArchitectures in that page. + useCases: defineCollection({ + type: 'data', + source: 'use-cases/*.yml', + schema: z.object({ + slug: z.string(), + title: z.string(), + problem: z.string(), + // SEO only. Named seoMeta rather than meta because `meta` is reserved by + // @nuxt/content and a declared `meta` field is silently replaced. + seoMeta: z.object({ + title: z.string().optional(), + description: z.string().optional(), + }).optional(), + // Industry lens slugs, rendered as the context band near the page foot. + industries: z.array(z.string()).optional(), + // Value-pillar slugs. Presence of this is what puts a page under + // "Operational use cases" rather than "By architecture" on the listing. + values: z.array(z.string()).optional(), + architecture: z.string().optional(), + customerPain: z.object({ + heading: z.string(), + intro: z.array(z.string()).optional(), + cards: z.array(z.object({ + icon: z.string().optional(), + title: z.string(), + detail: z.string(), + })).optional(), + }).optional(), + outcomeFirst: z.object({ + heading: z.string(), + intro: z.string().optional(), + dimensions: z.array(z.object({ + label: z.string(), + title: z.string(), + detail: z.string(), + })).optional(), + }).optional(), + whyItMatters: z.object({ + heading: z.string(), + intro: z.string().optional(), + points: z.array(z.object({ title: z.string(), detail: z.string() })).optional(), + }).optional(), + competition: z.object({ + heading: z.string(), + intro: z.string().optional(), + traps: z.array(z.object({ + label: z.string(), + title: z.string(), + detail: z.string(), + })).optional(), + }).optional(), + comparison: z.object({ + without: z.array(z.object({ title: z.string(), detail: z.string() })).optional(), + with: z.array(z.object({ title: z.string(), detail: z.string() })).optional(), + }).optional(), + aiBuildLayer: z.object({ + heading: z.string().optional(), + intro: z.string().optional(), + steps: z.array(z.object({ title: z.string(), detail: z.string() })).optional(), + note: z.string().optional(), + }).optional(), + closingCta: z.object({ + heading: z.string().optional(), + description: z.string().optional(), + }).optional(), + }) + }), ebooks: defineCollection({ type: 'page', source: 'ebooks/*.md', diff --git a/nuxt/content/use-cases/data-integration.yml b/nuxt/content/use-cases/data-integration.yml new file mode 100644 index 0000000000..0f1f6d43fd --- /dev/null +++ b/nuxt/content/use-cases/data-integration.yml @@ -0,0 +1,7 @@ +# Listing metadata only. The page itself is pages/use-cases/data-integration.vue - this one +# had a real markup body in src/use-cases/data-integration.njk, so it did not lift into data the way the +# two operational use-cases did. Kept here so /use-cases/ still builds its cards from +# one place rather than a hand-maintained list. +slug: data-integration +title: "FlowFuse for Data Integration" +problem: "Collect, transform, and route data from any industrial source to any destination, without writing integration code from scratch." diff --git a/nuxt/content/use-cases/edge-connectivity.yml b/nuxt/content/use-cases/edge-connectivity.yml new file mode 100644 index 0000000000..241b3e644e --- /dev/null +++ b/nuxt/content/use-cases/edge-connectivity.yml @@ -0,0 +1,7 @@ +# Listing metadata only. The page itself is pages/use-cases/edge-connectivity.vue - this one +# had a real markup body in src/use-cases/edge-connectivity.njk, so it did not lift into data the way the +# two operational use-cases did. Kept here so /use-cases/ still builds its cards from +# one place rather than a hand-maintained list. +slug: edge-connectivity +title: "FlowFuse for Edge Connectivity" +problem: "Deploy and manage Node-RED instances on edge hardware at scale, from a single pane of glass, without touching each device." diff --git a/nuxt/content/use-cases/it-ot-middleware.yml b/nuxt/content/use-cases/it-ot-middleware.yml new file mode 100644 index 0000000000..0bf10cf297 --- /dev/null +++ b/nuxt/content/use-cases/it-ot-middleware.yml @@ -0,0 +1,7 @@ +# Listing metadata only. The page itself is pages/use-cases/it-ot-middleware.vue - this one +# had a real markup body in src/use-cases/it-ot-middleware.njk, so it did not lift into data the way the +# two operational use-cases did. Kept here so /use-cases/ still builds its cards from +# one place rather than a hand-maintained list. +slug: it-ot-middleware +title: "FlowFuse for IT/OT Integration" +problem: "Bridge OT protocols and IT systems with low-code flows. Connect PLCs, SCADA, and historians to ERP, databases, and cloud services." diff --git a/nuxt/content/use-cases/mes.yml b/nuxt/content/use-cases/mes.yml new file mode 100644 index 0000000000..4b0064b2ea --- /dev/null +++ b/nuxt/content/use-cases/mes.yml @@ -0,0 +1,7 @@ +# Listing metadata only. The page itself is pages/use-cases/mes.vue - this one +# had a real markup body in src/use-cases/mes.njk, so it did not lift into data the way the +# two operational use-cases did. Kept here so /use-cases/ still builds its cards from +# one place rather than a hand-maintained list. +slug: mes +title: "FlowFuse for MES" +problem: "Build exactly the MES your operation needs, compose modular execution, tracking, and reporting flows without a monolithic vendor platform." diff --git a/src/use-cases/production-monitoring.njk b/nuxt/content/use-cases/production-monitoring.yml similarity index 95% rename from src/use-cases/production-monitoring.njk rename to nuxt/content/use-cases/production-monitoring.yml index 5086a4a875..2ae81d33da 100644 --- a/src/use-cases/production-monitoring.njk +++ b/nuxt/content/use-cases/production-monitoring.yml @@ -1,6 +1,9 @@ ---- +# Lifted verbatim from src/use-cases/production-monitoring.njk (11ty), which had no template body: the whole +# page was frontmatter read by layouts/use-case.njk. Rendered now by +# pages/use-cases/[slug].vue through the components in components/use-case/. +slug: production-monitoring title: "Production Monitoring" -meta: +seoMeta: title: "Production Monitoring | Use Cases | FlowFuse" description: "Real-time visibility into what your production lines are actually doing. Build the monitoring app your operation needs with FlowFuse and Node-RED: connect any protocol, deploy at the edge or in the cloud, and roll out across sites." problem: "Your operation is running. You just can't see it clearly enough, until something breaks." @@ -25,16 +28,16 @@ customerPain: - "By then, the window to intervene is gone. Decisions get made on lag, instinct, and tribal knowledge instead of data." - "The pain isn't unique to any one industry. It surfaces wherever machines produce output and humans are responsible for the result." cards: - - icon: "clock" + - icon: "i-heroicons-clock" title: "Reactive firefighting" detail: "Problems are discovered after the fact, via alarms, operator reports, or finished-goods inspection. The response is always late." - - icon: "clip-list" + - icon: "i-heroicons-clipboard-document-list" title: "Manual data collection" detail: "Operators log counts, cycle times, and downtime events by hand. Numbers are inconsistent, delayed, and disconnected from the actual machine record." - - icon: "link-slash" + - icon: "i-heroicons-link-slash" title: "Data that doesn't talk" detail: "PLCs, SCADA, MES, and ERP each hold a piece of the picture. Nobody has connected them. Each system speaks a different protocol." - - icon: "chart" + - icon: "i-heroicons-chart-bar-square" title: "Reporting built on stale data" detail: "Shift summaries and OEE reports tell you what happened yesterday. Nobody is watching what is happening now." @@ -116,4 +119,3 @@ comparison: detail: "Deploy the Device Agent on existing edge hardware. Run instances in FlowFuse Cloud. Mix and match based on what your network allows." - title: "Snapshot, replicate, and roll out at scale" detail: "Once your monitoring app works on one line, FlowFuse lets you snapshot it and push it across every site, with environment-specific variables, centrally managed. Built on open Node-RED, the foundation stays yours." ---- diff --git a/nuxt/content/use-cases/scada.yml b/nuxt/content/use-cases/scada.yml new file mode 100644 index 0000000000..621fb40ae7 --- /dev/null +++ b/nuxt/content/use-cases/scada.yml @@ -0,0 +1,7 @@ +# Listing metadata only. The page itself is pages/use-cases/scada.vue - this one +# had a real markup body in src/use-cases/scada.njk, so it did not lift into data the way the +# two operational use-cases did. Kept here so /use-cases/ still builds its cards from +# one place rather than a hand-maintained list. +slug: scada +title: "FlowFuse for SCADA" +problem: "Modernize SCADA with low-code flows that connect legacy hardware, stream real-time data, and drive dashboards and alerts from a single platform." diff --git a/src/use-cases/shop-floor-communication.njk b/nuxt/content/use-cases/shop-floor-communication.yml similarity index 92% rename from src/use-cases/shop-floor-communication.njk rename to nuxt/content/use-cases/shop-floor-communication.yml index 070eede175..fe2c5308e8 100644 --- a/src/use-cases/shop-floor-communication.njk +++ b/nuxt/content/use-cases/shop-floor-communication.yml @@ -1,6 +1,9 @@ ---- +# Lifted verbatim from src/use-cases/shop-floor-communication.njk (11ty), which had no template body: the whole +# page was frontmatter read by layouts/use-case.njk. Rendered now by +# pages/use-cases/[slug].vue through the components in components/use-case/. +slug: shop-floor-communication title: "Shop Floor Communication" -meta: +seoMeta: title: "Shop Floor Communication | Use Cases | FlowFuse" description: "Andon, alerts and escalations that reach the right people in seconds: from machine events to team channels, displays and phones. Built on Node-RED, managed with FlowFuse." problem: "The line stopped four minutes ago. The person who can fix it will find out when someone walks over." @@ -14,16 +17,16 @@ customerPain: - "Machines know the moment something needs attention. Getting that moment to a human still relies on stack lights someone must see, radios someone must answer, and walks across the floor." - "Escalation is informal: if the first person is busy, the event waits. Response times are unmeasured because nobody records when the call for help actually started." cards: - - icon: "bell-alert" + - icon: "i-heroicons-bell-alert" title: "Alarms without an audience" detail: "Stack lights and local alarms help only whoever happens to be nearby." - - icon: "chat-bubble-left-right-sm" + - icon: "i-heroicons-chat-bubble-left-right" title: "Events never reach team channels" detail: "The tools people actually watch, phones, Teams, Slack, displays, are disconnected from the machines." - - icon: "arrow-path" + - icon: "i-heroicons-arrow-path" title: "No escalation path" detail: "If the first responder is occupied, nothing routes the event to the next person." - - icon: "clock" + - icon: "i-heroicons-clock" title: "Response time is invisible" detail: "Without timestamps from event to acknowledgment, response cannot be measured or improved." @@ -96,4 +99,3 @@ aiBuildLayer: closingCta: heading: "Close the gap between event and action" description: "Talk to an expert about connected andon and escalation, or route your first event today." ---- diff --git a/nuxt/content/use-cases/uns.yml b/nuxt/content/use-cases/uns.yml new file mode 100644 index 0000000000..11e7ee293c --- /dev/null +++ b/nuxt/content/use-cases/uns.yml @@ -0,0 +1,7 @@ +# Listing metadata only. The page itself is pages/use-cases/uns.vue - this one +# had a real markup body in src/use-cases/uns.njk, so it did not lift into data the way the +# two operational use-cases did. Kept here so /use-cases/ still builds its cards from +# one place rather than a hand-maintained list. +slug: uns +title: "FlowFuse for UNS" +problem: "Adopt a Unified Namespace without ripping out existing infrastructure. FlowFuse connects producers and consumers through MQTT with low-code flows." diff --git a/nuxt/nuxt.config.ts b/nuxt/nuxt.config.ts index 88499a6c34..5b7dd6e6e6 100644 --- a/nuxt/nuxt.config.ts +++ b/nuxt/nuxt.config.ts @@ -74,6 +74,17 @@ function readEntries (dir: string): Array> { .map(file => parseYaml(readFileSync(join(dir, file), 'utf8'))) } +// The two operational use-cases render through pages/use-cases/[slug].vue, so their +// routes are not discoverable from the page tree. They are the entries carrying `values:`; +// the rest of the collection is listing metadata for pages that have their own .vue file. +function collectUseCaseRoutes (dir: string): string[] { + return readdirSync(dir) + .filter(file => file.endsWith('.yml')) + .map(file => parseYaml(readFileSync(join(dir, file), 'utf8'))) + .filter(entry => Array.isArray(entry.values) && entry.values.length) + .map(entry => `/use-cases/${entry.slug}/`) +} + // The product tier pages (/product/[tier]/) are a `data` collection (see content.config.ts), // so their routes aren't discoverable from @nuxt/content page paths either. Derive them from // each file's `tierId` field rather than the filename, since that's the field the page route @@ -195,9 +206,9 @@ export default defineNuxtConfig({ }, // Only covers content already served by Nuxt. The handbook is deliberately excluded - // (internal company content, not product documentation) - see README.md. Everything - // still on the legacy Eleventy site (customer-stories, use-cases, platform, etc.) isn't - // visible to @nuxt/content, so it's absent here too until those pages are migrated. + // (internal company content, not product documentation) - see README.md. Anything left + // on the legacy Eleventy site is not visible to @nuxt/content, so it is absent here too + // until it migrates - the named examples are gone now, so the list is not kept here. llms: { domain: site.baseURL, title: 'FlowFuse', @@ -299,9 +310,6 @@ export default defineNuxtConfig({ // pages left sitemap-legacy.xml when their .njk files were deleted, so without // this they are in neither sitemap. ...collectSlugRoutes(join(__dirname, 'content/vs'), '/vs').map(loc => ({ loc })), - ], - urls: [ - ...blogAuthorRoutes.map(loc => ({ loc, priority: 0.6 })), // /landing// is one [slug].vue over a `data` collection, so the module's // static-route discovery cannot see it, and content-urls.get.ts cannot either // (it keys on `path`, which a data collection has no equivalent of). Without @@ -310,6 +318,13 @@ export default defineNuxtConfig({ ...readEntries(join(__dirname, 'content/landing')) .filter(entry => !entry.skipIndex) .map(entry => ({ loc: `/landing/${entry.slug}/` })), + // The two operational use-cases render through pages/use-cases/[slug].vue over a + // `data` collection, so the module's static-route discovery cannot see them, and + // content-urls.get.ts cannot either (it keys on `path`, which a data collection + // has no equivalent of). Without this they are in neither sitemap, having left + // sitemap-legacy.xml when their .njk files were deleted. The six architecture + // pages have their own .vue files and are discovered normally. + ...collectUseCaseRoutes(join(__dirname, 'content/use-cases')).map(loc => ({ loc })), ], exclude: ['/_studio/**', '/api/**'], }, @@ -477,6 +492,13 @@ export default defineNuxtConfig({ '/landing/tulip/', '/landing/plc/', '/landing/factory-efficiency/', + // The six architecture pages are .vue files with no listing that links to them all, so the crawler never reaches them. + '/use-cases/data-integration/', + '/use-cases/edge-connectivity/', + '/use-cases/it-ot-middleware/', + '/use-cases/mes/', + '/use-cases/scada/', + '/use-cases/uns/', // /ai is only linked from 11ty-generated HTML (nav, homepage), which the // Nuxt prerender crawler never parses, so it has to be listed explicitly // or the route is missing from nuxt/dist and every link to it breaks. @@ -491,6 +513,12 @@ export default defineNuxtConfig({ '/about/', ...collectSlugRoutes(join(__dirname, 'content/landing'), '/landing'), + + // /use-cases/ plus the two entries served by pages/use-cases/[slug].vue. + // The six architecture pages are their own .vue files, so Nuxt finds + // those itself; only the dynamic route needs enumerating. + '/use-cases/', + ...collectUseCaseRoutes(join(__dirname, 'content/use-cases')), // Without this, @nuxtjs/sitemap only bakes /sitemap.xml statically when // isNuxtGenerate() is true, which checks for nitro.static/preset "static" - // the netlify preset here is hybrid (prerendered pages + a fallback diff --git a/nuxt/pages/use-cases/[slug].vue b/nuxt/pages/use-cases/[slug].vue new file mode 100644 index 0000000000..bff714a98b --- /dev/null +++ b/nuxt/pages/use-cases/[slug].vue @@ -0,0 +1,76 @@ + + + diff --git a/nuxt/pages/use-cases/data-integration.vue b/nuxt/pages/use-cases/data-integration.vue new file mode 100644 index 0000000000..ae6ec1a011 --- /dev/null +++ b/nuxt/pages/use-cases/data-integration.vue @@ -0,0 +1,145 @@ + + + diff --git a/nuxt/pages/use-cases/edge-connectivity.vue b/nuxt/pages/use-cases/edge-connectivity.vue new file mode 100644 index 0000000000..71fa8ca74f --- /dev/null +++ b/nuxt/pages/use-cases/edge-connectivity.vue @@ -0,0 +1,115 @@ + + + diff --git a/nuxt/pages/use-cases/index.vue b/nuxt/pages/use-cases/index.vue new file mode 100644 index 0000000000..0a7ca0937a --- /dev/null +++ b/nuxt/pages/use-cases/index.vue @@ -0,0 +1,97 @@ + + + diff --git a/nuxt/pages/use-cases/it-ot-middleware.vue b/nuxt/pages/use-cases/it-ot-middleware.vue new file mode 100644 index 0000000000..2a4556875c --- /dev/null +++ b/nuxt/pages/use-cases/it-ot-middleware.vue @@ -0,0 +1,241 @@ + + + diff --git a/nuxt/pages/use-cases/mes.vue b/nuxt/pages/use-cases/mes.vue new file mode 100644 index 0000000000..af7d01424e --- /dev/null +++ b/nuxt/pages/use-cases/mes.vue @@ -0,0 +1,149 @@ + + + diff --git a/nuxt/pages/use-cases/scada.vue b/nuxt/pages/use-cases/scada.vue new file mode 100644 index 0000000000..1ae35f5022 --- /dev/null +++ b/nuxt/pages/use-cases/scada.vue @@ -0,0 +1,132 @@ + + + diff --git a/nuxt/pages/use-cases/uns.vue b/nuxt/pages/use-cases/uns.vue new file mode 100644 index 0000000000..1be9248e75 --- /dev/null +++ b/nuxt/pages/use-cases/uns.vue @@ -0,0 +1,182 @@ + + + diff --git a/nuxt/public/images/home/connect_graphic.png b/nuxt/public/images/home/connect_graphic.png new file mode 100644 index 0000000000..384d4e30f1 Binary files /dev/null and b/nuxt/public/images/home/connect_graphic.png differ diff --git a/nuxt/public/images/pictograms/bias_for_action_blue.png b/nuxt/public/images/pictograms/bias_for_action_blue.png new file mode 100644 index 0000000000..127dbd23d1 Binary files /dev/null and b/nuxt/public/images/pictograms/bias_for_action_blue.png differ diff --git a/nuxt/public/images/pictograms/data_integration_blue.png b/nuxt/public/images/pictograms/data_integration_blue.png new file mode 100644 index 0000000000..40f7a4818c Binary files /dev/null and b/nuxt/public/images/pictograms/data_integration_blue.png differ diff --git a/nuxt/public/images/pictograms/edge_blue.png b/nuxt/public/images/pictograms/edge_blue.png new file mode 100644 index 0000000000..967f86e152 Binary files /dev/null and b/nuxt/public/images/pictograms/edge_blue.png differ diff --git a/nuxt/public/images/pictograms/factory_blue.png b/nuxt/public/images/pictograms/factory_blue.png new file mode 100644 index 0000000000..de5908ff7c Binary files /dev/null and b/nuxt/public/images/pictograms/factory_blue.png differ diff --git a/nuxt/public/images/pictograms/node_catalog_blue.png b/nuxt/public/images/pictograms/node_catalog_blue.png new file mode 100644 index 0000000000..4855425669 Binary files /dev/null and b/nuxt/public/images/pictograms/node_catalog_blue.png differ diff --git a/nuxt/public/images/pictograms/ticket_blue.png b/nuxt/public/images/pictograms/ticket_blue.png new file mode 100644 index 0000000000..f44d23eb5c Binary files /dev/null and b/nuxt/public/images/pictograms/ticket_blue.png differ diff --git a/nuxt/public/images/solutions/data-integration.png b/nuxt/public/images/solutions/data-integration.png new file mode 100644 index 0000000000..9959837ffa Binary files /dev/null and b/nuxt/public/images/solutions/data-integration.png differ diff --git a/nuxt/public/images/solutions/ff-uns.png b/nuxt/public/images/solutions/ff-uns.png new file mode 100644 index 0000000000..564c26cf16 Binary files /dev/null and b/nuxt/public/images/solutions/ff-uns.png differ diff --git a/nuxt/public/images/solutions/flowfuse-uns.png b/nuxt/public/images/solutions/flowfuse-uns.png new file mode 100644 index 0000000000..55cac98171 Binary files /dev/null and b/nuxt/public/images/solutions/flowfuse-uns.png differ diff --git a/nuxt/public/images/solutions/markitechture-manufacturing.png b/nuxt/public/images/solutions/markitechture-manufacturing.png new file mode 100644 index 0000000000..d23484184b Binary files /dev/null and b/nuxt/public/images/solutions/markitechture-manufacturing.png differ diff --git a/nuxt/public/images/solutions/mes-hero.png b/nuxt/public/images/solutions/mes-hero.png new file mode 100644 index 0000000000..2fab328fa0 Binary files /dev/null and b/nuxt/public/images/solutions/mes-hero.png differ diff --git a/nuxt/public/images/solutions/oee-dashboard--1.png b/nuxt/public/images/solutions/oee-dashboard--1.png new file mode 100644 index 0000000000..5c15c26d9d Binary files /dev/null and b/nuxt/public/images/solutions/oee-dashboard--1.png differ diff --git a/nuxt/public/images/solutions/scada-hero.png b/nuxt/public/images/solutions/scada-hero.png new file mode 100644 index 0000000000..99b50afd38 Binary files /dev/null and b/nuxt/public/images/solutions/scada-hero.png differ diff --git a/nuxt/public/images/solutions/scada-how-diagram.png b/nuxt/public/images/solutions/scada-how-diagram.png new file mode 100644 index 0000000000..26120a47e3 Binary files /dev/null and b/nuxt/public/images/solutions/scada-how-diagram.png differ diff --git a/nuxt/public/images/solutions/scada-how-flow.png b/nuxt/public/images/solutions/scada-how-flow.png new file mode 100644 index 0000000000..1daf7390d3 Binary files /dev/null and b/nuxt/public/images/solutions/scada-how-flow.png differ diff --git a/nuxt/public/images/solutions/webinar-july-2023_video_tile.jpg b/nuxt/public/images/solutions/webinar-july-2023_video_tile.jpg new file mode 100644 index 0000000000..e0b22e52ee Binary files /dev/null and b/nuxt/public/images/solutions/webinar-july-2023_video_tile.jpg differ diff --git a/nuxt/public/images/stories/abrasive_tech.jpg b/nuxt/public/images/stories/abrasive_tech.jpg new file mode 100644 index 0000000000..90d2de5e0d Binary files /dev/null and b/nuxt/public/images/stories/abrasive_tech.jpg differ diff --git a/nuxt/public/images/stories/large-us-manufacturing.jpg b/nuxt/public/images/stories/large-us-manufacturing.jpg new file mode 100644 index 0000000000..a6c021a8fa Binary files /dev/null and b/nuxt/public/images/stories/large-us-manufacturing.jpg differ diff --git a/nuxt/public/images/stories/stfi-future-textile.jpg b/nuxt/public/images/stories/stfi-future-textile.jpg new file mode 100644 index 0000000000..445814f098 Binary files /dev/null and b/nuxt/public/images/stories/stfi-future-textile.jpg differ diff --git a/nuxt/server/middleware/legacy.ts b/nuxt/server/middleware/legacy.ts index cc1ebec52b..5606284c33 100644 --- a/nuxt/server/middleware/legacy.ts +++ b/nuxt/server/middleware/legacy.ts @@ -15,13 +15,12 @@ const NUXT_ROUTE_PREFIXES = ['/integrations/', '/raw/'] // left once its one referring blog post pointed at /contact-us/ instead) - but they stay // listed so their 301s in nuxt/redirects.ts are served by Nitro in dev rather than being // proxied to 11ty, which has nothing there either. -const NUXT_PREFIXES = ['/handbook', '/ebooks', '/whitepaper', '/pricing', '/docs', '/changelog', '/application-guide', '/blog', '/product', '/customer-stories', '/thank-you', '/resources', '/webinars', '/free-consultation', '/vs', '/landing'] +const NUXT_PREFIXES = ['/handbook', '/ebooks', '/whitepaper', '/pricing', '/docs', '/changelog', '/application-guide', '/blog', '/product', '/customer-stories', '/thank-you', '/resources', '/webinars', '/free-consultation', '/vs', '/landing', '/use-cases'] // Top-level routes still on 11ty, not yet ported to Nuxt (everything not listed above // already falls through to the 11ty proxy by default). Remove entries here as they migrate: // /blueprints, /careers, /community, /events -// /free-consultation, /industries, /node-red, /partners, /platform, -// /use-cases, /webinars +// /free-consultation, /industries, /node-red, /partners, /platform, /webinars // New pages should never grow that fallback set: nuxt/lib/legacy-pages.test.mjs fails // `npm test` if a PR adds a new .njk file under src/ that doesn't already exist on main, @@ -48,8 +47,8 @@ export default defineEventHandler(async (event) => { // proxy them to 11ty in dev even though /changelog and /blog are Nuxt-handled prefixes. if (/^\/(changelog|blog)\/\d{4}\/\d{2}\/images\//.test(normalised)) return proxyRequest(event, `http://localhost:8080${path}`) - // Same story for src/resources/images/** (whitepaper/ebook cover images, referenced - // from still-11ty pages like use-cases/uns.njk) - /resources is otherwise a Nuxt prefix. + // Same story for src/resources/images/** (whitepaper/ebook cover images whose files + // still live in the 11ty tree) - /resources is otherwise a Nuxt prefix. if (normalised.startsWith('/resources/images/')) return proxyRequest(event, `http://localhost:8080${path}`) // Same story for src/landing/images/**: 11ty-owned files that only reach nuxt/public/ @@ -59,6 +58,12 @@ export default defineEventHandler(async (event) => { return proxyRequest(event, `http://localhost:8080${path}`) } + // And for src/whitepaper/images/** - the covers these pages link to. /whitepaper is + // itself a Nuxt prefix, so without this dev answers from Nuxt and the images 404. + if (normalised.startsWith('/whitepaper/images/')) { + return proxyRequest(event, `http://localhost:8080${path}`) + } + // The documentation below /node-red/ moved into /docs/, and every old URL now 301s // from nuxt/redirects-node-red.ts. Those are Nitro route rules, so the request has to // reach Nitro in dev rather than being proxied to 11ty, which no longer has the pages. diff --git a/nuxt/utils/navIcons.ts b/nuxt/utils/navIcons.ts index 9f41efcf7e..9d981390dc 100644 --- a/nuxt/utils/navIcons.ts +++ b/nuxt/utils/navIcons.ts @@ -1,4 +1,5 @@ -// Icon markup for the marketing nav, keyed exactly as src/_data/chrome.json spells it. +// Icon markup for the marketing nav, keyed exactly as src/_data/chrome.json spells it, +// plus the handful of keys page content asks for by name through . // // These are the same files Eleventy's `navoption` shortcode reads, so both // renderers draw the identical glyph from one source. The imports are listed @@ -23,9 +24,13 @@ import iCertificate from '../../src/_includes/components/icons/certificate.svg?r import iChart from '../../src/_includes/components/icons/chart.svg?raw' import iCloud from '../../src/_includes/components/icons/cloud.svg?raw' +import iCodeblock from '../../src/_includes/components/icons/codeblock.svg?raw' import iChat from '../../src/_includes/components/icons/chat.svg?raw' import iCubeTransparent from '../../src/_includes/components/icons/cube-transparent.svg?raw' +import iData from '../../src/_includes/components/icons/data.svg?raw' +import iDatabase from '../../src/_includes/components/icons/database.svg?raw' +import iLock from '../../src/_includes/components/icons/lock.svg?raw' import iChatBubbleLeftRightSm from '../../src/_includes/components/icons/chat-bubble-left-right-sm.svg?raw' import iCheckBadge from '../../src/_includes/components/icons/check-badge.svg?raw' import iChip from '../../src/_includes/components/icons/chip.svg?raw' @@ -80,6 +85,10 @@ export const navIcons: Record = { 'cloud': iCloud, 'cube-transparent': iCubeTransparent, + 'codeblock': iCodeblock, + 'data': iData, + 'database': iDatabase, + 'lock': iLock, 'chat-bubble-left-right-sm': iChatBubbleLeftRightSm, 'check-badge': iCheckBadge, 'chip': iChip, diff --git a/src/_includes/components/use-case-chips.njk b/src/_includes/components/use-case-chips.njk deleted file mode 100644 index 93e8e48e77..0000000000 --- a/src/_includes/components/use-case-chips.njk +++ /dev/null @@ -1,30 +0,0 @@ -{# ============================================================ - USE CASE CONTEXT BAND - labeled links to the industry lens - pages. Reads `industries[]` (slugs) from page front-matter. - The slug->label maps mirror - the Use Cases Asana project fields (source of truth). - Rendered near the end of the use-case page, not under the hero. - ============================================================ #} -{% set industryLabels = { - "automotive": "Automotive", - "food-beverage": "Food & Beverage", - "life-sciences": "Life Sciences", - "aviation-aerospace": "Aviation & Aerospace", - "aerospace-components": "Aerospace Components", - "renewables": "Renewables", - "semiconductors": "Semiconductors", - "electronics-appliances": "Electronics & Appliances" -} %} -{% if industries %} -
-
- {% if industries %} - Common in these industries -

- {% for slug in industries %}{{ industryLabels[slug] or slug }}{% if not loop.last %}, {% endif %}{% endfor %} - · all industries -

- {% endif %} -
-
-{% endif %} diff --git a/src/_includes/layouts/solution.njk b/src/_includes/layouts/solution.njk deleted file mode 100644 index 4e3e6c5fd9..0000000000 --- a/src/_includes/layouts/solution.njk +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: layouts/base.njk -sitemapPriority: 0.8 ---- - -
-
-
-

- {{ title }} -

-

- {{ subtitle }} -

-
-
- -
- {{ description | safe }} -
-
-
-
- -
- {{ content | safe }} -
\ No newline at end of file diff --git a/src/_includes/layouts/use-case.njk b/src/_includes/layouts/use-case.njk deleted file mode 100644 index 210b1d51fd..0000000000 --- a/src/_includes/layouts/use-case.njk +++ /dev/null @@ -1,327 +0,0 @@ ---- -layout: layouts/base.njk -sitemapPriority: 0.7 ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} -{# ============================================================ - USE CASE LAYOUT (content-driven, pain-led narrative) - - Per-page front-matter (rich, preferred): - problem hero sub-headline (the pain in one line) - customerPain { heading, intro[], cards[ {icon,title,detail} ] } - outcomeFirst { heading, intro, dimensions[ {label,title,detail} ] } - whyItMatters { heading, intro, points[ {title,detail} ] } - competition { heading, intro, traps[ {label,title,detail} ] } - comparison { without[ {title,detail} ], with[ {title,detail} ] } - - Legacy fall-back front-matter (simple skeleton, still supported): - gap[], workflow[], outcomes[] - - No customer names and no attributed quotes on the public page. - ============================================================ #} - -{# --- build the sticky section nav from the blocks that exist --- #} -{% 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 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 %} - -
- - -
-
-

Use case

-

{{ title }}

-

{{ problem }}

-
- {{ ctaBookDemo('highlight', 'hero', extraClass='min-h-[40px]') }} -
-
-
- - {% if nav.length %} - - - {% endif %} - - {% if customerPain %} - -
-
-

01 · Customer pain

-

{{ customerPain.heading }}

-
- {% for paragraph in customerPain.intro %} -

{{ paragraph }}

- {% endfor %} -
-
- {% for card in customerPain.cards %} -
-
- {% include "components/icons/" + card.icon + ".svg" %} -
-

{{ card.title }}

-

{{ card.detail }}

-
- {% endfor %} -
-
-
- {% endif %} - - {% if outcomeFirst %} - -
-
-

02 · Outcome first

-

{{ outcomeFirst.heading }}

-

{{ outcomeFirst.intro }}

-
- {% for dim in outcomeFirst.dimensions %} -
- {{ dim.label }} -

{{ dim.title }}

-

{{ dim.detail }}

-
- {% endfor %} -
-
-
- {% endif %} - - {% if whyItMatters %} - -
-
-

03 · Why this is important

-

{{ whyItMatters.heading }}

-

{{ whyItMatters.intro }}

-
- {% for point in whyItMatters.points %} -
- {% if loop.index < 10 %}0{% endif %}{{ loop.index }} -
-

{{ point.title }}

-

{{ point.detail }}

-
-
- {% endfor %} -
-
-
- {% endif %} - - {% if competition %} - -
-
-

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

-

{{ competition.heading }}

-

{{ competition.intro }}

-
- {% for trap in competition.traps %} -
-
- {% include "components/icons/x-circle.svg" %} - {{ trap.label }} -
-

{{ trap.title }}

-

{{ trap.detail }}

-
- {% endfor %} -
-
-
- {% endif %} - - {% if comparison %} - -
-
-

05 · With / without FlowFuse

-
-
-

Without FlowFuse

-
- {% for row in comparison.without %} -
- {% include "components/icons/x-mark.svg" %} -
-
{{ row.title }}
-

{{ row.detail }}

-
-
- {% endfor %} -
-
-
-

With FlowFuse

-
- {% for row in comparison.with %} -
- {% include "components/icons/check-circle.svg" %} -
-
{{ row.title }}
-

{{ row.detail }}

-
-
- {% endfor %} -
-
-
-
-
- {% endif %} - - {% if aiBuildLayer %} - -
-
-

06 · Build it with AI

-

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

-

{{ aiBuildLayer.intro }}

-
- {% for step in aiBuildLayer.steps %} -
-
- {% include "components/icons/sparkles.svg" %} - Step {% if loop.index < 10 %}0{% endif %}{{ loop.index }} -
-

{{ step.title }}

-

{{ step.detail }}

-
- {% endfor %} -
- - {% if aiBuildLayer.note %} -

{{ aiBuildLayer.note }}

- {% endif %} -
-
- {% endif %} - - {# ============================================================ - LEGACY SKELETON FALL-BACK (only when no rich blocks defined) - ============================================================ #} - {% if not nav.length %} - {% if gap %} -
-
-

The operational gap

-
- {% for paragraph in gap %} -

{{ paragraph }}

- {% endfor %} -
-

Placeholder copy. Generic operational framing for this workflow pattern.

-
-
- {% endif %} - {% if workflow %} -
-
-

The operational workflow

-
    - {% for item in workflow %} -
  • - {% include "components/icons/check.svg" %} - {{ item }} -
  • - {% endfor %} -
-
-
- {% endif %} - {% if outcomes %} -
-
-

Outcomes

-
- {% for outcome in outcomes %} -
- {% include "components/icons/arrow-trending-up.svg" %} -

{{ outcome }}

-
- {% endfor %} -
-

Placeholder outcomes. No customer names or real figures.

-
-
- {% endif %} - {% endif %} - - - {% include "components/use-case-chips.njk" %} - - {# ============================================================ - RELATED RESOURCES: disabled for now. - - Held back until there is enough tagged content to fill it. With the - current set of resources the section renders more empty space and - "More coming soon" placeholders than actual links, which reads as - unfinished rather than as a useful set of next steps. - - To bring it back, uncomment the two lines below. The component itself - is unchanged and still works; it needs no edits, only more resources - carrying the matching use-case tag. - ============================================================ #} - {# - {% set useCaseSlug = page.fileSlug %} - {% include "components/related-resources.njk" %} - #} - - -
-
-

{{ closingCta.heading or "See it on your operations" }}

-

{{ closingCta.description or "Talk to an expert, or get started with FlowFuse today." }}

-
- {{ ctaBookDemo('highlight', 'footer', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'footer', extraClass='min-h-[40px]') }} -
-
-
- - -
diff --git a/src/use-cases.njk b/src/use-cases.njk deleted file mode 100644 index 4b23bbdd04..0000000000 --- a/src/use-cases.njk +++ /dev/null @@ -1,81 +0,0 @@ ---- -layout: layouts/base.njk -sitemapPriority: 0.8 -title: "Use Cases" -meta: - title: "Use Cases" - description: "Generic operational workflow patterns for industrial teams. Turn events into action with FlowFuse. Placeholder skeleton hub." ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -
- - -
-
-

Use cases

-

Turn industrial events into action

-

Operational workflow patterns that follow Event, Decision, Action. Explore how each one is operationalized with FlowFuse.

-
- {{ ctaContactUs('highlight', 'hero', extraClass='min-h-[40px]') }} -
-
-
- - -
-
-

Operational use cases

-

Problems operations teams own, and how they are solved with FlowFuse. Each use case is also reachable by industry.

-
- {% for uc in collections["use-case"] | sort(false, true, "data.title") %} - {% if uc.data.values %} - -

{{ uc.data.title }}

-

{{ uc.data.problem }}

- - View use case - {% include "components/icons/arrow-right.svg" %} - -
- {% endif %} - {% endfor %} -
-
-
- - -
-
-

By architecture

-

How FlowFuse is deployed and where it sits in your stack. Architectures are the technical evaluator's entry point; the use cases above are what gets built on them.

-
- {% for uc in collections["use-case"] | sort(false, true, "data.title") %} - {% if not uc.data.values %} - -

{{ uc.data.title }}

-

{{ uc.data.problem }}

- - View architecture - {% include "components/icons/arrow-right.svg" %} - -
- {% endif %} - {% endfor %} -
-
-
- - -
-
-

See it on your workflow

-

Talk to an expert, or get started with FlowFuse today.

-
- {{ ctaContactUs('highlight', 'footer', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'footer', extraClass='min-h-[40px]') }} -
-
-
- -
diff --git a/src/use-cases/data-integration.njk b/src/use-cases/data-integration.njk deleted file mode 100644 index 8e16f569b8..0000000000 --- a/src/use-cases/data-integration.njk +++ /dev/null @@ -1,143 +0,0 @@ ---- -layout: solution -title: FlowFuse for Data Integration -problem: "Collect, transform, and route data from any industrial source to any destination, without writing integration code from scratch." -image: /images/solutions/og-solutions-data-integration.jpg -subtitle: -heroImg: ./images/pictograms/data_integration_blue.png -description: -

Data integration can be a challenging task, especially when dealing with multiple data formats, protocols, and sources. FlowFuse's low-code industrial application platform allows anyone to collect data from multiple sources, apply the data, and update, store, and transmit data to a new service.

---- -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -
-
- {{ ctaContactUs('highlight', 'hero', extraClass='inline-block shadow') }} -
-
- -
-
-

Challenges of Data Integration

- -
-
- {% ffIconLg "data", true %} -

- Data comes from different sources, including internal IT systems (ERP, CRM, SCM), IoT devices, external data services (weather, foreign exchange, etc.) -

-
-
- {% ffIconLg "codeblock" %} -

- Data is accessible in a wide variety of formats, including CSV files, REST Api, XML, YAML, MQTT. -

-
-
- {% ffIconLg "lock" %} -

- Access to data is often gated by IT departments making it slow and timing consuming for departments to get access to new integrated data. -

-
-
- {% ffIconLg "database" %} -

- Data needs to be stored in different formats and databases. -

-
-
- {% ffIconLg "chart" %} -

- Data needs to be visualized and communicated back to a user. -

-
-
-
-

Why FlowFuse is the Data Integration Solution

-
-
-

Accessible for Anyone

-
-

- FlowFuse’s low-code visual environment makes it easy for non-programmers to integrate data from - different sources without needing to know how to code. This enables all kinds of departments to work - on their own data integration projects without requiring support from IT. -

-
-
-
-

Real-Time Data Visualisation

-

- FlowFuse makes it easy to create real-time data visualizations and dashboards. Data can be - filtered, transformed and analyzed through event-driven flows to get real-time insights into your business. -

-
-
-

Support for Different Data Formats

-

- FlowFuse supports parsing a wide range of formats including: csv, - html, json, xml and yaml. Additional - additional data formats are available through FlowFuse’s support for over 5,000 open-source plug-ins. -

-
-
-
-
-
- -
-
-
-

FlowFuse Improves Data Integration

-
-
-
-
- {% image "./images/pictograms/community_blue.png", "", [128] %} -
-

Collaborative Development

- -
-

- FlowFuse makes it possible for teams to collaborate on the same flows and applications. -

-

- Team members can share instances to make for quicker and more efficient development, with full version control and audit trails built in. -

-
-
-
-
- {% image "./images/pictograms/node_catalog_blue.png", "", [128] %} -
-

Managed Application Service

-
-

- We run your instances so you don’t have to worry about the production reliability of your industrial applications. -

-
-
-
-
- {% image "./images/pictograms/bias_for_action_blue.png", "", [128] %} -
-

Software Delivery Pipelines

- -
-

- FlowFuse allows you to create snapshots of your instances so you can create software delivery pipelines for development, test, and production. You can revert to a previous version of a snapshot to rollback any changes. -

-
-
-
-
-
-

- Discover how FlowFuse can power your Data Integration. -

-
- {{ ctaContactUs('primary', 'footer', extraClass='inline-block m-auto') }} -
-
-
\ No newline at end of file diff --git a/src/use-cases/edge-connectivity.njk b/src/use-cases/edge-connectivity.njk deleted file mode 100644 index 3c51173c28..0000000000 --- a/src/use-cases/edge-connectivity.njk +++ /dev/null @@ -1,97 +0,0 @@ ---- -layout: solution -title: FlowFuse for Edge Connectivity -problem: "Deploy and manage Node-RED instances on edge hardware at scale, from a single pane of glass, without touching each device." -image: /images/solutions/og-solutions-edge-connectivity.jpg -subtitle: -heroImg: ./images/pictograms/edge_blue.png -description: -

FlowFuse simplifies the management of deployments to edge devices in manufacturing, from equipment to PLCs. Our platform ensures secure and reliable handling of large-scale deployments, providing seamless edge connectivity solutions.

---- -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -
-
- {{ ctaContactUs('highlight', 'hero', extraClass='inline-block shadow') }} -
-
- -
-
-
-
-

Scaleable Edge Connectivity

-
-

- Efficiently connect and manage vast fleets of edge devices with FlowFuse. Our device agent ensures synchronized updates across all devices, while our central console provides seamless status monitoring and reliable connectivity management. -

-
-
-
-

Effortless Data Streaming

-
-

- FlowFuse makes data streaming to the cloud painless, removing the hassle of network configurations. Our custom nodes facilitate effortless MQTT connection between the device and the FlowFuse platform, removing the need for complex setup. No configuration of IP address, domain name, certificates or firewalls required. -

-
-
-
-

Consistent Deployment Assurance

-
-

- Create and distribute consistent application snapshots across your devices with FlowFuse. Our central console ensures uniform deployment, maintaining version consistency across your network. -

-
-
-
-

Rapid Security Deployment

-
-

- FlowFuse provides expert support for your deployments, ensuring systems are consistently up-to-date and operationally continuous, backed by our professional guidance. -

-
-
-
-

Remote Troubleshooting

-
-

- Identify and resolve production issues remotely with FlowFuse's debugging capabilities. This feature significantly eases troubleshooting of instances on devices. -

-
-
-
-

Easy Onboarding

-
-

- Easily integrate new devices into FlowFuse through our administrative interface or automated processes. This allows for hassle-free connection of multiple devices without manual intervention. -

-
-
-
-
-
-
- -
-
-
- - -
-
-

What teams build at the edge

- {% set featuredUseCases = ["shop-floor-communication", "production-monitoring"] %} - {% include "components/use-case-links.njk" %} - -
-
- -
-
-

- Ready to learn more? -

-
- {{ ctaContactUs('primary', 'footer', extraClass='inline-block m-auto') }} -
-
-
diff --git a/src/use-cases/it-ot-middleware.njk b/src/use-cases/it-ot-middleware.njk deleted file mode 100644 index bb9ec13a6c..0000000000 --- a/src/use-cases/it-ot-middleware.njk +++ /dev/null @@ -1,289 +0,0 @@ ---- -layout: solution -title: FlowFuse for IT/OT Integration -problem: "Bridge OT protocols and IT systems with low-code flows. Connect PLCs, SCADA, and historians to ERP, databases, and cloud services." -subtitle: FlowFuse allows teams to automate their manufacturing process through customized, reliable applications. -meta: - keywords: "FlowFuse, Manufacturing, Automation, DevOps, Integration, OT, IT, Data, Visualization, Event Triggers, Fleet Management, Monitoring, Collaborative Development, Environment, Application Deployment, Professional Support" - faq: - - question: "Can FlowFuse connect our PLCs to our ERP system?" - answer: > - Yes, FlowFuse can be extended with over 5,000 open-source plug-ins to support virtually all industrial protocols. Connect your Siemens, Allen-Bradley, Omron, or other PLCs directly to SAP, Oracle, or any ERP system. - - question: "We have mixed equipment brands on our shop floor. Can FlowFuse handle this?" - answer: > - Absolutely. FlowFuse acts as a universal translator between different equipment brands and protocols, allowing seamless data exchange between Siemens, Rockwell, Schneider, and other vendors. - - question: "How do we ensure production data security when connecting shop floor to business systems?" - answer: > - FlowFuse provides secure tunneling for device connections, encrypted data transmission using TLS/SSL, role-based access control (RBAC), and comprehensive audit logging to meet manufacturing compliance requirements. - - question: "Can our plant operators create data flows without IT support?" - answer: > - Yes, FlowFuse uses a visual drag-and-drop interface. Operators can build integrations between machines, SCADA, and business systems by connecting pre-built nodes - no coding required. - - question: "What if our legacy equipment doesn't support modern protocols?" - answer: > - FlowFuse can connect through serial converters, protocol gateways, or even manual data entry interfaces, ensuring no equipment is left behind in your digital transformation. - - question: "Do we need to shut down production to implement FlowFuse?" - answer: > - No, FlowFuse can be deployed alongside existing systems with read-only connections initially. Full integration can be phased in during scheduled maintenance windows. -image: /images/solutions/og-solutions-manufacturing.jpg -heroImg: ./images/pictograms/factory_blue.png -description: -

FlowFuse streamlines manufacturing automation, from production monitoring to supply chain management. Our intuitive, customizable platform enables simple creation of custom solutions for unique manufacturing needs.

---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} -
-
- {{ ctaBookDemo('highlight', 'hero', extraClass='inline-block shadow') }} - Read Whitepaper -
-
- -
-
-
-
-

Hardware & Sensor Integration

-
-

- FlowFuse simplifies connecting diverse hardware and sensors in manufacturing, enhancing data collection and analytics for informed decision-making and efficiency improvements. -

-
-
-
-

Integrate OT and IT Data

-
-

- Our platform unifies operational and information technology data, offering manufacturers a comprehensive view of production processes for improved efficiency. -

-
-
-
-

Intuitive OT Data visualization

-
-

- FlowFuse offers a visual interface for real-time monitoring and analysis of operational data, aiding in quick, data-driven decisions to optimize manufacturing operations. -

-
-
-
-

Automate Event Triggers

-
-

- With FlowFuse, automate event triggers to respond instantly to production line changes, reducing downtime and boosting efficiency. -

-
-
-
-
-
- -
- {% image "./images/solutions/markitechture-manufacturing.png", "High level architecture diagram showing how Node-RED can assist with data flow across a factory and manufacturing use-case", [1024] %} -
- -
-
-
-

Enhancing Manufacturing with FlowFuse's DevOps Integration

-

- FlowFuse elevates manufacturing by ensuring reliable and continuous delivery of applications. Our platform incorporates widely recognized DevOps concepts, fostering a collaborative and secure development environment. -

-
-
-
-
-
-
- {% image "./images/pictograms/edge_blue.png", "", [128] %} -
-
-

Optimized Fleet Management & Monitoring

-
-

- FlowFuse revolutionizes equipment and device monitoring in manufacturing. Our platform automates remote deployment and management, ensuring efficiency and flexibility in operations. -

-
-
-
-
-
-
-
- {% image "./images/pictograms/community_blue.png", "", [128] %} -
-
-

Collaborative Development Environment

-
-

- Enhancing teamwork in development, FlowFuse allows multiple team members to co-create and streamline application development, increasing efficiency and cohesion. -

-
-
-
-
-
-
-
- {% image "./images/pictograms/bias_for_action_blue.png", "", [128] %} -
-
-

Efficient Application Deployment

-
-

- FlowFuse introduces structured DevOps pipelines, supporting various stages from development to production, to guarantee reliable, secure, and high-quality application delivery. -

-
-
-
-
-
-
-
- {% image "./images/pictograms/ticket_blue.png", "", [128] %} -
-
-

Dedicated Professional Support

-
-

- FlowFuse provides expert support for your deployments, ensuring systems are consistently up-to-date and operationally continuous, backed by our professional guidance. -

-
-
-
-
-
-
- - -
-
-
-
-

- Frequently Asked Questions -

- {% include "faq.njk" %} -
-
-
-
- -
-
- - {% set caseStudies = [ - { - title: "Revolutionizing Precision Manufacturing with Node-RED", - image: "./images/stories/abrasive_tech.jpg", - alt: "Photo of helicopters and a precision manufacturing machine", - link: "/customer-stories/leveraging-node-red-and-flowfuse-to-automate-precision-manufacturing/" - }, - { - title: "The Future of Textile Manufacturing Powered with Node-RED", - image: "./images/stories/stfi-future-textile.jpg", - alt: "Photo of the STFI floor plant", - link: "/customer-stories/stfi-future-of-textile-powered-by-node-red/" - }, - { - title: "Node-RED Enables Digital Transformation of a Large US Manufacturing Company", - image: "./images/stories/large-us-manufacturing.jpg", - alt: "Photo of a manufacturing company with a worker holding a laptop", - link: "/customer-stories/manufacturing-digital-transformation/" - } - ] %} - - {% set whitepapers = [ - { - title: "Accelerating Innovation in Manufacturing with FlowFuse", - image: "./whitepaper/images/whitepaper-manufacturing.png", - alt: "Photo of a manufacturing company with a worker holding a laptop", - link: "/whitepaper/accelerating-innovation-in-manufacturing-with-flowfuse/" - }, - { - title: "Open Source Software for Manufacturing", - image: "./whitepaper/images/whitepaper-oss-manufacturing.jpg", - alt: "Photo of a manufacturing company shop floor", - link: "/whitepaper/open-source-software-for-manufacturing/" - } - ] %} -
-

Resources

-
-
-
- -

Case Studies

- {% for caseStudy in caseStudies %} - -
  • -
    - {% image caseStudy.image, caseStudy.alt, [208] %} -
    - -
  • -
    - {% endfor %} - -

    Whitepapers

    - {% for whitepaper in whitepapers %} - -
  • -
    - {% image whitepaper.image, whitepaper.alt, [208] %} -
    - -
  • -
    - {% endfor %} -
    -
    - -
    -

    Flexible Deployment Options with FlowFuse

    -
    -
    -
    -
    -
    -
    -

    FlowFuse Cloud
    -

    -
    -

    - The easiest way to start building industrial applications. No installation required! Simply sign up and gain immediate access to the editor. -

    -
    - {{ ctaSignUp(site, 'primary-outlined', 'manufacturing', extraClass='md:self-end align-baseline w-full mt-3') }} -
    -
    -
    -
    -

    Self managed
    -

    -
    (on premise)
    -
    -

    - Run FlowFuse where you prefer; that's possible too! In your cloud of preference, or even on-site. -

    -
    - INSTALL NOW -
    -
    -
    -
    -

    Edge device
    -

    -
    -

    - Run FlowFuse where the data is generated. Manage thousands of edge devices through the FlowFuse Device Agent. -

    -
    - MORE INFO -
    -
    -
    -
    -
    - -{% include "smooth-scroll.njk" %} diff --git a/src/use-cases/mes.njk b/src/use-cases/mes.njk deleted file mode 100644 index 97524ab51c..0000000000 --- a/src/use-cases/mes.njk +++ /dev/null @@ -1,150 +0,0 @@ ---- -layout: page -title: "FlowFuse for MES" -problem: "Build exactly the MES your operation needs, compose modular execution, tracking, and reporting flows without a monolithic vendor platform." -nohero: true -heroSection: - title: "FlowFuse for your own MES" - image: images/solutions/mes-hero.png - imgAlt: "MES with FlowFuse" -bannerSection: - title: "MES for Modern Industry" - content: "MES systems evolved to manage and monitor manufacturing operations on the shop floor, serving to bridge the gap between enterprise resource planning (ERP) systems and production process management like a SCADA system. Complete, monolithic MES systems are no longer needed. FlowFuse provides the resources that allow you to build and augment the components for the MES system you need, securely and at scale." -howSection: - title: "How it Works" - p1: - - "Monolithic MES systems - think Siemens OpCenter Execution or Rockwell Automation’s Plex - offer MES products that are comprehensive and sophisticated, but also expensive and complex. In contrast, FlowFuse gives you a flexible, low-code industrial application platform with popular industry protocols, integrations, and our resource library to design and deploy applications for the MES solution you want for your business - and nothing more." - - "Here is an example. An MES system is essentially a collection of management functions, like production tracking, resource management, data collection and analysis, and scheduling and dispatching. With FlowFuse, you can build the MES features you want by creating applications for the functions that you need, and none that you don’t." - p2: "Collect data from the shop floor or the lab by using FlowFuse Certified Nodes to connect with local machines using any protocol: MQTT, OPC-UA, Modbus, Sparkplug B, and any other protocol that exists now or in the future." - image1: images/home/connect_graphic.png - imageAlt1: "Icons of communication protocols" - image2: images/solutions/oee-dashboard--1.png - imageAlt2: "OEE dashboard" - p3: - - "Create applications in FlowFuse to transform your data for analysis and create visualizations that enable your team to make data-driven decisions about your business. Our ever-expanding Blueprints library helps you get started quickly." - - "Because FlowFuse provides central management of all of your instances, you can easily monitor your applications whether you're running a dozen in a factory or thousands at sites across the globe." -industrySection: - title: "MES for Your Industry" - p1: - - "The MES needs for an automotive plant, a pharmaceutical manufacturer, and an airline are all very distinct - and yet all can (and do) rely on FlowFuse. With the flexibility, security, and scalability of the FlowFuse platform, every kind of industrial operation can operate the MES they need." - - "And with the FlowFuse open source advantage, you can extend the platform with any custom integrations or nodes you need at any time, and securely manage the instances that you create along the way." -whySection: - title: "The FlowFuse Advantage" - reasons: - - title: "Built-in adaptation layer" - description: "Leverage FlowFuse's low-code platform to design exactly the MES your organization needs." - - title: "End-to-end insight and control" - description: "Everything you need to connect, manage, visualize and analyze your data in one place." - - title: "Limitless connections" - description: "Robust and growing open-source library provides connections for all protocols, all machines, and all devices." - - title: "Rapid implementation" - description: "Get up and running quickly on FlowFuse Cloud." - - title: "Open-source" - description: "Avoid vendor lock-in." - - title: "Low-Code" - description: "Empowering your teams to build custom solutions with ease." -ctaSection: - title: "Ready to build the MES your business needs?" - primaryUrl: "/book-demo/" - primaryCta: "Contact us for Demo" - secondaryUrl: "sign-up-url" - secondaryCta: "Try FlowFuse Now" -meta: - title: "FlowFuse for your own MES" - description: "FlowFuse provides everything you need to build the robust Manufacturing Execution System (MES) you want, providing everything from production tracking to data analysis, with the components you need and the flexibility to customize as you see fit." - keywords: "FlowFuse, manufacturing, MES, Industry 4.0, Siemens S7, PLC, Sentron" ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} -
    - -
    -
    -
    -

    - {{ heroSection.title | safe }} -

    -

    - {{ meta.description }} -

    -
    - {% set image = ["./", heroSection.image ] | join %} - {% set imageAlt = heroSection.imgAlt %} - {% image image, imageAlt, [400] %} -
    -
    - {{ ctaContactUs('primary', 'primary', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'primary', extraClass='min-h-[40px]') }} -
    -
    -
    - {% set image = ["./", heroSection.image ] | join %} - {% set imageAlt = heroSection.imgAlt %} - {% image image, imageAlt, [550] %} -
    -
    -
    -
    -
    - -
    -

    {{ bannerSection.title | safe }}

    -

    {{ bannerSection.content | safe }}

    -
    - -

    {{ howSection.title | safe }}

    - {% for p in howSection.p1 %} -

    {{ p | safe }}

    - {% endfor %} -

    {{ howSection.p2 | safe }}

    -
    - {% set image = ["./", howSection.image1 ] | join %} - {% set imageAlt = howSection.imageAlt1 %} - {% image image, imageAlt, [550] %} -
    -
    - {% for p in howSection.p3 %} -

    {{ p | safe }}

    - {% endfor %} -
    -
    - {% if howSection.image2 %} - {% set image = ["./", howSection.image2 ] | join %} - {% set imageAlt = howSection.imageAlt2 %} - {% image image, imageAlt, [1024] %} - {% endif %} -
    - -

    {{ industrySection.title | safe }}

    - {% for p in industrySection.p1 %} -

    {{ p | safe }}

    - {% endfor %} -
    -
    -
    - -
    -
    -

    {{ whySection.title | safe }}

    -
    - {% for reason in whySection.reasons %} -
    -

    {{ reason.title }}

    -

    {{ reason.description }} -

    -
    - {% endfor %} -
    -
    -
    -
    - -
    -

    {{ ctaSection.title }}

    -
    - {{ ctaBookDemo('primary', 'secondary', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'secondary', extraClass='min-h-[40px]') }} -
    -
    -
    diff --git a/src/use-cases/scada.njk b/src/use-cases/scada.njk deleted file mode 100644 index 2a116b3e78..0000000000 --- a/src/use-cases/scada.njk +++ /dev/null @@ -1,134 +0,0 @@ ---- -layout: page -title: "FlowFuse for SCADA" -problem: "Modernize SCADA with low-code flows that connect legacy hardware, stream real-time data, and drive dashboards and alerts from a single platform." -nohero: true -heroSection: - title: "FlowFuse for SCADA" - image: images/solutions/scada-hero.png - imgAlt: "SCADA system with FlowFuse" -bannerSection: - title: "SCADA meets Industry 4.0" - content: "Legacy SCADA systems were built to monitor and control industrial systems before technological advancements provided a way to perform those functions without monolithic hardware systems. FlowFuse provides what you need to augment and develop modern SCADA, enabling industrial control and monitoring at scale and with enterprise-grade security. Enjoy low-code, agile, and responsive development with a platform that will integrate with all future protocols." -howSection: - title: "How it Works" - p1: "FlowFuse uses open-source, low-code technology capable of quickly and securely building applications to connect, integrate, and control machines previously packaged as a standalone SCADA system." - image1: images/solutions/scada-how-diagram.png - imageAlt1: "FlowFuse SCADA diagram" - p2: "Let’s take an example. Your factory is using a Siemens S7 PLC and a Sentron, collecting data from various sensors and actuators. You want to manage the efficiency of this process, so you open the FlowFuse instance that you created for managing this workflow and drag in the FlowFuse Certified S7 PLC node and Sentron node, entering configuration details to connect these devices along with anything else running in your factory." - image2: images/solutions/scada-how-flow.png - imageAlt2: "FlowFuse flow using the FlowFuse Certified S7 PLC node" - p3: - - "After perfecting the flow to connect your devices needed for control, you add settings to send data from every important part of the process to a database. To save time creating actionable visualizations, you pull in one of the customizable dashboard Blueprints approved by FlowFuse. Because this entire process runs on FlowFuse, each step is customizable and not limited to built-in parameters imposed by closed software. The entire operation is secure and can scale to as many lines and sites as you need." - - "The last step is to create useful visualizations. Since your team has been empowered to build the applications you need, you import some of your custom nodes and flows from your Team Library directly into your instance, structure your data the way you want to see it, and use FlowFuse Dashboard to create actionable visualizations. Because this entire process runs on FlowFuse, each step is customizable and not limited to built-in parameters imposed by closed software. The entire operation is secure and can scale to as many lines and sites as you need." - - "No matter your SCADA setup, FlowFuse empowers your organization to securely control, connect, and operate your workflow the way you see fit." -whySection: - title: "The FlowFuse Advantage" - reasons: - - title: "Built-in adaptation layer" - description: "Leverage FlowFuse's platform to integrate your SCADA functions into a comprehensive, modular solution." - - title: "End-to-end insight and control" - description: "Everything you need to connect, manage, visualize and analyze your data in one place." - - title: "Limitless connections" - description: "Robust and growing open-source library provides connections for all protocols, all machines, and all devices." - - title: "Rapid implementation" - description: "Get up and running quickly on FlowFuse Cloud." - - title: "Open-source" - description: "Avoid vendor lock-in. Rely on an open-source community of thousands for insights and advice." - - title: "Low-Code" - description: "Empowering your teams to build custom solutions with ease." -ctaSection: - title: "Ready to unlock SCADA for your organization?" - primaryUrl: "/book-demo/" - primaryCta: "Contact us for Demo" - secondaryUrl: "sign-up-url" - secondaryCta: "Try FlowFuse Now" -meta: - title: "FlowFuse for SCADA" - description: "FlowFuse provides SCADA value in an Industry 4.0 way and unlocks the potential to modernize your SCADA system with its powerful, customizable, modular components that streamline operations, reduce dependence on costly, monolithic solutions." - keywords: "FlowFuse, manufacturing, SCADA, Industry 4.0, Siemens S7, PLC, Sentron" ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} -
    - -
    -
    -
    -

    - {{ heroSection.title | safe }} -

    -

    - {{ meta.description }} -

    -
    - {% set image = ["./", heroSection.image ] | join %} - {% set imageAlt = heroSection.imgAlt %} - {% image image, imageAlt, [400] %} -
    -
    - {{ ctaContactUs('primary', 'primary', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'primary', extraClass='min-h-[40px]') }} -
    -
    -
    - {% set image = ["./", heroSection.image ] | join %} - {% set imageAlt = heroSection.imgAlt %} - {% image image, imageAlt, [450] %} -
    -
    -
    -
    -
    - -
    -

    {{ bannerSection.title | safe }}

    -

    {{ bannerSection.content }}

    -
    - -

    {{ howSection.title }}

    -

    {{ howSection.p1 }}

    -
    - {% set image = ["./", howSection.image1 ] | join %} - {% set imageAlt = howSection.imageAlt1 %} - {% image image, imageAlt, [550] %} -
    -

    {{ howSection.p2 }}

    -
    - {% set image = ["./", howSection.image2 ] | join %} - {% set imageAlt = howSection.imageAlt2 %} - {% image image, imageAlt, [385] %} -
    - {% for p in howSection.p3 %} -

    {{ p }}

    - {% endfor %} -

    FlowFuse connects Siemens, Allen-Bradley, Omron, and other PLCs to MQTT, OPC UA, cloud, and enterprise systems, without expensive gateways or proprietary lock-in. See the FlowFuse PLC integration overview for all supported protocols and use cases.

    -
    -
    -
    - -
    -
    -

    {{ whySection.title | safe }}

    -
    - {% for reason in whySection.reasons %} -
    -

    {{ reason.title }}

    -

    {{ reason.description }} -

    -
    - {% endfor %} -
    -
    -
    -
    - -
    -

    {{ ctaSection.title }}

    -
    - {{ ctaBookDemo('primary', 'secondary', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'secondary', extraClass='min-h-[40px]') }} -
    -
    -
    diff --git a/src/use-cases/uns.njk b/src/use-cases/uns.njk deleted file mode 100644 index 6d2f10af49..0000000000 --- a/src/use-cases/uns.njk +++ /dev/null @@ -1,242 +0,0 @@ ---- -layout: page -title: "FlowFuse for UNS" -image: /images/solutions/flowfuse-uns.png -problem: "Adopt a Unified Namespace without ripping out existing infrastructure. FlowFuse connects producers and consumers through MQTT with low-code flows." -nohero: true -meta: - title: "FlowFuse for the Unified Namespace" - description: "FlowFuse simplifies UNS adoption for manufacturing companies by providing a user-friendly, low-code platform for deploying and using data from a UNS." - keywords: "FlowFuse, UNS, Unified Namespace, manufacturing, data, data integration, data management, data visualization, data analysis, data-driven decisions, data silos, real-time data, collaboration, Node-RED, MQTT Broker, low-code, open-source, rapid implementation, seamless integration" ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} -{% from "components/cta/cta-contact-us.njk" import ctaContactUs %} -{% from "components/cta/cta-book-demo.njk" import ctaBookDemo %} - -
    - -
    -
    -
    -

    - FlowFuse for the Unified Namespace -

    -

    - FlowFuse simplifies UNS adoption for manufacturing companies by providing a user-friendly, low-code platform for deploying and using data from a UNS. -

    -
    - {% image "./images/solutions/ff-uns.png", "FlowFuse connected to many industrial devices", [400] %} -
    -
    - {{ ctaContactUs('primary', 'primary', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'primary', extraClass='min-h-[40px]') }} -
    -
    -
    - {% image "./images/solutions/ff-uns.png", "FlowFuse connected to many industrial devices", [400] %} -
    -
    -
    - - -
    -
    -

    Unlock the power of your real-time data

    -

    IT and data professionals are often challenged by the complexities of accessing and analyzing data scattered across disparate systems in manufacturing environments. UNS offers a solution to these challenges by providing a standardized way to access and utilize real-time data across your entire manufacturing operation.

    -
    - - {% set sections = [ - { - "svgPath": "components/icons/circle-stack.svg", - "title": "Break down data silos", - "description": "Access data from any source, regardless of its format or location and make it available through a central hub. " - }, - { - "svgPath": "components/icons/eye.svg", - "title": "Gain real-time visibility", - "description": "Monitor your operations with interactive visual dashboards." - }, - { - "svgPath": "components/icons/bolt.svg", - "title": "Make faster, data-driven decisions", - "description": "Analyze data from across your organization to identify gaps and optimize processes." - }, - { - "svgPath": "components/icons/lock-closed.svg", - "title": "Replace point-to-point connections", - "description": "Seamlessly share data across your entire operation." - }, - { - "svgPath": "components/icons/arrows-pointing-out.svg", - "title": "Improved collaboration", - "description": "Adapt data across different systems with minimal data loss or loss of context." - } - ] %} - -
    -

    With FlowFuse adopting UNS has never been faster or easier 

    -
    - {% for section in sections %} -
    -
    -
    -
    - {% include section.svgPath %} -
    -
    -
    -
    {{ section.title }}
    -
    -
    -
    -
    -

    {{ section.description | safe }}

    -
    -
    -
    - {% endfor %} -
    - -

    From Data Source to Application:
    - Streamline Your UNS Workflows with FlowFuse

    - {% image "./images/solutions/flowfuse-uns.png", "FlowFuse UNS Workflow", [1024] %} -
    -
    -
    - -
    -
    -

    The FlowFuse Advantage

    -
    - {% set sections = [ - { - "title": "Built-in adaptation layer", - "description": "Leverage FlowFuse's low-code platform to transform and make your data available for UNS." - }, - { - "title": "End-to-end UNS platform", - "description": "Everything you need to connect, manage, visualize and analyze your data in one place." - }, - { - "title": "Seamless integration", - "description": "Built-in MQTT Broker ready to use alongside your FlowFuse applications with robust - enterprise-grade features of the FlowFuse Platform." - }, - { - "title": "Rapid implementation", - "description": "Get up and running quickly on FlowFuse Cloud." - }, - { - "title": "Open-source", - "description": "Avoid vendor lock-in." - }, - { - "title": "Low-Code", - "description": "Empowering your teams to build custom solutions with ease." - } - ] %} - - {% for section in sections %} -
    -

    {{ section.title }}

    -

    {{ section.description }} -

    -
    - {% endfor %} -
    -
    -
    - -
    - -
    -

    Ready to simplify your UNS journey and unlock the power of your industrial data?

    -
    - {{ ctaBookDemo('primary', 'secondary', extraClass='min-h-[40px]') }} - {{ ctaSignUp(site, 'primary-outlined', 'secondary', extraClass='min-h-[40px]') }} -
    -
    - -
    -

    Learn about UNS

    -
    - - {% set sections = [ - { - "articles": [ - { - "title": "Introduction to UNS", - "url": "/blog/2023/12/introduction-to-unified-namespace/", - "image": "./blog/2023/12/images/introduction-to-uns.png", - "alt": "Graphics depicting a unified namespace." - }, - { - "title": "From ISA 95 towards the UNS", - "url": "/blog/2023/08/isa-95-automation-pyramid-to-unified-namespace/", - "image": "./blog/2023/08/images/UNS/UNS-Headline.svg", - "alt": "Graphics depicting the UNS related to the automation pyramid." - }, - { - "title": "Node-RED: The perfect adapter and middleware for the UNS", - "url": "/blog/2024/02/node-red-perfect-adapter-middleware-uns/", - "image": "./blog/2024/02/images/node-red-for-uns.png", - "alt": "Node-RED and the UNS" - }, - { - "title": "Building a Unified Namespace (UNS) with FlowFuse", - "url": "/blog/2024/11/building-uns-with-flowfuse/", - "image": "./blog/2024/11/images/building-uns-with-flowfuse.png", - "alt": "Graphics depicting a Unified Namespace with FlowFuse." - } - ] - }, - { - "articles": [ - { - "title": "Free whitepaper: UNS - Decoupling data producers and consumers", - "url": "/whitepaper/uns-decoupling-data-producers-and-consumers/", - "image": "./resources/images/whitepaper_uns.png", - "alt": "Graphics depicting the cover of the Whitepaper." - }, - { - "title": "Data Modeling: The Key to a Successful Unified Namespace", - "url": "/blog/2024/12/why-uns-need-data-modeling/", - "image": "./blog/2024/12/images/data-modeling-uns.png", - "alt": "Graphics depicting unified namespace data modeling." - }, - { - "title": "Selecting your UNS Broker", - "url": "/blog/2024/01/unified-namespace-what-broker/", - "image": "./blog/2024/01/images/broker-for-uns.png", - "alt": "Graphics displaying different broker logos." - }, - { - "title": "Unified Namespace: When to Use It, and When to Choose Something Else", - "url": "/blog/2024/01/unified-namespace-when-not-to-use/", - "image": "./blog/2024/01/images/when-not-to-use-the-uns.png", - "alt": "Graphics depicting unified namespace data modeling using FlowFuse." - } - ] - } - ] %} - {% for section in sections %} -
    -
    - {% for article in section.articles %} - -
  • -
    - {% image article.image, article.alt, [208] %} -
    - -
  • -
    - {% endfor %} -
    -
    - {% endfor %} -
    -
    -
    - - diff --git a/src/use-cases/use-cases.json b/src/use-cases/use-cases.json deleted file mode 100644 index eab4d428f3..0000000000 --- a/src/use-cases/use-cases.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "layout": "use-case", - "tags": [ - "use-case" - ] -}