From 8f0fc1f3bd765acf00141b1f531d77585243e470 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 20 Oct 2026 19:48:59 -0700 Subject: [PATCH 1/4] fix(comparisons): lead Flowise copy with its end of life, qualify Retool self-hosting, and note the Zapier Agents migration --- apps/sim/lib/compare/data/competitors/flowise.ts | 4 ++-- apps/sim/lib/compare/data/competitors/retool.ts | 6 +++--- apps/sim/lib/compare/data/competitors/zapier.ts | 11 ++++++++--- apps/sim/lib/landing/routes.ts | 5 +++-- apps/sim/proxy.test.ts | 3 +++ 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/apps/sim/lib/compare/data/competitors/flowise.ts b/apps/sim/lib/compare/data/competitors/flowise.ts index dbc0746b7e0..bf195184f38 100644 --- a/apps/sim/lib/compare/data/competitors/flowise.ts +++ b/apps/sim/lib/compare/data/competitors/flowise.ts @@ -19,7 +19,7 @@ export const flowiseProfile: CompetitorProfile = { asOf: '2026-07-02', }, oneLiner: - 'Flowise is an open-source, low-code visual builder for LLM chains, RAG pipelines, and multi-agent AI workflows, owned by Workday since August 2025, which reached end of life on August 31, 2026 after its team announced it was winding the project down.', + 'Flowise reached end of life on August 31, 2026: it was an open-source, low-code visual builder for LLM chains, RAG pipelines, and multi-agent AI workflows, owned by Workday since August 2025, until its team wound the project down.', leadAnswer: [ 'Flowise was an open-source, Apache 2.0-licensed, low-code visual builder for LLM chains, RAG pipelines, and multi-agent workflows, owned by Workday since August 2025. Its team ', { text: 'announced the sunset of Flowise', href: 'https://flowiseai.com/sunset' }, @@ -160,7 +160,7 @@ export const flowiseProfile: CompetitorProfile = { }, selfHostOption: { value: - "Yes: Flowise's Community Edition is Apache 2.0 and can be self-hosted, including via Docker, on your own infrastructure. The repository has been archived since August 2026 and the project reached end of life on August 31, 2026, so a self-hosted deployment runs the final release or a fork you maintain.", + "Only the archived code: Flowise's Community Edition reached end of life on August 31, 2026, and its Apache-licensed code can still be self-hosted, including via Docker, on your own infrastructure. The code is Apache 2.0 and the repository has been archived since August 2026, so a self-hosted deployment runs the final release or a fork you maintain.", shortValue: 'Yes, but the archived code is no longer maintained', confidence: 'verified', sources: [ diff --git a/apps/sim/lib/compare/data/competitors/retool.ts b/apps/sim/lib/compare/data/competitors/retool.ts index 44e78bff9f4..5a0d345de38 100644 --- a/apps/sim/lib/compare/data/competitors/retool.ts +++ b/apps/sim/lib/compare/data/competitors/retool.ts @@ -24,7 +24,7 @@ export const retoolProfile: CompetitorProfile = { oneLiner: 'Retool is a low-code platform for building, deploying, and managing internal software (apps, workflows, and AI agents) that connect to databases, APIs, and LLMs.', leadAnswer: [ - 'Retool is a proprietary low-code platform for building internal software: React-based apps, workflows, and a separate Agents product connected to databases, APIs, and LLMs, on Retool Cloud or self-hosted with a Retool-issued license key. Sim is an open-source AI workspace with an Apache 2.0-licensed core, where teams build, deploy, and manage AI agents visually, conversationally, or with code, on Sim Cloud or self-hosted. Choose Retool when the deliverable is an internal app with a user interface on top of production data, such as an admin panel or dashboard. Choose Sim when the deliverable is the agent or automation itself, built in one workflow builder and deployed as a REST API, chat interface, or MCP tool, with built-in evaluation and guardrail blocks.', + 'Retool is a proprietary low-code platform for building internal software: React-based apps, workflows, and a separate Agents product connected to databases, APIs, and LLMs, on Retool Cloud or, on the Enterprise plan, self-hosted with a Retool-issued license key. Sim is an open-source AI workspace with an Apache 2.0-licensed core, where teams build, deploy, and manage AI agents visually, conversationally, or with code, on Sim Cloud or self-hosted. Choose Retool when the deliverable is an internal app with a user interface on top of production data, such as an admin panel or dashboard. Choose Sim when the deliverable is the agent or automation itself, built in one workflow builder and deployed as a REST API, chat interface, or MCP tool, with built-in evaluation and guardrail blocks.', ], faqs: [ { @@ -188,8 +188,8 @@ export const retoolProfile: CompetitorProfile = { }, deploymentOptions: { value: - 'Retool Cloud (multi-tenant SaaS), or self-hosted via Docker Compose (non-prod/testing) or Kubernetes with Helm chart (production).', - shortValue: 'Cloud, or self-hosted via Docker/Kubernetes', + 'Retool Cloud (multi-tenant SaaS), or, on the Enterprise plan only, self-hosted via Docker Compose (non-prod/testing) or Kubernetes with Helm chart (production).', + shortValue: 'Cloud, or self-hosted on Enterprise', confidence: 'verified', sources: [ { diff --git a/apps/sim/lib/compare/data/competitors/zapier.ts b/apps/sim/lib/compare/data/competitors/zapier.ts index d63acf873c1..ea840999b7e 100644 --- a/apps/sim/lib/compare/data/competitors/zapier.ts +++ b/apps/sim/lib/compare/data/competitors/zapier.ts @@ -30,13 +30,13 @@ export const zapierProfile: CompetitorProfile = { oneLiner: 'Zapier is a cloud-based, proprietary no-code/low-code automation platform built around "Zaps": trigger-action workflows connecting thousands of web apps. It recently added AI features, including Copilot for building, Agents for autonomous multi-step tasks, and an MCP server.', leadAnswer: [ - "Zapier is a proprietary, cloud-only automation platform built around trigger-action Zaps across 9,000+ apps, with Copilot for natural-language building, a separate Agents product, and a hosted MCP server. Sim is an open-source AI workspace with an Apache 2.0-licensed core, where teams build, deploy, and manage AI agents visually, conversationally, or with code, on Sim Cloud or self-hosted. Choose Zapier when you need the largest catalog of prebuilt app connectors for trigger-action automations that run entirely on Zapier's cloud. Choose Sim when AI agents are the core of the workflow, or when you need self-hosting, live multiplayer editing, native parallel branches, or a knowledge base with hybrid search that continuously syncs external sources.", + "Zapier is a proprietary, cloud-only automation platform built around trigger-action Zaps across 9,000+ apps, with Copilot for natural-language building, a separate Agents product that Zapier is migrating into AI by Zapier, and a hosted MCP server. Sim is an open-source AI workspace with an Apache 2.0-licensed core, where teams build, deploy, and manage AI agents visually, conversationally, or with code, on Sim Cloud or self-hosted. Choose Zapier when you need the largest catalog of prebuilt app connectors for trigger-action automations that run entirely on Zapier's cloud. Choose Sim when AI agents are the core of the workflow, or when you need self-hosting, live multiplayer editing, native parallel branches, or a knowledge base with hybrid search that continuously syncs external sources.", ], faqs: [ { question: 'How does Sim compare to Zapier for building AI agents?', answer: - 'Sim builds agents inside the same workflow builder as the rest of the automation, while Zapier runs AI agents in a separate Agents product alongside its trigger-action Zaps. Zapier Agents can reference FAQs, docs, and public links as knowledge, but Zapier does not publicly detail the retrieval implementation or document dedicated evaluation or guardrail tooling. Sim provides agent blocks across 28 LLM provider integrations, a knowledge base with hybrid vector and full-text search plus connectors that continuously sync sources such as Google Drive and Confluence, and Evaluator and Guardrails blocks that score outputs and detect or mask PII. Both products offer a dedicated human approval step that pauses a run mid-workflow.', + 'Sim builds agents inside the same workflow builder as the rest of the automation, while Zapier runs AI agents in a separate Agents product alongside its trigger-action Zaps. Zapier is migrating Agents into AI by Zapier, which bills in tasks, and has not set a date to turn off Agents. Zapier Agents can reference FAQs, docs, and public links as knowledge, but Zapier does not publicly detail the retrieval implementation or document dedicated evaluation or guardrail tooling. Sim provides agent blocks across 28 LLM provider integrations, a knowledge base with hybrid vector and full-text search plus connectors that continuously sync sources such as Google Drive and Confluence, and Evaluator and Guardrails blocks that score outputs and detect or mask PII. Both products offer a dedicated human approval step that pauses a run mid-workflow.', }, { question: 'Is there a Zapier alternative that can be self-hosted?', @@ -407,11 +407,16 @@ export const zapierProfile: CompetitorProfile = { agentReasoningBlocks: { value: 'Yes', detail: - 'Zapier Agents is a distinct product for building autonomous, multi-step AI agents, separate from plain trigger-action Zaps, that reason across tasks and act across 9,000+ apps.', + 'Zapier Agents is a distinct product for building autonomous, multi-step AI agents, separate from plain trigger-action Zaps, that reason across tasks and act across 9,000+ apps. Zapier is migrating Agents into AI by Zapier, which bills in tasks, and has not set a date to turn off Agents.', shortValue: 'Dedicated Agents product for multi-step AI tasks', confidence: 'estimated', sources: [ { url: 'https://zapier.com/agents', label: 'Zapier Agents overview', asOf: '2026-07-02' }, + { + url: 'https://help.zapier.com/hc/en-us/articles/47402591569805-Migrating-from-Agents-to-AI-by-Zapier', + label: 'Migrating from Agents to AI by Zapier', + asOf: '2026-10-20', + }, ], }, naturalLanguageBuilding: { diff --git a/apps/sim/lib/landing/routes.ts b/apps/sim/lib/landing/routes.ts index 42be1a77554..727081a58eb 100644 --- a/apps/sim/lib/landing/routes.ts +++ b/apps/sim/lib/landing/routes.ts @@ -3,8 +3,8 @@ * root. The single source of truth for "is this the marketing surface", because * a route group is not a path prefix and nothing else can derive the answer. * - * Two consumers depend on this list being complete, and both fail silently when - * it is not: + * Three consumers depend on this list being complete, and all three fail + * silently when it is not: * * - `next.config.ts` exempts these paths from COEP. The header is a *document* * header inherited across client-side navigations, so an unlisted landing page @@ -64,6 +64,7 @@ export function isLandingPath(pathname: string): boolean { * {@link isLandingPath} does not cover them. */ const MARKETING_DOCUMENT_PATHS: ReadonlySet = new Set([ + '/index.md', '/llms.txt', '/llms-full.txt', '/changelog.xml', diff --git a/apps/sim/proxy.test.ts b/apps/sim/proxy.test.ts index aa33a6c6a4e..a89b63c78b3 100644 --- a/apps/sim/proxy.test.ts +++ b/apps/sim/proxy.test.ts @@ -175,6 +175,7 @@ describe('proxy indexing policy', () => { it('keeps the marketing documents of a self-hosted deployment out of search results', () => { setEnvFlags({ isHosted: false }) + expect(robotsTag('/index.md')).toBe('noindex, nofollow') expect(robotsTag('/llms.txt')).toBe('noindex, nofollow') expect(robotsTag('/llms-full.txt')).toBe('noindex, nofollow') expect(robotsTag('/changelog.xml')).toBe('noindex, nofollow') @@ -184,6 +185,7 @@ describe('proxy indexing policy', () => { setEnvFlags({ isHosted: true }) expect(robotsTag('/comparisons/n8n')).toBeNull() expect(robotsTag('/pricing')).toBeNull() + expect(robotsTag('/index.md')).toBeNull() expect(robotsTag('/llms.txt')).toBeNull() expect(robotsTag('/llms-full.txt')).toBeNull() expect(robotsTag('/changelog.xml')).toBeNull() @@ -210,6 +212,7 @@ describe('proxy matcher', () => { }) it('runs for the marketing documents, so the indexing policy reaches them', () => { + expect(matches('/index.md')).toBe(true) expect(matches('/llms.txt')).toBe(true) expect(matches('/llms-full.txt')).toBe(true) expect(matches('/changelog.xml')).toBe(true) From a3da514eb4b8301e58ea9724d9b798346187414e Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 20 Oct 2026 19:51:42 -0700 Subject: [PATCH 2/4] fix(comparisons): end generated FAQ summaries at real sentence boundaries --- apps/sim/app/(landing)/comparisons/utils.ts | 17 +++++++++++++++-- .../sim/lib/compare/data/competitors/flowise.ts | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/sim/app/(landing)/comparisons/utils.ts b/apps/sim/app/(landing)/comparisons/utils.ts index 36da0bcde75..c9e688de27a 100644 --- a/apps/sim/app/(landing)/comparisons/utils.ts +++ b/apps/sim/app/(landing)/comparisons/utils.ts @@ -198,9 +198,22 @@ function formatClaim(item: { title: string; description: string }): string { return `${lowercaseFirst(item.title)}: ${item.description}` } +const SENTENCE_END = /[.!?](?=\s+["'(A-Z]|$)/g + +/** A period that closes "vs.", "incl.", "etc.", or a single letter ("e.g.", "U.S."), not a sentence. */ +const ABBREVIATION_END = /(?:^|[\s(.-])(?:vs|incl|etc|[A-Za-z])\.$/ + +/** + * Returns the first sentence of `value`: text up to the first `.`, `!`, or `?` + * followed by whitespace and a capital, quote, or paren, or by the end of the + * string. Decimals ("2.0", "$0.005") and abbreviations ("vs.", "U.S.") never end it. + */ function firstSentence(value: string): string { - const match = value.match(/^[^.]+\./) - return match ? match[0] : value + for (const match of value.matchAll(SENTENCE_END)) { + const candidate = value.slice(0, match.index + 1) + if (!ABBREVIATION_END.test(candidate)) return candidate + } + return value } /** Appends a period if `value` doesn't already end in sentence-closing punctuation. */ diff --git a/apps/sim/lib/compare/data/competitors/flowise.ts b/apps/sim/lib/compare/data/competitors/flowise.ts index bf195184f38..6f30188738d 100644 --- a/apps/sim/lib/compare/data/competitors/flowise.ts +++ b/apps/sim/lib/compare/data/competitors/flowise.ts @@ -160,7 +160,7 @@ export const flowiseProfile: CompetitorProfile = { }, selfHostOption: { value: - "Only the archived code: Flowise's Community Edition reached end of life on August 31, 2026, and its Apache-licensed code can still be self-hosted, including via Docker, on your own infrastructure. The code is Apache 2.0 and the repository has been archived since August 2026, so a self-hosted deployment runs the final release or a fork you maintain.", + "Only the archived code: Flowise's Community Edition reached end of life on August 31, 2026, and its Apache 2.0 code can still be self-hosted, including via Docker, on your own infrastructure. The repository has been archived since August 2026, so a self-hosted deployment runs the final release or a fork you maintain.", shortValue: 'Yes, but the archived code is no longer maintained', confidence: 'verified', sources: [ From 7acd96652f675da795e99970a385ea4269b89973 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 20 Oct 2026 20:12:02 -0700 Subject: [PATCH 3/4] fix(comparisons): keep closing quotes in sentence summaries and scope Flowise's end of life to the open-source project --- apps/sim/app/(landing)/comparisons/utils.ts | 10 +++++----- apps/sim/lib/compare/data/competitors/flowise.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/sim/app/(landing)/comparisons/utils.ts b/apps/sim/app/(landing)/comparisons/utils.ts index c9e688de27a..9e957aa8f65 100644 --- a/apps/sim/app/(landing)/comparisons/utils.ts +++ b/apps/sim/app/(landing)/comparisons/utils.ts @@ -198,20 +198,20 @@ function formatClaim(item: { title: string; description: string }): string { return `${lowercaseFirst(item.title)}: ${item.description}` } -const SENTENCE_END = /[.!?](?=\s+["'(A-Z]|$)/g +const SENTENCE_END = /[.!?]["')]?(?=\s+["'(A-Z]|$)/g /** A period that closes "vs.", "incl.", "etc.", or a single letter ("e.g.", "U.S."), not a sentence. */ const ABBREVIATION_END = /(?:^|[\s(.-])(?:vs|incl|etc|[A-Za-z])\.$/ /** * Returns the first sentence of `value`: text up to the first `.`, `!`, or `?` - * followed by whitespace and a capital, quote, or paren, or by the end of the - * string. Decimals ("2.0", "$0.005") and abbreviations ("vs.", "U.S.") never end it. + * (plus any closing quote or paren) followed by whitespace and a capital, quote, + * or paren, or by the end of the string. Decimals ("2.0", "$0.005") and abbreviations ("vs.", "U.S.") never end it. */ function firstSentence(value: string): string { for (const match of value.matchAll(SENTENCE_END)) { - const candidate = value.slice(0, match.index + 1) - if (!ABBREVIATION_END.test(candidate)) return candidate + const candidate = value.slice(0, match.index + match[0].length) + if (!ABBREVIATION_END.test(value.slice(0, match.index + 1))) return candidate } return value } diff --git a/apps/sim/lib/compare/data/competitors/flowise.ts b/apps/sim/lib/compare/data/competitors/flowise.ts index 6f30188738d..d9b55c4cdbb 100644 --- a/apps/sim/lib/compare/data/competitors/flowise.ts +++ b/apps/sim/lib/compare/data/competitors/flowise.ts @@ -19,7 +19,7 @@ export const flowiseProfile: CompetitorProfile = { asOf: '2026-07-02', }, oneLiner: - 'Flowise reached end of life on August 31, 2026: it was an open-source, low-code visual builder for LLM chains, RAG pipelines, and multi-agent AI workflows, owned by Workday since August 2025, until its team wound the project down.', + 'The Flowise open-source project reached end of life on August 31, 2026: Flowise is a low-code visual builder for LLM chains, RAG pipelines, and multi-agent AI workflows, owned by Workday since August 2025, and flowiseai.com still lists its Cloud plans.', leadAnswer: [ 'Flowise was an open-source, Apache 2.0-licensed, low-code visual builder for LLM chains, RAG pipelines, and multi-agent workflows, owned by Workday since August 2025. Its team ', { text: 'announced the sunset of Flowise', href: 'https://flowiseai.com/sunset' }, From 50b583138a05acf4cba7834a8cac91ed056676e1 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 20 Oct 2026 20:23:15 -0700 Subject: [PATCH 4/4] fix(comparisons): don't add a period after a quoted sentence ending --- apps/sim/app/(landing)/comparisons/utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sim/app/(landing)/comparisons/utils.ts b/apps/sim/app/(landing)/comparisons/utils.ts index 9e957aa8f65..2c1a962e142 100644 --- a/apps/sim/app/(landing)/comparisons/utils.ts +++ b/apps/sim/app/(landing)/comparisons/utils.ts @@ -216,9 +216,9 @@ function firstSentence(value: string): string { return value } -/** Appends a period if `value` doesn't already end in sentence-closing punctuation. */ +/** Appends a period unless `value` already ends in sentence-closing punctuation, optionally followed by a closing quote or paren. */ export function ensurePeriod(value: string): string { - return /[.!?]$/.test(value) ? value : `${value}.` + return /[.!?]["')]?$/.test(value) ? value : `${value}.` } /**