From 0355915ca0d0ad9f9da90d1f40fd8341368c849d Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Fri, 8 May 2026 13:07:21 -0700 Subject: [PATCH 1/9] nuxt: migrate /privacy-policy page from 11ty Same pattern as /terms: static page with no data dependencies moved to a Nuxt route so 11ty no longer owns it. - pages/privacy-policy.vue: full legal content with noindex meta - legacy.ts: add /privacy-policy to NUXT_ROUTES - nuxt.config.ts: add /privacy-policy to prerender routes - src/privacy-policy.md: removed (Nuxt owns the route now) Co-Authored-By: Claude Sonnet 4.6 --- nuxt/nuxt.config.ts | 2 +- nuxt/pages/privacy-policy.vue | 152 +++++++++++++++++++++++++++++++ nuxt/server/middleware/legacy.ts | 2 +- src/privacy-policy.md | 140 ---------------------------- 4 files changed, 154 insertions(+), 142 deletions(-) create mode 100644 nuxt/pages/privacy-policy.vue delete mode 100644 src/privacy-policy.md diff --git a/nuxt/nuxt.config.ts b/nuxt/nuxt.config.ts index 1e03ad2521..6591413a7b 100644 --- a/nuxt/nuxt.config.ts +++ b/nuxt/nuxt.config.ts @@ -24,7 +24,7 @@ export default defineNuxtConfig({ nitro: { preset: 'static', prerender: { - routes: ['/terms'], + routes: ['/terms', '/privacy-policy'], crawlLinks: false } }, diff --git a/nuxt/pages/privacy-policy.vue b/nuxt/pages/privacy-policy.vue new file mode 100644 index 0000000000..d84df23f54 --- /dev/null +++ b/nuxt/pages/privacy-policy.vue @@ -0,0 +1,152 @@ + + + diff --git a/nuxt/server/middleware/legacy.ts b/nuxt/server/middleware/legacy.ts index 2b123c7883..a35b93a34d 100644 --- a/nuxt/server/middleware/legacy.ts +++ b/nuxt/server/middleware/legacy.ts @@ -2,7 +2,7 @@ import { proxyRequest } from 'h3' // Routes that are handled by Nuxt pages (not proxied to 11ty). // Extend this list as pages are migrated. -const NUXT_ROUTES = new Set(['/terms', '/terms/']) +const NUXT_ROUTES = new Set(['/terms', '/terms/', '/privacy-policy', '/privacy-policy/']) export default defineEventHandler(async (event) => { if (process.env.NODE_ENV !== 'development') return diff --git a/src/privacy-policy.md b/src/privacy-policy.md deleted file mode 100644 index 12dd74d1e9..0000000000 --- a/src/privacy-policy.md +++ /dev/null @@ -1,140 +0,0 @@ ---- -layout: nohero -sitemapPriority: 0.7 -meta: - title: Privacy Policy ---- - -
- -# Privacy Policy - -This Privacy Policy describes the privacy practices of FlowFuse Inc (**“FlowFuse”**, **“we”**, **“us”** or **“our”**) and how we handle personal information that we collect through our digital properties that link to this Privacy Policy, including our website, (the **“Service”**), as well as through social media, our marketing activities, our events and other activities described in this policy. - -At the time we collect personal information, we may provide additional or supplemental privacy notices to individuals for specific services and personal information processing activities. - -Our Service is designed for businesses and their representatives. We do not offer products or services for use by individuals for their personal, family or household purposes. Accordingly, we treat all personal information we collect as pertaining to individuals in their capacities as business representatives and not their individual capacities. - -## Index - - - Personal information we collect - - How we use your personal information - - How we share your personal information - - Your choices - - Other sites and services - - Security - - International data transfer - - Children - - Changes to this Privacy Policy - - How to contact us - -## Personal information we collect - -**Information you provide to us.** Personal information you may provide to us through the Service or otherwise, such as when you view our website or contact us includes: - - - **Contact data**, such as your first and last name, email address, mailing address, professional title and company name, and phone number. - - **Communications data**, based on our exchanges with you, including when you contact us with questions or feedback, through the Service, social media, or otherwise. - - **Marketing data**, such as your preferences for receiving our marketing communications and details about your engagement with them. - - **Job application data**, such as professional credentials, skills, educational and work history, personal website, immigration status, criminal history, information that may be included on a resume or curriculum vitae as well as in a cover letter, and any other information you may otherwise provide us through a job application or interview. This may also include diversity information. - - **Other data** not specifically listed here, which we will use as described in this Privacy Policy or as otherwise disclosed at the time of collection. - -**Third-party sources.** We may combine personal information we receive from you with personal information we obtain from other sources, such as: - - - - **Public sources**, such as public records and other publicly available sources. - - **Private sources**, such as data providers and data licensors that may provide demographic and other information as well as social media platforms. - -**Automatic data collection.** We, our service providers, and our business partners may automatically log information about you, your computer or mobile device, and your interaction over time with the Service, our communications and other online services, such as: - - - - **Device data**, such as your computer’s or mobile device’s operating system type and version, manufacturer and model, browser type, screen resolution, RAM and disk size, CPU usage, device type (e.g., phone, tablet), IP address, unique identifiers, language settings, mobile device carrier, radio/network information (e.g., Wi-Fi, LTE, 3G), and general location information such as city, state or geographic area. - - **Online activity data**, such as pages or screens you viewed, how long you spent on a page or screen, the website you visited before browsing to the Service, navigation paths between pages or screens, information about your activity on a page or screen, access times and duration of access, and whether you have opened our marketing emails or clicked links within them. - -**Cookies and similar technologies**. Like many online services, we, our service providers, and our business partners may use the following technologies: - - - - **Cookies**, which are text files that websites store on a visitor‘s device to uniquely identify the visitor’s browser or to store information or settings in the browser for the purpose of helping you navigate between pages efficiently, remembering your preferences, enabling functionality, helping us understand user activity and patterns, and facilitating analytics. - - **Web beacons**, also known as pixel tags or clear GIFs, which are used to demonstrate that a webpage or email was accessed or opened, or that certain content was viewed or clicked. - -**Data about others**. Users of the Service may have the opportunity to refer friends or other contacts to us and share their contact information with us. Please do not refer someone to us or share their contact information with us unless you have their permission to do so. - -## How we use your personal information - -We may use your personal information for the following purposes or as otherwise described at the time of collection: - -**Service delivery.** We may use your personal information to: - - - - provide, operate and improve the Service and our business, including researching prospective and current portfolio companies and financing them; - - communicate with you about the Service, including by sending announcements, updates, security alerts, and support and administrative messages; - - understand your needs and interests, and personalize your experience with the Service and our communications; and - - provide support for the Service, and respond to your requests, questions and feedback. - -**Research and development.** We may use your personal information for research and development purposes, including to analyze and improve the Service and our business. As part of these activities, we may create aggregated, de-identified or other anonymous data from personal information we collect. We make personal information into anonymous data by removing information that makes the data personally identifiable to you. We may use this anonymous data and share it with third parties for our lawful business purposes, including to analyze and improve the Service and promote our business. - -**Marketing.** We and our service providers may collect and use your personal information for marketing purposes. We may send you Open Core Ventures-related marketing communications as permitted by law. You may opt-out of our marketing communications as described in the Opt-out of marketing section below. - -**To manage our and other’s recruiting and process employment applications.** We may use personal information, such as information submitted to us in a job application, to facilitate our and other’s recruitment activities and process employment applications, such as by evaluating a job candidate for an employment activity, and monitoring recruitment statistics. For our portfolio companies, we may use your personal information to assist their recruitment and employment process. - -**Compliance and protection.** We may use your personal information to: - - - - comply with applicable laws, lawful requests, and legal process, such as to respond to subpoenas or requests from government authorities; - - protect our, your or others’ rights, privacy, safety or property (including by making and defending legal claims); - - audit our internal processes for compliance with legal and contractual requirements or our internal policies; - - enforce the terms and conditions that govern the Service; and - - prevent, identify, investigate and deter fraudulent, harmful, unauthorized, unethical or illegal activity, including cyberattacks and identity theft. - -**With your consent.** In some cases, we may specifically ask for your consent to collect, use or share your personal information, such as when required by law. - -## How we share your personal information - -We may share your personal information with the following parties and as otherwise described in this Privacy Policy or at the time of collection. - -**Affiliates.** Our corporate parent, subsidiaries, and affiliates, for purposes consistent with this Privacy Policy. - -**Service providers.** Third parties that provide services on our behalf or help us operate the Service or our business (such as hosting, information technology, email delivery, marketing, and website analytics). - -**Professional advisors.** Professional advisors, such as lawyers, auditors, bankers and insurers, where necessary in the course of the professional services that they render to us. - -**Authorities and others.** Law enforcement, government authorities, and private parties, as we believe in good faith to be necessary or appropriate for the compliance and protection purposes described above. - -**Business transferees.** Acquirers and other relevant participants in business transactions (or negotiations and diligence for such transactions) involving a corporate divestiture, merger, consolidation, acquisition, reorganization, sale or other disposition of all or any portion of the business or assets of, or equity interests in, Open Core Ventures or our affiliates (including, in connection with a bankruptcy or similar proceedings). - -## Your choices - -You have the following choices with respect to your personal information. - -**Opt-out of marketing communications.** You may opt-out of marketing-related emails by following the opt-out or unsubscribe instructions at the bottom of the email, or by contacting us. Please note that if you choose to opt-out of marketing-related emails, you may continue to receive service-related and other non-marketing emails. - -**Cookies.** Most browser settings let you delete and reject cookies placed by websites. Many browsers accept cookies by default until you change your settings. If you do not accept cookies, you may not be able to use all functionality of the Service and it may not work properly. For more information about cookies, including how to see what cookies have been set on your browser and how to manage and delete them, visit https://allaboutcookies.org. - -**Do Not Track.** Some Internet browsers may be configured to send “Do Not Track” signals to the online services that you visit. We currently do not respond to “Do Not Track” or similar signals. To find out more about “Do Not Track,” please visit https://allaboutdnt.com. - -**Declining to provide information.** We need to collect personal information to provide certain services. If you do not provide the information we identify as required or mandatory, we may not be able to provide those services. - -## Other sites and services - -The Service may contain links to websites, mobile applications, and other online services operated by third parties. In addition, our content may be integrated into web pages or other online services that are not associated with us. These links and integrations are not an endorsement of, or representation that we are affiliated with, any third party. We do not control websites, mobile applications or online services operated by third parties, and we are not responsible for their actions. We encourage you to read the privacy policies of the other websites and mobile applications and online services you use. - -## Security - -We employ technical, organizational and physical safeguards designed to protect the personal information we collect. However, security risk is inherent in all internet and information technologies and we cannot guarantee the security of your personal information. - -## International data transfer - -We are headquartered in the United States and may use service providers that operate in other countries. Your personal information may be transferred to the United States or other locations where privacy laws may not be as protective as those in your state, province, or country. - -## Children - -The Service is not intended for use by children under 16 years of age. If we learn that we have collected personal information through the Service from a child under 16 without the consent of the child’s parent or guardian as required by law, we will delete it. We encourage parents or guardians with concerns to contact us. - -## Changes to this Privacy Policy - -We reserve the right to modify this Privacy Policy at any time. If we make material changes to this Privacy Policy, we will notify you by updating the date of this Privacy Policy and posting it on the Service. If required by law we will also provide notification of changes in another way that we believe is reasonably likely to reach you, such as via email or another manner through the Service. Any modifications to this Privacy Policy will be effective upon our posting the modified version (or as otherwise indicated at the time of posting). In all cases, your use of the Service after the effective date of any modified Privacy Policy indicates your acceptance of the modified Privacy Policy. - -## How to contact us - - - **Email:** `contact@flowfuse.com` - - **Mail:** `PO Box 7775 #29439, San Francisco, CA 94120-7775` -
\ No newline at end of file From 61c630e18072b99d987892e48955e0acddfcf2b8 Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Fri, 8 May 2026 13:07:48 -0700 Subject: [PATCH 2/9] nuxt: normalise trailing slashes in legacy proxy middleware Strip trailing slashes before checking NUXT_ROUTES so each migrated page only needs one entry in the set instead of two. Co-Authored-By: Claude Sonnet 4.6 --- nuxt/server/middleware/legacy.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/nuxt/server/middleware/legacy.ts b/nuxt/server/middleware/legacy.ts index a35b93a34d..770d8a9037 100644 --- a/nuxt/server/middleware/legacy.ts +++ b/nuxt/server/middleware/legacy.ts @@ -1,8 +1,8 @@ import { proxyRequest } from 'h3' // Routes that are handled by Nuxt pages (not proxied to 11ty). -// Extend this list as pages are migrated. -const NUXT_ROUTES = new Set(['/terms', '/terms/', '/privacy-policy', '/privacy-policy/']) +// Extend this list as pages are migrated. Trailing slashes are matched automatically. +const NUXT_ROUTES = new Set(['/terms', '/privacy-policy']) export default defineEventHandler(async (event) => { if (process.env.NODE_ENV !== 'development') return @@ -12,8 +12,9 @@ export default defineEventHandler(async (event) => { // Let Nuxt handle its own internal assets and API routes if (path.startsWith('/_nuxt/') || path.startsWith('/api/') || path.startsWith('/__')) return - // Let Nuxt handle migrated pages - if (NUXT_ROUTES.has(path.split('?')[0])) return + // Let Nuxt handle migrated pages (strip trailing slash and query string before matching) + const normalised = path.split('?')[0].replace(/\/$/, '') || '/' + if (NUXT_ROUTES.has(normalised)) return // Proxy everything else to the 11ty dev server return proxyRequest(event, `http://localhost:8080${path}`) From 60ab9d0ffdad42599ef52a76749872281c389cc3 Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Fri, 8 May 2026 13:27:42 -0700 Subject: [PATCH 3/9] nuxt: switch privacy policy to @nuxt/content Markdown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces the inline-HTML privacy-policy.vue with a proper content pipeline: - Install @nuxt/content v3 and register it as a module - content.config.ts: defines a 'pages' collection from content/*.md - content/privacy-policy.md: source-of-truth Markdown (no HTML) - pages/[...slug].vue: catch-all renderer; legacy middleware still gates which routes reach Nuxt, so 11ty routes are unaffected - .gitignore: exclude .data/ (nuxt/content SQLite build cache) Future content pages only need an .md file in content/ — no matching .vue file required. Co-Authored-By: Claude Sonnet 4.6 --- nuxt/.gitignore | 1 + nuxt/content.config.ts | 10 +++ nuxt/content/privacy-policy.md | 125 +++++++++++++++++++++++++++ nuxt/nuxt.config.ts | 1 + nuxt/package.json | 1 + nuxt/pages/[...slug].vue | 29 +++++++ nuxt/pages/privacy-policy.vue | 152 --------------------------------- 7 files changed, 167 insertions(+), 152 deletions(-) create mode 100644 nuxt/content.config.ts create mode 100644 nuxt/content/privacy-policy.md create mode 100644 nuxt/pages/[...slug].vue delete mode 100644 nuxt/pages/privacy-policy.vue diff --git a/nuxt/.gitignore b/nuxt/.gitignore index e9a927cecc..999b3b8a9d 100644 --- a/nuxt/.gitignore +++ b/nuxt/.gitignore @@ -8,3 +8,4 @@ public/ # Dependencies (hoisted to workspace root) node_modules/ +.data/ diff --git a/nuxt/content.config.ts b/nuxt/content.config.ts new file mode 100644 index 0000000000..9026b64987 --- /dev/null +++ b/nuxt/content.config.ts @@ -0,0 +1,10 @@ +import { defineContentConfig, defineCollection } from '@nuxt/content' + +export default defineContentConfig({ + collections: { + pages: defineCollection({ + type: 'page', + source: '*.md' + }) + } +}) diff --git a/nuxt/content/privacy-policy.md b/nuxt/content/privacy-policy.md new file mode 100644 index 0000000000..4486c69267 --- /dev/null +++ b/nuxt/content/privacy-policy.md @@ -0,0 +1,125 @@ +# Privacy Policy + +This Privacy Policy describes the privacy practices of FlowFuse Inc (**"FlowFuse"**, **"we"**, **"us"** or **"our"**) and how we handle personal information that we collect through our digital properties that link to this Privacy Policy, including our website, (the **"Service"**), as well as through social media, our marketing activities, our events and other activities described in this policy. + +At the time we collect personal information, we may provide additional or supplemental privacy notices to individuals for specific services and personal information processing activities. + +Our Service is designed for businesses and their representatives. We do not offer products or services for use by individuals for their personal, family or household purposes. Accordingly, we treat all personal information we collect as pertaining to individuals in their capacities as business representatives and not their individual capacities. + +## Index + + - [Personal information we collect](#personal-information-we-collect) + - [How we use your personal information](#how-we-use-your-personal-information) + - [How we share your personal information](#how-we-share-your-personal-information) + - [Your choices](#your-choices) + - [Other sites and services](#other-sites-and-services) + - [Security](#security) + - [International data transfer](#international-data-transfer) + - [Children](#children) + - [Changes to this Privacy Policy](#changes-to-this-privacy-policy) + - [How to contact us](#how-to-contact-us) + +## Personal information we collect + +**Information you provide to us.** Personal information you may provide to us through the Service or otherwise, such as when you view our website or contact us includes: + + - **Contact data**, such as your first and last name, email address, mailing address, professional title and company name, and phone number. + - **Communications data**, based on our exchanges with you, including when you contact us with questions or feedback, through the Service, social media, or otherwise. + - **Marketing data**, such as your preferences for receiving our marketing communications and details about your engagement with them. + - **Job application data**, such as professional credentials, skills, educational and work history, personal website, immigration status, criminal history, information that may be included on a resume or curriculum vitae as well as in a cover letter, and any other information you may otherwise provide us through a job application or interview. This may also include diversity information. + - **Other data** not specifically listed here, which we will use as described in this Privacy Policy or as otherwise disclosed at the time of collection. + +**Third-party sources.** We may combine personal information we receive from you with personal information we obtain from other sources, such as: + + - **Public sources**, such as public records and other publicly available sources. + - **Private sources**, such as data providers and data licensors that may provide demographic and other information as well as social media platforms. + +**Automatic data collection.** We, our service providers, and our business partners may automatically log information about you, your computer or mobile device, and your interaction over time with the Service, our communications and other online services, such as: + + - **Device data**, such as your computer's or mobile device's operating system type and version, manufacturer and model, browser type, screen resolution, RAM and disk size, CPU usage, device type (e.g., phone, tablet), IP address, unique identifiers, language settings, mobile device carrier, radio/network information (e.g., Wi-Fi, LTE, 3G), and general location information such as city, state or geographic area. + - **Online activity data**, such as pages or screens you viewed, how long you spent on a page or screen, the website you visited before browsing to the Service, navigation paths between pages or screens, information about your activity on a page or screen, access times and duration of access, and whether you have opened our marketing emails or clicked links within them. + +**Cookies and similar technologies.** Like many online services, we, our service providers, and our business partners may use the following technologies: + + - **Cookies**, which are text files that websites store on a visitor's device to uniquely identify the visitor's browser or to store information or settings in the browser for the purpose of helping you navigate between pages efficiently, remembering your preferences, enabling functionality, helping us understand user activity and patterns, and facilitating analytics. + - **Web beacons**, also known as pixel tags or clear GIFs, which are used to demonstrate that a webpage or email was accessed or opened, or that certain content was viewed or clicked. + +**Data about others.** Users of the Service may have the opportunity to refer friends or other contacts to us and share their contact information with us. Please do not refer someone to us or share their contact information with us unless you have their permission to do so. + +## How we use your personal information + +We may use your personal information for the following purposes or as otherwise described at the time of collection: + +**Service delivery.** We may use your personal information to: + + - provide, operate and improve the Service and our business, including researching prospective and current portfolio companies and financing them; + - communicate with you about the Service, including by sending announcements, updates, security alerts, and support and administrative messages; + - understand your needs and interests, and personalize your experience with the Service and our communications; and + - provide support for the Service, and respond to your requests, questions and feedback. + +**Research and development.** We may use your personal information for research and development purposes, including to analyze and improve the Service and our business. As part of these activities, we may create aggregated, de-identified or other anonymous data from personal information we collect. We make personal information into anonymous data by removing information that makes the data personally identifiable to you. We may use this anonymous data and share it with third parties for our lawful business purposes, including to analyze and improve the Service and promote our business. + +**Marketing.** We and our service providers may collect and use your personal information for marketing purposes. We may send you Open Core Ventures-related marketing communications as permitted by law. You may opt-out of our marketing communications as described in the [Opt-out of marketing](#your-choices) section below. + +**To manage our and other's recruiting and process employment applications.** We may use personal information, such as information submitted to us in a job application, to facilitate our and other's recruitment activities and process employment applications, such as by evaluating a job candidate for an employment activity, and monitoring recruitment statistics. For our portfolio companies, we may use your personal information to assist their recruitment and employment process. + +**Compliance and protection.** We may use your personal information to: + + - comply with applicable laws, lawful requests, and legal process, such as to respond to subpoenas or requests from government authorities; + - protect our, your or others' rights, privacy, safety or property (including by making and defending legal claims); + - audit our internal processes for compliance with legal and contractual requirements or our internal policies; + - enforce the terms and conditions that govern the Service; and + - prevent, identify, investigate and deter fraudulent, harmful, unauthorized, unethical or illegal activity, including cyberattacks and identity theft. + +**With your consent.** In some cases, we may specifically ask for your consent to collect, use or share your personal information, such as when required by law. + +## How we share your personal information + +We may share your personal information with the following parties and as otherwise described in this Privacy Policy or at the time of collection. + +**Affiliates.** Our corporate parent, subsidiaries, and affiliates, for purposes consistent with this Privacy Policy. + +**Service providers.** Third parties that provide services on our behalf or help us operate the Service or our business (such as hosting, information technology, email delivery, marketing, and website analytics). + +**Professional advisors.** Professional advisors, such as lawyers, auditors, bankers and insurers, where necessary in the course of the professional services that they render to us. + +**Authorities and others.** Law enforcement, government authorities, and private parties, as we believe in good faith to be necessary or appropriate for the compliance and protection purposes described above. + +**Business transferees.** Acquirers and other relevant participants in business transactions (or negotiations and diligence for such transactions) involving a corporate divestiture, merger, consolidation, acquisition, reorganization, sale or other disposition of all or any portion of the business or assets of, or equity interests in, Open Core Ventures or our affiliates (including, in connection with a bankruptcy or similar proceedings). + +## Your choices + +You have the following choices with respect to your personal information. + +**Opt-out of marketing communications.** You may opt-out of marketing-related emails by following the opt-out or unsubscribe instructions at the bottom of the email, or by [contacting us](#how-to-contact-us). Please note that if you choose to opt-out of marketing-related emails, you may continue to receive service-related and other non-marketing emails. + +**Cookies.** Most browser settings let you delete and reject cookies placed by websites. Many browsers accept cookies by default until you change your settings. If you do not accept cookies, you may not be able to use all functionality of the Service and it may not work properly. For more information about cookies, including how to see what cookies have been set on your browser and how to manage and delete them, visit [https://allaboutcookies.org](https://allaboutcookies.org). + +**Do Not Track.** Some Internet browsers may be configured to send "Do Not Track" signals to the online services that you visit. We currently do not respond to "Do Not Track" or similar signals. To find out more about "Do Not Track," please visit [https://allaboutdnt.com](https://allaboutdnt.com). + +**Declining to provide information.** We need to collect personal information to provide certain services. If you do not provide the information we identify as required or mandatory, we may not be able to provide those services. + +## Other sites and services + +The Service may contain links to websites, mobile applications, and other online services operated by third parties. In addition, our content may be integrated into web pages or other online services that are not associated with us. These links and integrations are not an endorsement of, or representation that we are affiliated with, any third party. We do not control websites, mobile applications or online services operated by third parties, and we are not responsible for their actions. We encourage you to read the privacy policies of the other websites and mobile applications and online services you use. + +## Security + +We employ technical, organizational and physical safeguards designed to protect the personal information we collect. However, security risk is inherent in all internet and information technologies and we cannot guarantee the security of your personal information. + +## International data transfer + +We are headquartered in the United States and may use service providers that operate in other countries. Your personal information may be transferred to the United States or other locations where privacy laws may not be as protective as those in your state, province, or country. + +## Children + +The Service is not intended for use by children under 16 years of age. If we learn that we have collected personal information through the Service from a child under 16 without the consent of the child's parent or guardian as required by law, we will delete it. We encourage parents or guardians with concerns to contact us. + +## Changes to this Privacy Policy + +We reserve the right to modify this Privacy Policy at any time. If we make material changes to this Privacy Policy, we will notify you by updating the date of this Privacy Policy and posting it on the Service. If required by law we will also provide notification of changes in another way that we believe is reasonably likely to reach you, such as via email or another manner through the Service. Any modifications to this Privacy Policy will be effective upon our posting the modified version (or as otherwise indicated at the time of posting). In all cases, your use of the Service after the effective date of any modified Privacy Policy indicates your acceptance of the modified Privacy Policy. + +## How to contact us + + - **Email:** `contact@flowfuse.com` + - **Mail:** `PO Box 7775 #29439, San Francisco, CA 94120-7775` diff --git a/nuxt/nuxt.config.ts b/nuxt/nuxt.config.ts index 6591413a7b..20ad2de3bc 100644 --- a/nuxt/nuxt.config.ts +++ b/nuxt/nuxt.config.ts @@ -1,6 +1,7 @@ // https://nuxt.com/docs/api/configuration/nuxt-config export default defineNuxtConfig({ devtools: { enabled: true }, + modules: ['@nuxt/content'], app: { head: { diff --git a/nuxt/package.json b/nuxt/package.json index 76ae383afb..bc14def088 100644 --- a/nuxt/package.json +++ b/nuxt/package.json @@ -9,6 +9,7 @@ "preview": "nuxt preview" }, "devDependencies": { + "@nuxt/content": "^3.13.0", "nuxt": "^4.0.0" } } diff --git a/nuxt/pages/[...slug].vue b/nuxt/pages/[...slug].vue new file mode 100644 index 0000000000..dafd047a4d --- /dev/null +++ b/nuxt/pages/[...slug].vue @@ -0,0 +1,29 @@ + + + diff --git a/nuxt/pages/privacy-policy.vue b/nuxt/pages/privacy-policy.vue deleted file mode 100644 index d84df23f54..0000000000 --- a/nuxt/pages/privacy-policy.vue +++ /dev/null @@ -1,152 +0,0 @@ - - - From 7616c6c0b16012e1bc73f32fb92a1b932f905723 Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Sat, 9 May 2026 13:27:06 -0700 Subject: [PATCH 4/9] ci: test combined 11ty + Nuxt output with hyperlink The handbook section has been migrated from 11ty to Nuxt. The 11ty build no longer produces handbook pages, so testing _site/ alone would leave broken links undetected. In the unified build pipeline, 11ty outputs into nuxt/public/ which Nuxt then copies verbatim into nuxt/.output/public/ alongside its own generated pages. That directory is therefore the complete site output. Switch the CI build step to build:nuxt:skip-images (added here) and point hyperlink at nuxt/.output/public/ so the link check covers both the 11ty and Nuxt portions of the site. --- .github/workflows/test.yml | 4 ++-- package.json | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 308f66df94..3ff0ddd24b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -49,8 +49,8 @@ jobs: run: npm install working-directory: 'website' - name: Build the forge - run: npm run build:skip-images + run: npm run build:nuxt:skip-images working-directory: 'website' - uses: untitaker/hyperlink@fb5bb9c5011a3d143a54b4b30aedc30ec5bc0f89 # 0.2.0 with: - args: website/_site/ --check-anchors --sources website/src + args: website/nuxt/.output/public/ --check-anchors --sources website/src --sources website/nuxt/content diff --git a/package.json b/package.json index 6a6aa3d8cd..7a573ac545 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,8 @@ "prod:postcss-nuxt": "postcss ./src/css/style.css -o ./nuxt/public/css/style.css --config ./postcss.config.js", "prod:eleventy-nuxt": "npx @11ty/eleventy --output=./nuxt/public/", "prod:nuxt": "npm run generate --workspace=nuxt", - "build:nuxt": "dotenv -v NODE_ENV=production -- npm-run-all2 clean:nuxt build:js:nuxt docs blueprints prod:postcss-nuxt prod:eleventy-nuxt prod:nuxt" + "build:nuxt": "dotenv -v NODE_ENV=production -- npm-run-all2 clean:nuxt build:js:nuxt docs blueprints prod:postcss-nuxt prod:eleventy-nuxt prod:nuxt", + "build:nuxt:skip-images": "dotenv -v SKIP_IMAGES=true -v NODE_ENV=production -- npm-run-all2 clean:nuxt build:js:nuxt docs blueprints prod:postcss-nuxt prod:eleventy-nuxt prod:nuxt" }, "devDependencies": { "@11ty/eleventy": "^3.1.2", From 37280a01f47cb26bd0a730e6616929efa58d668d Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Fri, 15 May 2026 11:13:32 +0300 Subject: [PATCH 5/9] ci: drop duplicate --sources flag unsupported by hyperlink Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3ff0ddd24b..7359ed18cc 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,4 +53,4 @@ jobs: working-directory: 'website' - uses: untitaker/hyperlink@fb5bb9c5011a3d143a54b4b30aedc30ec5bc0f89 # 0.2.0 with: - args: website/nuxt/.output/public/ --check-anchors --sources website/src --sources website/nuxt/content + args: website/nuxt/.output/public/ --check-anchors --sources website/nuxt/content From dd6bd7472f4f5cba1e80ae5d9345d46b3ddf6651 Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Sun, 17 May 2026 15:50:58 -0400 Subject: [PATCH 6/9] ci: fix hyperlink path to nuxt generate output (dist/ not .output/public/) Nuxt 4 outputs to dist/ instead of .output/public/. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7359ed18cc..4db159056c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -53,4 +53,4 @@ jobs: working-directory: 'website' - uses: untitaker/hyperlink@fb5bb9c5011a3d143a54b4b30aedc30ec5bc0f89 # 0.2.0 with: - args: website/nuxt/.output/public/ --check-anchors --sources website/nuxt/content + args: website/nuxt/dist/ --check-anchors --sources website/nuxt/content From d94c597b5d020e348c5d78aa0c53d5aa2bd512f0 Mon Sep 17 00:00:00 2001 From: ZJ van de Weg Date: Tue, 19 May 2026 07:21:53 -0700 Subject: [PATCH 7/9] ci: replace hyperlink with nuxt-link-checker for link validation Removes the Rust-based hyperlink tool and replaces it with nuxt-link-checker, which runs automatically during nuxt generate. Skips trailing-slash and no-error-response inspections since 11ty pages use trailing slashes intentionally and are absent from the Nuxt-only static output. Also fixes missing aria-label on header logo links. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/test.yml | 3 - nuxt/components/AppHeader.vue | 4 +- nuxt/nuxt.config.ts | 9 +- nuxt/package.json | 4 +- package-lock.json | 6584 +++++++++++++++++++++++++++------ 5 files changed, 5438 insertions(+), 1166 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4db159056c..aa9c4acfaa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -51,6 +51,3 @@ jobs: - name: Build the forge run: npm run build:nuxt:skip-images working-directory: 'website' - - uses: untitaker/hyperlink@fb5bb9c5011a3d143a54b4b30aedc30ec5bc0f89 # 0.2.0 - with: - args: website/nuxt/dist/ --check-anchors --sources website/nuxt/content diff --git a/nuxt/components/AppHeader.vue b/nuxt/components/AppHeader.vue index c3766205ba..3e6d3f624e 100644 --- a/nuxt/components/AppHeader.vue +++ b/nuxt/components/AppHeader.vue @@ -74,7 +74,7 @@ onMounted(() => {