diff --git a/nuxt/composables/useResolveHref.ts b/nuxt/composables/useResolveHref.ts index ee4d2da63b..03af1327ee 100644 --- a/nuxt/composables/useResolveHref.ts +++ b/nuxt/composables/useResolveHref.ts @@ -3,6 +3,9 @@ import site from '../../src/_data/site.json' // Mirrors the "resolveHref" Eleventy filter: an href of "site:" is a // pointer into site.json rather than a literal URL, so values like the job // board link stay single-sourced there instead of duplicated in chrome.json. +// A dotted key walks into a nested object, as SiteValue's `path` does. export function useResolveHref() { - return (href?: string) => href?.startsWith('site:') ? site[href.slice('site:'.length)] : href + return (href?: string): string | undefined => href?.startsWith('site:') + ? href.slice('site:'.length).split('.').reduce((value, key) => value?.[key], site) + : href } diff --git a/nuxt/content.config.ts b/nuxt/content.config.ts index e204031adc..23777fd213 100644 --- a/nuxt/content.config.ts +++ b/nuxt/content.config.ts @@ -268,6 +268,75 @@ export default defineContentConfig({ answer: z.string(), })).optional(), }).optional(), + + }) + }), + // The three competitor comparison pages. They shared the same seven sections with + // per-page copy, so they are one collection rendered by pages/vs/[slug].vue. + vsPages: defineCollection({ + type: 'data', + source: 'vs/*.yml', + schema: z.object({ + slug: z.string(), + // Display name, used in the table column and the section headings. + competitor: z.string(), + // Drives the hero border, the section icon badges and the table heading. + accent: z.enum(['orange', 'red', 'indigo']), + seoMeta: z.object({ + title: z.string(), + description: z.string(), + }), + heroTitle: z.string(), + heroImage: z.string(), + heroImageAlt: z.string(), + hero: z.object({ + buttonText: z.string(), + buttonLink: z.string(), + // PostHog `reference` prop on the migration-expert button. + buttonReference: z.string(), + }), + // The two tinted cards under the hero. /vs/kepware/ has none. + cards: z.array(z.object({ + title: z.string(), + content: z.string(), + })).optional(), + sectionTitle: z.string(), + sectionIntro: z.string().optional(), + sections: z.array(z.object({ + // A NavIcon registry key. + svgPath: z.string(), + title: z.string(), + description: z.string(), + })), + tableHeading: z.string(), + columnFlowFuse: z.string(), + columnCompetitor: z.string(), + table: z.array(z.object({ + feature: z.string(), + flowFuse: z.string(), + // Keyed by the competitor's own name in the .njk; one key here so one + // renderer can read every page. + competitor: z.string(), + })), + switch: z.object({ + title: z.string(), + content: z.array(z.string()), + // The .njk carried cta/ctaUrl here but rendered the same + // migration-expert button as the hero, so neither was read. + cta: z.string().optional(), + ctaUrl: z.string().optional(), + }), + socialProofText: z.string(), + cta: z.object({ + title: z.string(), + content: z.string(), + // The closing line ends on a link to the same meeting booker the hero + // button uses, so it is a field resolved through useResolveHref rather + // than an pasted into the prose. linkSuffix carries the full stop. + linkText: z.string(), + linkHref: z.string(), + linkSuffix: z.string().optional(), + }), }) }), ebooks: defineCollection({ diff --git a/nuxt/content/vs/ignition.yml b/nuxt/content/vs/ignition.yml new file mode 100644 index 0000000000..7afd6d6b53 --- /dev/null +++ b/nuxt/content/vs/ignition.yml @@ -0,0 +1,69 @@ +# Lifted from src/vs/ignition.njk (11ty). The three /vs/ pages shared the same seven sections +# with per-page copy, so they are one data collection rendered by pages/vs/[slug].vue. +slug: ignition +competitor: "Ignition" +accent: orange +heroImage: /vs/images/flowfuse-vs-ignition-hero.png +heroImageAlt: "Industrial engineer reviewing data pipelines on a laptop in a manufacturing facility" +heroTitle: "Modernize your Ignition stack without rebuilding everything" +seoMeta: + title: "A Modern Alternative to Ignition by Inductive Automation" + description: "FlowFuse is the cloud-native platform for teams running Ignition who want to build new applications without Java, Jython, or per-Gateway licensing. Connect OPC-UA and MQTT devices today, then migrate existing projects at your own pace." +hero: + buttonText: "Talk to a Migration Expert" + buttonLink: "site:meetings.salesRoundRobin" + buttonReference: "vs-ignition" +sectionTitle: "Why Industrial Teams Choose FlowFuse Instead of Ignition" +sections: + - svgPath: "cloud" + title: "Cloud-native by design" + description: "FlowFuse runs as a fully managed cloud platform, with no Java gateways to provision, patch, or operate. The same applications run identically at the edge, on-premises, or in the cloud." + - svgPath: "code-bracket" + title: "Low-code, drag-and-drop development" + description: "Build applications visually by wiring nodes together, with no scripting required for most use cases. Drop to JavaScript only when you need custom logic. FlowFuse Expert, our industrial-tuned AI copilot, takes it further: describe what you want in plain language and it assembles flows, wires nodes, and generates code in your workspace. No Java IDE, no proprietary Designer, no Jython." + - svgPath: "puzzle-piece" + title: "Open integration ecosystem" + description: "Connect to any device, API, or cloud service using thousands of community-contributed nodes, with MQTT, OPC-UA, Modbus, HTTP, and SQL available at no extra licensing cost." +table: + - feature: "Programming Model & Scripting" + flowFuse: "Low-code, drag-and-drop Node-RED. Build applications visually by connecting nodes, with JavaScript available for custom logic when you need it. Flows are human-readable, portable JSON that you can version-control, audit, and run anywhere." + competitor: "Proprietary Java-based Designer. Scripting uses Jython (Python 2.7). Inductive Automation maintains its own Jython 2.7 build, but Python 3 libraries with C extensions, which include most modern data-science and ML packages, do not run natively in it." + - feature: "Cloud & Managed Deployment" + flowFuse: "Fully managed SaaS. Nothing to provision or maintain. Build once and run the same application at the edge, on-premises, or in the cloud without changing your developer experience." + competitor: "On-premises first. Cloud deployments run on self-managed VMs or marketplace images, and there is no fully hosted Ignition SaaS. Ignition Cloud Edition ships without device drivers and cannot connect to PLCs directly; an on-prem Gateway or MQTT bridge handles device connectivity." + - feature: "MQTT & Protocol Costs" + flowFuse: "Included at no extra cost. MQTT, OPC-UA, Modbus, HTTP, and thousands of community integrations come with the platform itself. There's no separate module to buy for any of them." + competitor: "Core OPC-UA drivers are included; MQTT is a paid add-on. Bidirectional MQTT/Sparkplug runs on the Cirrus Link MQTT Engine and MQTT Transmission modules, sold within Inductive Automation's Enterprise Integration Solution Suite rather than the base platform." + - feature: "Developer Workflow & Version Control" + flowFuse: "DevOps-native. Git integration, team workspaces, and deployment pipelines are built in, so flows ship like modern software instead of backup files passed around manually." + competitor: "No native Git integration. Projects live in the Gateway and export as .gwbk backup files. Teams often rely on certified integrators for deployment rather than self-service pipelines." + - feature: "Multi-Site & Team Management" + flowFuse: "Built for many teams and sites. Manage every team, customer, and site from a single FlowFuse platform and switch between them in one UI, designed for managed service providers and multi-site operations." + competitor: "Each Gateway managed separately. Ignition centers on the individual Gateway, so multi-site estates are typically administered Gateway by Gateway rather than from one unified multi-tenant console." + - feature: "AI-Assisted Development" + flowFuse: "FlowFuse Expert, built in. Describe what you want in plain language and the copilot assembles nodes, wires them, and generates the underlying code right in the editor, grounded in your live data through Model Context Protocol (MCP)." + competitor: "No built-in AI copilot. Ignition ships no first-party natural-language flow or code generation; scripting is written by hand in Jython within the Designer. AI assistance is only available through third-party modules or external tools like GitHub Copilot, not as part of the platform." +switch: + title: How to Move Workloads from Ignition to FlowFuse + content: + - "Map what's costing you time today: We look at where Jython scripting, Gateway backups, or per-module licensing are slowing your team down, and identify which application makes sense to build in FlowFuse first." + - "Validate FlowFuse against your stack: Connect your OT assets over MQTT or OPC-UA and build the same application in FlowFuse. Compare the workflow directly rather than take our word for it." + - "Roll out gradually, with our team alongside you: Begin with new use cases and migrate existing applications whenever it makes sense for your plant." + cta: TALK TO A MIGRATION EXPERT + ctaUrl: "/book-demo" +cta: + title: "Exploring Alternatives to Ignition?" + content: "Most teams don't replace Ignition overnight, they start by building the next application somewhere else." + linkText: "Book a demo with a FlowFuse expert" + linkHref: "site:meetings.salesRoundRobin" + linkSuffix: "." +cards: + - title: "No per-protocol licensing" + content: "MQTT, OPC-UA, Modbus, and thousands of community nodes come standard with FlowFuse. Bidirectional MQTT on Ignition typically runs through the Cirrus Link modules, sold as part of Inductive Automation's Enterprise Integration Solution Suite rather than the base platform." + - title: "One console, every site" + content: "Ignition centers on the individual Gateway, so multi-site estates get administered one Gateway at a time. FlowFuse manages every team, customer, and site from a single platform, which matters most once you're running more than one facility." +sectionIntro: "Ignition's reputation was built on Java and Jython, two technologies most engineering teams have spent the last decade moving away from. FlowFuse runs the same edge connectivity, OPC-UA and MQTT integrations, and operational dashboards, without that legacy stack, through a managed cloud platform instead of a Gateway you patch yourself." +tableHeading: "FlowFuse and Ignition at a Glance" +columnFlowFuse: "FlowFuse (Open & Cloud-Native)" +columnCompetitor: "Ignition (Proprietary, On-Prem)" +socialProofText: "Trusted by industrial teams worldwide to modernize their OT‑IT data infrastructure and edge architectures." diff --git a/nuxt/content/vs/kepware.yml b/nuxt/content/vs/kepware.yml new file mode 100644 index 0000000000..c1fe92cc07 --- /dev/null +++ b/nuxt/content/vs/kepware.yml @@ -0,0 +1,63 @@ +# Lifted from src/vs/kepware.njk (11ty). The three /vs/ pages shared the same seven sections +# with per-page copy, so they are one data collection rendered by pages/vs/[slug].vue. +slug: kepware +competitor: "Kepware" +accent: indigo +heroImage: /vs/images/kepware.png +heroImageAlt: "Plant manager with a laptop in a factory setting" +heroTitle: "A Modern Alternative to Kepware" +seoMeta: + title: "A Modern Alternative to Kepware" + description: "FlowFuse is the open, cloud-ready solution engineers choose to replace legacy tools like PTC Kepware. Build faster, integrate easier, and modernize your industrial workflows, without vendor lock-in." +hero: + buttonText: "Talk to a Migration Expert" + buttonLink: "site:meetings.salesRoundRobin" + buttonReference: "vs-kepware" +sectionTitle: "Why Industrial Teams Are Moving Away from Kepware to FlowFuse" +sections: + - svgPath: "cloud" + title: "Built for the cloud" + description: "Run your automation flows wherever you need: edge, on-prem or cloud." + - svgPath: "arrows-pointing-out" + title: "Open & extensible" + description: "Based on open-source Node-RED. No more black boxes." + - svgPath: "puzzle-piece" + title: "Faster integrations" + description: "Native support for MQTT, OPC-UA, REST, and custom APIs." +table: + - feature: "Open-source base" + flowFuse: "Node-RED & OSS ecosystem" + competitor: "Proprietary stack" + - feature: "Vendor lock-in" + flowFuse: "None" + competitor: "Strong lock-in" + - feature: "Integration flexibility" + flowFuse: "MQTT, OPC-UA, REST, SQL…" + competitor: "Limited/custom connectors" + - feature: "License & scaling model" + flowFuse: "Transparent & usage-based" + competitor: "Expensive & tiered" + - feature: "Community and transparency" + flowFuse: "Active OSS community" + competitor: "Closed ecosystem" + - feature: "Future-proof architecture" + flowFuse: "Portable & cloud-ready" + competitor: "Uncertainty post-acquisition" +switch: + title: How to Switch from Kepware to FlowFuse + content: + - "Migration consultation: We analyze your current setup and challenges." + - "Try FlowFuse with your data: Build real flows using your industrial environment." + - "Go live with expert support: From pilot to full rollout, we’ve got your back." + cta: BOOK A DEMO + ctaUrl: "/book-demo" +cta: + title: "Ready to Leave Kepware Behind?" + content: "See how FlowFuse helps teams like yours modernize their industrial automation infrastructure, faster, more flexibly, and at lower cost." + linkText: "Book a Demo with a FlowFuse Expert" + linkHref: "site:meetings.salesRoundRobin" + linkSuffix: "." +tableHeading: "FlowFuse and Kepware at a Glance" +columnFlowFuse: "FlowFuse" +columnCompetitor: "Kepware" +socialProofText: "Trusted by industrial teams worldwide to modernize their OT‑IT data infrastructure and edge architectures." diff --git a/nuxt/content/vs/litmus.yml b/nuxt/content/vs/litmus.yml new file mode 100644 index 0000000000..588428f24f --- /dev/null +++ b/nuxt/content/vs/litmus.yml @@ -0,0 +1,66 @@ +# Lifted from src/vs/litmus.njk (11ty). The three /vs/ pages shared the same seven sections +# with per-page copy, so they are one data collection rendered by pages/vs/[slug].vue. +slug: litmus +competitor: "Litmus" +accent: red +heroImage: /vs/images/flowfuse-vs-litmus-hero.png +heroImageAlt: "FlowFuse vs Litmus Hero Image" +heroTitle: "A Flexible Alternative to Litmus" +seoMeta: + title: "A Flexible Alternative to Litmus" + description: "FlowFuse is an open, cloud-ready platform that industrial teams choose as an alternative to Litmus. Build faster, stay flexible, and scale Industrial AI on your terms, without unnecessary lock-in." +hero: + buttonText: "Talk to a Migration Expert" + buttonLink: "site:meetings.salesRoundRobin" + buttonReference: "vs-litmus" +sectionTitle: "Why Industrial Teams Consider FlowFuse Instead of Litmus" +sections: + - svgPath: "cube-transparent" + title: "Built for open architectures" + description: "Run your Industrial IoT and AI workloads at the edge, on-premise, or in the cloud, leveraging maximum flexibility for deployment." + - svgPath: "squares-plus" + title: "Open & extensible" + description: "Built on open-source Node-RED so engineering teams can integrate a wide range of OT assets, IT systems, and AI services with full visibility into every flow." + - svgPath: "link" + title: "Fast integrations" + description: "Accelerate time from prototype to production and eliminate glue code with native support for MQTT, OPC-UA, REST APIs, SQL targets, and UNS-style architectures." +table: + - feature: "Foundation & Governance" + flowFuse: "Open-source (Node-RED). Full transparency with human-readable JSON flows. Users own, inspect, and govern every line of logic." + competitor: "Proprietary. All-in-one 'black box' stack. Governance and visibility are limited to what the vendor's tools allow." + - feature: "Deployment & Extensibility" + flowFuse: "Infrastructure agnostic. Runs on edge, cloud, or on-prem. Extendable via plain JavaScript/APIs; your team owns the logic." + competitor: "Platform-dictated. Optimized for large rollouts, but architectural decisions and customization are bounded by the ecosystem." + - feature: "Integration & Connectivity" + flowFuse: "Unrestricted. 5,000+ community nodes + native MQTT, OPC-UA, and UNS. Connect to anything without vendor roadmaps." + competitor: "Pre-built. Offers connectors for major platforms, but limited to the specific integrations Litmus has prioritized." + - feature: "Industrial AI Strategy" + flowFuse: "Agnostic. Bring your own models and services. Your AI strategy remains flexible as the market evolves." + competitor: "Opinionated. Fast to start with an integrated stack, but your AI choices are tied to the vendor's specific roadmap." + - feature: "Vendor Lock-in Risk" + flowFuse: "Zero. Fully portable, version-controlled code that is never held hostage by a single vendor." + competitor: "High. Requires full buy-in to a single vendor stack for connectivity, analytics, and AI." +switch: + title: How to Move Workloads from Litmus to FlowFuse + content: + - "Migration consultation: We review your current Litmus deployment and data flows to propose a FlowFuse architecture that preserves requirements while increasing openness." + - "Try FlowFuse with your data: Connect your OT assets and replicate key pipelines in a controlled pilot to verify performance and operator experience before you commit." + - "Gradual rollout with expert support: We provide expert support from the initial pilot through multi-site rollout, helping your team standardize patterns and train engineers." + cta: TALK TO A MIGRATION EXPERT + ctaUrl: "/book-demo" +cta: + title: "Exploring Alternatives to Litmus?" + content: "Discover how FlowFuse can help your team modernize its industrial edge and data infrastructure with an open, flexible platform that complements your existing AI and analytics strategy." + linkText: "Book a Demo with a FlowFuse Expert" + linkHref: "site:meetings.salesRoundRobin" + linkSuffix: "." +cards: + - title: "Open, flexible edge architecture" + content: "Customers can run FlowFuse where it makes sense, at the edge, on-premises, or in the cloud, and integrate with a wide range of clouds, data platforms, and AI services, rather than a single, tightly coupled stack." + - title: "Reduced vendor lock-in and higher portability" + content: "Because flows remain Node-RED-compatible and rely on open standards, organizations can evolve their Industrial AI strategy over time without being constrained by a monolithic, proprietary edge data platform." +sectionIntro: "Industrial organizations evaluating Litmus often explore FlowFuse for a more open, modular approach to edge connectivity, data orchestration, and Industrial AI workloads.​" +tableHeading: "FlowFuse and Litmus at a Glance" +columnFlowFuse: "FlowFuse (Open & Flexible)" +columnCompetitor: "Litmus (Proprietary & Unified)" +socialProofText: "Trusted by industrial teams worldwide to modernize their OT‑IT data infrastructure and edge architectures." diff --git a/nuxt/nuxt.config.ts b/nuxt/nuxt.config.ts index 56ccb724cf..fb4e072641 100644 --- a/nuxt/nuxt.config.ts +++ b/nuxt/nuxt.config.ts @@ -63,6 +63,17 @@ function collectWebinarRoutes(dir: string, basePath: string): string[] { return routes } +// A data collection whose every entry is a page, routed by its `slug` field. +function collectSlugRoutes (dir: string, basePath: string): string[] { + return readEntries(dir).map(entry => `${basePath}/${entry.slug}/`) +} + +function readEntries (dir: string): Array> { + return readdirSync(dir) + .filter(file => file.endsWith('.yml')) + .map(file => parseYaml(readFileSync(join(dir, file), 'utf8'))) +} + // 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 @@ -263,7 +274,15 @@ export default defineNuxtConfig({ // field on the collections instead. '/api/__sitemap__/content-urls', ], - urls: blogAuthorRoutes.map(loc => ({ loc, priority: 0.6 })), + urls: [ + ...blogAuthorRoutes.map(loc => ({ loc, priority: 0.6 })), + // /vs// 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). The three + // 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 })), + ], exclude: ['/_studio/**', '/api/**'], }, @@ -415,6 +434,8 @@ export default defineNuxtConfig({ ...collectProductRoutes(join(__dirname, 'content/products')), '/webinars/', ...collectWebinarRoutes(join(__dirname, '../src/webinars'), '/webinars'), + + ...collectSlugRoutes(join(__dirname, 'content/vs'), '/vs'), // 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/vs/[slug].vue b/nuxt/pages/vs/[slug].vue new file mode 100644 index 0000000000..0fdb96cc71 --- /dev/null +++ b/nuxt/pages/vs/[slug].vue @@ -0,0 +1,223 @@ + + + diff --git a/nuxt/server/middleware/legacy.ts b/nuxt/server/middleware/legacy.ts index f1ae2474d0..110f4ca70c 100644 --- a/nuxt/server/middleware/legacy.ts +++ b/nuxt/server/middleware/legacy.ts @@ -15,13 +15,13 @@ 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'] +const NUXT_PREFIXES = ['/handbook', '/ebooks', '/whitepaper', '/pricing', '/docs', '/changelog', '/application-guide', '/blog', '/product', '/customer-stories', '/thank-you', '/resources', '/webinars', '/free-consultation', '/vs'] // 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: // / (homepage), /about, /blueprints, /careers, /community, /events // /free-consultation, /industries, /landing, /node-red, /partners, /platform, -// /use-cases, /vs, /webinars +// /use-cases, /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, @@ -60,6 +60,13 @@ export default defineEventHandler(async (event) => { // than a splat. if (normalised !== '/node-red' && normalised.startsWith('/node-red/')) return + // src/vs/images/** are still 11ty-owned files: they only reach nuxt/public/ through the + // passthrough in a production build, so dev has to ask 11ty for them even though /vs is + // a Nuxt prefix now. + if (/^\/vs\/images\//.test(normalised)) { + return proxyRequest(event, `http://localhost:8080${path}`) + } + // Let Nuxt handle migrated path prefixes if (NUXT_PREFIXES.some(prefix => normalised === prefix || normalised.startsWith(prefix + '/'))) return diff --git a/nuxt/utils/navIcons.ts b/nuxt/utils/navIcons.ts index 82b725c316..9f41efcf7e 100644 --- a/nuxt/utils/navIcons.ts +++ b/nuxt/utils/navIcons.ts @@ -21,7 +21,11 @@ import iCar from '../../src/_includes/components/icons/car.svg?raw' import iCase from '../../src/_includes/components/icons/case.svg?raw' import iCertificate from '../../src/_includes/components/icons/certificate.svg?raw' import iChart from '../../src/_includes/components/icons/chart.svg?raw' + +import iCloud from '../../src/_includes/components/icons/cloud.svg?raw' import iChat from '../../src/_includes/components/icons/chat.svg?raw' + +import iCubeTransparent from '../../src/_includes/components/icons/cube-transparent.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' @@ -73,6 +77,9 @@ export const navIcons: Record = { 'certificate': iCertificate, 'chart': iChart, 'chat': iChat, + + 'cloud': iCloud, + 'cube-transparent': iCubeTransparent, 'chat-bubble-left-right-sm': iChatBubbleLeftRightSm, 'check-badge': iCheckBadge, 'chip': iChip, diff --git a/src/_data/site.json b/src/_data/site.json index 8083d72047..243ec1dee6 100644 --- a/src/_data/site.json +++ b/src/_data/site.json @@ -2,6 +2,9 @@ "baseURL": "https://flowfuse.com", "appURL": "https://app.flowfuse.com", "jobBoard": "https://boards.greenhouse.io/flowfuse", + "meetings": { + "salesRoundRobin": "https://meetings-eu1.hubspot.com/michael-davis/round-robin-sales-team" + }, "messaging": { "tagLine": "The Edge-Native Platform for Industrial Applications", "heroTagLine": "The Edge-Native Platform for Industrial IT, OT, and IIOT Applications", diff --git a/src/vs/ignition.njk b/src/vs/ignition.njk deleted file mode 100644 index 930d00a702..0000000000 --- a/src/vs/ignition.njk +++ /dev/null @@ -1,213 +0,0 @@ ---- -layout: page -nohero: true -image: /vs/images/flowfuse-vs-ignition-hero.png -imageDescription: "Industrial engineer reviewing data pipelines on a laptop in a manufacturing facility" -heroTitle: "Modernize your Ignition stack without rebuilding everything" -meta: - title: "A Modern Alternative to Ignition by Inductive Automation" - description: "FlowFuse is the cloud-native platform for teams running Ignition who want to build new applications without Java, Jython, or per-Gateway licensing. Connect OPC-UA and MQTT devices today, then migrate existing projects at your own pace." -hero: - buttonText: "Talk to a Migration Expert" - buttonLink: "https://meetings-eu1.hubspot.com/michael-davis/round-robin-michael-omar-kasheef?utm_campa[…]113138546&utm_content=113138546&utm_source=hs_automation" - buttonReference: "vs-ignition" -sectionTitle: "Why Industrial Teams Choose FlowFuse Instead of Ignition" -sectionSubtitle: "Cloud-native. Open-source. Low-code by default." -sections: - - svgPath: "components/icons/cloud.svg" - title: "Cloud-native by design" - description: "FlowFuse runs as a fully managed cloud platform, with no Java gateways to provision, patch, or operate. The same applications run identically at the edge, on-premises, or in the cloud." - - svgPath: "components/icons/code-bracket.svg" - title: "Low-code, drag-and-drop development" - description: "Build applications visually by wiring nodes together, with no scripting required for most use cases. Drop to JavaScript only when you need custom logic. FlowFuse Expert, our industrial-tuned AI copilot, takes it further: describe what you want in plain language and it assembles flows, wires nodes, and generates code in your workspace. No Java IDE, no proprietary Designer, no Jython." - - svgPath: "components/icons/puzzle-piece.svg" - title: "Open integration ecosystem" - description: "Connect to any device, API, or cloud service using thousands of community-contributed nodes, with MQTT, OPC-UA, Modbus, HTTP, and SQL available at no extra licensing cost." -table: - - feature: "Programming Model & Scripting" - flowFuse: "Low-code, drag-and-drop Node-RED. Build applications visually by connecting nodes, with JavaScript available for custom logic when you need it. Flows are human-readable, portable JSON that you can version-control, audit, and run anywhere." - ignition: "Proprietary Java-based Designer. Scripting uses Jython (Python 2.7). Inductive Automation maintains its own Jython 2.7 build, but Python 3 libraries with C extensions, which include most modern data-science and ML packages, do not run natively in it." - - feature: "Cloud & Managed Deployment" - flowFuse: "Fully managed SaaS. Nothing to provision or maintain. Build once and run the same application at the edge, on-premises, or in the cloud without changing your developer experience." - ignition: "On-premises first. Cloud deployments run on self-managed VMs or marketplace images, and there is no fully hosted Ignition SaaS. Ignition Cloud Edition ships without device drivers and cannot connect to PLCs directly; an on-prem Gateway or MQTT bridge handles device connectivity." - - feature: "MQTT & Protocol Costs" - flowFuse: "Included at no extra cost. MQTT, OPC-UA, Modbus, HTTP, and thousands of community integrations come with the platform itself. There's no separate module to buy for any of them." - ignition: "Core OPC-UA drivers are included; MQTT is a paid add-on. Bidirectional MQTT/Sparkplug runs on the Cirrus Link MQTT Engine and MQTT Transmission modules, sold within Inductive Automation's Enterprise Integration Solution Suite rather than the base platform." - - feature: "Developer Workflow & Version Control" - flowFuse: "DevOps-native. Git integration, team workspaces, and deployment pipelines are built in, so flows ship like modern software instead of backup files passed around manually." - ignition: "No native Git integration. Projects live in the Gateway and export as .gwbk backup files. Teams often rely on certified integrators for deployment rather than self-service pipelines." - - feature: "Multi-Site & Team Management" - flowFuse: "Built for many teams and sites. Manage every team, customer, and site from a single FlowFuse platform and switch between them in one UI, designed for managed service providers and multi-site operations." - ignition: "Each Gateway managed separately. Ignition centers on the individual Gateway, so multi-site estates are typically administered Gateway by Gateway rather than from one unified multi-tenant console." - - feature: "AI-Assisted Development" - flowFuse: "FlowFuse Expert, built in. Describe what you want in plain language and the copilot assembles nodes, wires them, and generates the underlying code right in the editor, grounded in your live data through Model Context Protocol (MCP)." - ignition: "No built-in AI copilot. Ignition ships no first-party natural-language flow or code generation; scripting is written by hand in Jython within the Designer. AI assistance is only available through third-party modules or external tools like GitHub Copilot, not as part of the platform." -switch: - title: How to Move Workloads from Ignition to FlowFuse - content: - - "Map what's costing you time today: We look at where Jython scripting, Gateway backups, or per-module licensing are slowing your team down, and identify which application makes sense to build in FlowFuse first." - - "Validate FlowFuse against your stack: Connect your OT assets over MQTT or OPC-UA and build the same application in FlowFuse. Compare the workflow directly rather than take our word for it." - - "Roll out gradually, with our team alongside you: Begin with new use cases and migrate existing applications whenever it makes sense for your plant." - cta: TALK TO A MIGRATION EXPERT - ctaUrl: "/book-demo" -cta: - title: "Exploring Alternatives to Ignition?" - content: "Most teams don't replace Ignition overnight, they start by building the next application somewhere else. Book a demo with a FlowFuse expert." ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} - -
-
-
-
-

- {{ heroTitle | safe }} -

-

- {{ meta.description }} -

- -
-
-
- {% set imageSrc = ["./", image ] | join %} - {% image imageSrc, imageDescription, [496] %} -
-
-
- {{ migrationExpertButton(false) }} - {{ ctaSignUp(site, 'ghost', 'hero-mobile', icon=true, extraClass='flex flex-col w-full m-auto sm:mt-12') }} -
-
-
-
- - {% set blueCards = [ - {"title": "No per-protocol licensing", - "content": "MQTT, OPC-UA, Modbus, and thousands of community nodes come standard with FlowFuse. Bidirectional MQTT on Ignition typically runs through the Cirrus Link modules, sold as part of Inductive Automation's Enterprise Integration Solution Suite rather than the base platform."}, - {"title": "One console, every site", - "content": "Ignition centers on the individual Gateway, so multi-site estates get administered one Gateway at a time. FlowFuse manages every team, customer, and site from a single platform, which matters most once you're running more than one facility."} - ] %} -
- {% for card in blueCards %} -
-

{{ card.title }}

-

{{ card.content | safe }}

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

{{ sectionTitle | safe }}

-

Ignition's reputation was built on Java and Jython, two technologies most engineering teams have spent the last decade moving away from. FlowFuse runs the same edge connectivity, OPC-UA and MQTT integrations, and operational dashboards, without that legacy stack, through a managed cloud platform instead of a Gateway you patch yourself.

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

-
{{ section.title }}
-

-
-
-
-

{{ section.description | safe }}

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

FlowFuse and Ignition at a Glance

-
-
- - - - - - - - - - {% for item in table %} - - - - - - {% endfor %} - -
- Features - - FlowFuse (Open & Cloud-Native) - - Ignition (Proprietary, On-Prem) -
- {{ item.feature }} - - {{ item.flowFuse | safe }} - - {{ item.ignition | safe }} -
-
-
-
-
-
- -
-

{{ switch.title | safe }}

-
-
    - {% for item in switch.content %} -
  1. {{ item | safe}}
  2. - {% endfor %} -
-
-
- {{ migrationExpertButton() }} -
-
-
-
-
- -
-
- {% set socialProofEyebrow = "Trusted by industrial teams worldwide to modernize their OT‑IT data infrastructure and edge architectures." %} - {% include "social-proof.njk" %} -
-
- -
-

{{ cta.title | safe }}

-

{{ cta.content | safe }}

-
-
diff --git a/src/vs/kepware.njk b/src/vs/kepware.njk deleted file mode 100644 index 601543e807..0000000000 --- a/src/vs/kepware.njk +++ /dev/null @@ -1,186 +0,0 @@ ---- -layout: page -nohero: true -image: /vs/images/kepware.png -imageDescription: "Plant manager with a laptop in a factory setting" -heroTitle: "A Modern Alternative to Kepware" -meta: - title: "A Modern Alternative to Kepware" - description: "FlowFuse is the open, cloud-ready solution engineers choose to replace legacy tools like PTC Kepware. Build faster, integrate easier, and modernize your industrial workflows, without vendor lock-in." -hero: - buttonText: "Talk to a Migration Expert" - buttonLink: "https://meetings-eu1.hubspot.com/michael-davis/round-robin-michael-omar-kasheef?utm_campa[…]113138546&utm_content=113138546&utm_source=hs_automation" - buttonReference: "vs-kepware" -sectionTitle: "Why Industrial Teams Are Moving Away from Kepware to FlowFuse" -sectionSubtitle: "Unlock Data. Accelerate Results. Scale with Confidence." -sections: - - svgPath: "components/icons/cloud.svg" - title: "Built for the cloud" - description: "Run your automation flows wherever you need: edge, on-prem or cloud." - - svgPath: "components/icons/arrows-pointing-out.svg" - title: "Open & extensible" - description: "Based on open-source Node-RED. No more black boxes." - - svgPath: "components/icons/puzzle-piece.svg" - title: "Faster integrations" - description: "Native support for MQTT, OPC-UA, REST, and custom APIs." -table: - - feature: "Open-source base" - flowFuse: "Node-RED & OSS ecosystem" - Kepware: "Proprietary stack" - - feature: "Vendor lock-in" - flowFuse: "None" - Kepware: "Strong lock-in" - - feature: "Integration flexibility" - flowFuse: "MQTT, OPC-UA, REST, SQL…" - Kepware: "Limited/custom connectors" - - feature: "License & scaling model" - flowFuse: "Transparent & usage-based" - Kepware: "Expensive & tiered" - - feature: "Community and transparency" - flowFuse: "Active OSS community" - Kepware: "Closed ecosystem" - - feature: "Future-proof architecture" - flowFuse: "Portable & cloud-ready" - Kepware: "Uncertainty post-acquisition" -switch: - title: How to Switch from Kepware to FlowFuse - content: - - "Migration consultation: We analyze your current setup and challenges." - - "Try FlowFuse with your data: Build real flows using your industrial environment." - - "Go live with expert support: From pilot to full rollout, we’ve got your back." - cta: BOOK A DEMO - ctaUrl: "/book-demo" -cta: - title: "Ready to Leave Kepware Behind?" - content: "See how FlowFuse helps teams like yours modernize their industrial automation infrastructure, faster, more flexibly, and at lower cost. Book a Demo with a FlowFuse Expert." ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} - -
-
-
-
-

- {{ heroTitle | safe }} -

-

- {{ meta.description }} -

- -
-
- - -
-
- {{ migrationExpertButton(false) }} - {{ ctaSignUp(site, 'ghost', 'hero-mobile', icon=true, extraClass='flex flex-col w-full m-auto sm:mt-12') }} -
-
-
- -
-
-

{{ sectionTitle | safe }}

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

-
{{ section.title }}
-

-
-
-
-

{{ section.description | safe }}

-
-
-
- {% endfor %} -
- -
- - - - - - - - - - {% for item in table %} - - - - - - {% endfor %} - -
- Features - - FlowFuse - - Kepware -
- {{ item.feature }} - -
-
{% include "components/icons/check-circle.svg" %}
- {{ item.flowFuse }} -
-
-
-
{% include "components/icons/x-circle.svg" %}
- {{ item.Kepware }} -
-
-
- -
-

{{ switch.title | safe }}

-
-
    - {% for item in switch.content %} -
  1. {{ item | safe}}
  2. - {% endfor %} -
-
-
- {{ migrationExpertButton() }} -
-
-
-
-
-
- -
-
- {% include "social-proof.njk" %} -
-
- -
-

{{ cta.title | safe }}

-

{{ cta.content | safe }}

-
-
diff --git a/src/vs/litmus.njk b/src/vs/litmus.njk deleted file mode 100644 index 5f822d1a27..0000000000 --- a/src/vs/litmus.njk +++ /dev/null @@ -1,210 +0,0 @@ ---- -layout: page -nohero: true -image: /vs/images/flowfuse-vs-litmus-hero.png -imageDescription: "FlowFuse vs Litmus Hero Image" -heroTitle: "A Flexible Alternative to Litmus" -meta: - title: "A Flexible Alternative to Litmus" - description: "FlowFuse is an open, cloud-ready platform that industrial teams choose as an alternative to Litmus. Build faster, stay flexible, and scale Industrial AI on your terms, without unnecessary lock-in." -hero: - buttonText: "Talk to a Migration Expert" - buttonLink: "https://meetings-eu1.hubspot.com/michael-davis/round-robin-michael-omar-kasheef?utm_campa[…]113138546&utm_content=113138546&utm_source=hs_automation" - buttonReference: "vs-litmus" -sectionTitle: "Why Industrial Teams Consider FlowFuse Instead of Litmus" -sectionSubtitle: "Open, flexible edge architecture. Reduced vendor lock-in and higher portability." -sections: - - svgPath: "components/icons/cube-transparent.svg" - title: "Built for open architectures" - description: "Run your Industrial IoT and AI workloads at the edge, on-premise, or in the cloud, leveraging maximum flexibility for deployment." - - svgPath: "components/icons/squares-plus.svg" - title: "Open & extensible" - description: "Built on open-source Node-RED so engineering teams can integrate a wide range of OT assets, IT systems, and AI services with full visibility into every flow." - - svgPath: "components/icons/link.svg" - title: "Fast integrations" - description: "Accelerate time from prototype to production and eliminate glue code with native support for MQTT, OPC-UA, REST APIs, SQL targets, and UNS-style architectures." -table: - - feature: "Foundation & Governance" - flowFuse: "Open-source (Node-RED). Full transparency with human-readable JSON flows. Users own, inspect, and govern every line of logic." - litmus: "Proprietary. All-in-one 'black box' stack. Governance and visibility are limited to what the vendor's tools allow." - - feature: "Deployment & Extensibility" - flowFuse: "Infrastructure agnostic. Runs on edge, cloud, or on-prem. Extendable via plain JavaScript/APIs; your team owns the logic." - litmus: "Platform-dictated. Optimized for large rollouts, but architectural decisions and customization are bounded by the ecosystem." - - feature: "Integration & Connectivity" - flowFuse: "Unrestricted. 5,000+ community nodes + native MQTT, OPC-UA, and UNS. Connect to anything without vendor roadmaps." - litmus: "Pre-built. Offers connectors for major platforms, but limited to the specific integrations Litmus has prioritized." - - feature: "Industrial AI Strategy" - flowFuse: "Agnostic. Bring your own models and services. Your AI strategy remains flexible as the market evolves." - litmus: "Opinionated. Fast to start with an integrated stack, but your AI choices are tied to the vendor's specific roadmap." - - feature: "Vendor Lock-in Risk" - flowFuse: "Zero. Fully portable, version-controlled code that is never held hostage by a single vendor." - litmus: "High. Requires full buy-in to a single vendor stack for connectivity, analytics, and AI." -switch: - title: How to Move Workloads from Litmus to FlowFuse - content: - - "Migration consultation: We review your current Litmus deployment and data flows to propose a FlowFuse architecture that preserves requirements while increasing openness." - - "Try FlowFuse with your data: Connect your OT assets and replicate key pipelines in a controlled pilot to verify performance and operator experience before you commit." - - "Gradual rollout with expert support: We provide expert support from the initial pilot through multi-site rollout, helping your team standardize patterns and train engineers." - cta: TALK TO A MIGRATION EXPERT - ctaUrl: "/book-demo" -cta: - title: "Exploring Alternatives to Litmus?" - content: "Discover how FlowFuse can help your team modernize its industrial edge and data infrastructure with an open, flexible platform that complements your existing AI and analytics strategy. Book a Demo with a FlowFuse Expert." ---- -{% from "components/cta/cta-sign-up.njk" import ctaSignUp %} - -
-
-
-
-

- {{ heroTitle | safe }} -

-

- {{ meta.description }} -

- -
-
-
- {% set imageSrc = ["./", image ] | join %} - {% image imageSrc, imageDescription, [496] %} -
-
-
- {{ migrationExpertButton(false) }} - {{ ctaSignUp(site, 'ghost', 'hero-mobile', icon=true, extraClass='flex flex-col w-full m-auto sm:mt-12') }} -
-
-
-
- - {% set blueCards = [ - {"title": "Open, flexible edge architecture", - "content": "Customers can run FlowFuse where it makes sense, at the edge, on-premises, or in the cloud, and integrate with a wide range of clouds, data platforms, and AI services, rather than a single, tightly coupled stack."}, - {"title": "Reduced vendor lock-in and higher portability", - "content": "Because flows remain Node-RED-compatible and rely on open standards, organizations can evolve their Industrial AI strategy over time without being constrained by a monolithic, proprietary edge data platform."} - ] %} -
- {% for card in blueCards %} -
-

{{ card.title }}

-

{{ card.content | safe }}

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

{{ sectionTitle | safe }}

-

Industrial organizations evaluating Litmus often explore FlowFuse for a more open, modular approach to edge connectivity, data orchestration, and Industrial AI workloads.​

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

-
{{ section.title }}
-

-
-
-
-

{{ section.description | safe }}

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

FlowFuse and Litmus at a Glance

-
-
- - - - - - - - - - {% for item in table %} - - - - - - {% endfor %} - -
- Features - - FlowFuse (Open & Flexible) - - Litmus (Proprietary & Unified) -
- {{ item.feature }} - - {{ item.flowFuse | safe }} - - {{ item.litmus | safe }} -
-
-
-
-
-
- -
-

{{ switch.title | safe }}

-
-
    - {% for item in switch.content %} -
  1. {{ item | safe}}
  2. - {% endfor %} -
-
-
- {{ migrationExpertButton() }} -
-
-
-
-
- -
-
- {% set socialProofEyebrow = "Trusted by industrial teams worldwide to modernize their OT‑IT data infrastructure and edge architectures." %} - {% include "social-proof.njk" %} -
-
- -
-

{{ cta.title | safe }}

-

{{ cta.content | safe }}

-
-