feat(comparison): add Sim vs Competitor comparison pages by waleedlatif1 · Pull Request #5383 · simstudioai/sim · GitHub
Skip to content

feat(comparison): add Sim vs Competitor comparison pages#5383

Merged
waleedlatif1 merged 6 commits into
stagingfrom
worktree-compare-pages-data
Jul 3, 2026
Merged

feat(comparison): add Sim vs Competitor comparison pages#5383
waleedlatif1 merged 6 commits into
stagingfrom
worktree-compare-pages-data

Conversation

@waleedlatif1

Copy link
Copy Markdown
Collaborator

Summary

  • New /comparison hub + /comparison/[provider] detail pages: Sim vs 16 competitors (n8n, Zapier, Make, Gumloop, Workato, Retool, Pipedream, OpenAI AgentKit, Tines, StackAI, Power Automate, Vellum, Claude Cowork, Langflow, Flowise)
  • Each page has ~60 independently sourced, dated facts across platform, AI capabilities, integrations, pricing, security & compliance, observability, and support
  • Data layer at lib/compare/data is UI-free and independently auditable; adding a new fact or competitor requires no page-template changes
  • BreadcrumbList, ItemList (with per-fact additionalProperty), and FAQPage JSON-LD on every page; sitemap picks up all pages automatically
  • Two new fact categories (parallel execution, Agent2Agent protocol support) added and researched against every competitor's own docs/changelog

Type of Change

  • New feature

Testing

  • tsc --noEmit, biome check, and bun run check:api-validation all pass clean
  • Production build (next build) completes with zero errors across all 737 pages
  • Manually verified rendering of all 16 detail pages + hub page (200s, correct JSON-LD, no layout shift)
  • Full-dataset fact validation pass run against live vendor sources

Checklist

  • Code follows project style guidelines
  • Self-reviewed my changes
  • Tests added/updated and passing
  • No new warnings introduced
  • I confirm that I have read and agree to the terms outlined in the Contributor License Agreement (CLA)

@waleedlatif1 waleedlatif1 requested a review from a team as a code owner July 3, 2026 02:52
@vercel

vercel Bot commented Jul 3, 2026

Copy link
Copy Markdown

@cursor

cursor Bot commented Jul 3, 2026

Copy link
Copy Markdown

PR Summary

Low Risk
Landing-only static pages and content wiring; no changes to auth, billing, or core app execution paths.

Overview
Adds a marketing comparison section with a /comparison hub and statically generated /comparison/[provider] pages for 16 competitors, all driven by existing lib/compare/data profiles.

Each detail page renders a sourced fact table (via shared COMPARISON_SECTIONS, including new parallel execution and Agent2Agent rows), standout/limitation cards with source links, generated FAQs and a bottom-line verdict, plus BreadcrumbList / ItemList / FAQPage JSON-LD. Discovery is wired through a footer Compare link and sitemap entries keyed off latest verified fact dates. Competitor brand icons are added for hub/table chrome; invalid slugs get a dedicated not-found page.

Reviewed by Cursor Bugbot for commit 98131d2. Configure here.

Comment thread apps/sim/app/(landing)/comparison/fact-status.ts
Comment thread apps/sim/app/sitemap.ts
- New /comparison hub + /comparison/[provider] detail pages for Sim vs
  16 competitors (n8n, Zapier, Make, Gumloop, Workato, Retool,
  Pipedream, OpenAI AgentKit, Tines, StackAI, Power Automate, Vellum,
  Claude Cowork, Langflow, Flowise), each with ~60 sourced, dated facts
  across platform, AI capabilities, integrations, pricing, security,
  observability, and support
- Data layer at lib/compare/data (types, per-competitor profiles) is
  UI-free and independently auditable
- BreadcrumbList, ItemList, and FAQPage JSON-LD per page; sitemap picks
  up all pages automatically via ALL_COMPETITORS
- Two new fact categories (parallel execution, Agent2Agent protocol)
  researched and sourced against every competitor's own docs
@greptile-apps

greptile-apps Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a /comparison hub page and 15 /comparison/[provider] detail pages, each comparing Sim against a specific competitor (n8n, Zapier, Make, Gumloop, Workato, Retool, Pipedream, OpenAI AgentKit, Tines, StackAI, Power Automate, Vellum, Claude Cowork, Langflow, Flowise). The data layer is cleanly separated from the UI, with every fact carrying a source URL and verification date; issues flagged in prior review rounds (FAQ self-hosting presupposition, isNotLastRow inversion, summarizeFact Yes/No prefix stripping, and critters devDependency placement) have all been resolved.

  • Data architecture: lib/compare/data/types.ts defines a ComparisonFacts interface; comparison-sections.ts uses a typed defineSection helper so a row-key typo fails the build; all 16 profiles (Sim + 15 competitors) satisfy the full interface including the two newly added facts (parallelExecution, a2aProtocol).
  • SEO / GEO: Each detail page emits three JSON-LD blocks (BreadcrumbList, ItemList with additionalProperty per fact, FAQPage); the sitemap correctly picks up all 16 pages with dates derived from the most-recently-verified source across both profiles.
  • Rendering: The comparison table is a server-rendered grid using ARIA table roles; FactValue renders glance icons for boolean facts and truncated shortValue text for prose facts; SourceLink ('use client') adds source tooltips via progressive enhancement.

Confidence Score: 5/5

Safe to merge — all 16 pages are statically generated, the data layer is UI-free and fully typed, and all issues from prior review rounds are addressed.

The change is purely additive (new routes, new data files, one sitemap update, one footer link). The type system enforces fact-key correctness at build time via defineSection's generic, so a missing or misspelled key fails tsc --noEmit rather than silently serving 'Unknown'. JSON-LD generation, sitemap timestamps, and FAQ construction all look correct. The two notes left are code-comment accuracy and a latent edge case in firstSentence that the current data does not trigger.

No files require special attention — the data files are large but uniform in structure, and the rendering components are small and focused.

Important Files Changed

Filename Overview
apps/sim/app/(landing)/comparison/[provider]/page.tsx Detail page: correctly awaits params, calls notFound() as a defensive guard alongside dynamicParams = false, generates three well-formed JSON-LD blocks (BreadcrumbList, ItemList, FAQPage), and computes latestVerified as max(Sim, competitor) verified dates.
apps/sim/app/(landing)/comparison/utils.ts Core utility layer: summarizeFact now correctly strips Yes/No prefixes before lowercasing (previous thread bug fixed); FAQ self-hosting question reworded; lowercaseFirst correctly handles leading acronyms; all helpers are pure and testable.
apps/sim/app/(landing)/comparison/components/comparison-table/comparison-table.tsx isNotLastRow rename applied (previous thread fixed); ARIA table roles used correctly; FactValue + SourceLink client boundary is valid Next.js composition; section dividers render correctly.
apps/sim/lib/compare/data/types.ts Clean data model: Fact, ComparisonFacts, CompetitorProfile, and SimFeature are well-typed; unknownFact helper prevents accidental omissions; JSDoc on every field explains intent. Two new AI capability fields (parallelExecution, a2aProtocol) added correctly.
apps/sim/app/(landing)/comparison/comparison-sections.ts defineSection generic enforces row-key correctness at compile time; curated subset of facts displayed (intentional omissions of dataTables, richTextEditor, kbChunkVisibility, companyMaturity from the rendered table); single source of truth for column ordering.
apps/sim/app/(landing)/comparison/fact-status.ts Negative lookahead (?![a-zA-Z]) correctly prevents "Not documented" from being parsed as a no status; parseFactValue is the single parse point used by both FactValue and summarizeFact.
apps/sim/app/(landing)/comparison/components/fact-value/fact-value.tsx Boolean facts render as icon-only; non-boolean facts show shortValue ?? text; full value+detail always present in sr-only span for crawlers; source link wraps the visible affordance (no separate info-icon clutter).
apps/sim/app/sitemap.ts Comparison hub and all 15 detail pages added to sitemap; lastModified uses max(Sim, competitor) verified-date, matching the JSON-LD dateModified on each page — consistent and correct.
apps/sim/app/(landing)/comparison/components/source-info/source-info.tsx Correctly marked 'use client' for Tooltip interactivity; aria-label on anchor is well-formed; progressive enhancement — link works without JS, tooltip requires it.
apps/sim/app/(landing)/comparison/page.tsx Hub page: revalidate = 3600 for ISR; BreadcrumbList + ItemList + FAQPage JSON-LD emitted; hub FAQs use ensurePeriod/lowercaseFirst from utils correctly; spacer div comment explains parity with detail page layout.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["/comparison (hub page)"] -->|lists| B["ALL_COMPETITORS array (utils.ts)"]
    B -->|generates static params| C["/comparison/[provider] (detail page)"]
    D["lib/compare/data/types.ts\nComparisonFacts, CompetitorProfile"] --> E["lib/compare/data/sim.ts\nsimProfile"]
    D --> F["lib/compare/data/competitors/*.ts\n15 competitor profiles"]
    E --> G["lib/compare/data/index.ts\n(barrel)"]
    F --> G
    G --> H["utils.ts\nALL_COMPETITORS, buildFAQs, buildBottomLine"]
    H --> A
    H --> C
    I["comparison-sections.ts\nCOMPARISON_SECTIONS, defineSection"] --> J["ComparisonTable (server)"]
    I --> K["factsToProperties → JSON-LD ItemList"]
    E --> J
    F --> J
    J --> L["FactValue (server)"]
    L --> M["SourceLink ('use client')\nTooltip + anchor"]
    C --> N["BreadcrumbList JSON-LD"]
    C --> K
    C --> O["FAQPage JSON-LD\nbuildComparisonFaqs"]
    C --> P["LandingFAQ UI"]
    H --> Q["sitemap.ts\ncomparisonPages"]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A["/comparison (hub page)"] -->|lists| B["ALL_COMPETITORS array (utils.ts)"]
    B -->|generates static params| C["/comparison/[provider] (detail page)"]
    D["lib/compare/data/types.ts\nComparisonFacts, CompetitorProfile"] --> E["lib/compare/data/sim.ts\nsimProfile"]
    D --> F["lib/compare/data/competitors/*.ts\n15 competitor profiles"]
    E --> G["lib/compare/data/index.ts\n(barrel)"]
    F --> G
    G --> H["utils.ts\nALL_COMPETITORS, buildFAQs, buildBottomLine"]
    H --> A
    H --> C
    I["comparison-sections.ts\nCOMPARISON_SECTIONS, defineSection"] --> J["ComparisonTable (server)"]
    I --> K["factsToProperties → JSON-LD ItemList"]
    E --> J
    F --> J
    J --> L["FactValue (server)"]
    L --> M["SourceLink ('use client')\nTooltip + anchor"]
    C --> N["BreadcrumbList JSON-LD"]
    C --> K
    C --> O["FAQPage JSON-LD\nbuildComparisonFaqs"]
    C --> P["LandingFAQ UI"]
    H --> Q["sitemap.ts\ncomparisonPages"]
Loading

Reviews (6): Last reviewed commit: "fix(comparison): strip Yes/No prefix bef..." | Re-trigger Greptile

Comment thread apps/sim/app/(landing)/comparison/utils.ts Outdated
Comment thread apps/sim/package.json Outdated
…ct copy

- Remove promotional/superlative adjectives applied to competitors
  (Zapier "one of the largest catalogs", Workato "notably wide",
  Retool "seamless"/"trusted solution", OpenAI "cutting-edge",
  Flowise "deep"/"mature"/"most widely adopted", Make "robust")
- Reword the few places Sim's own accurate limitations read as
  unflattering rather than neutral fact (dynamic tool use, model
  fallback, durability, async execution, support channels, tracing)
  without changing the underlying facts
- Restore the "Yes:"/"No:" value prefix on two Sim facts where it was
  accidentally dropped during rewording, since FactValue depends on
  that prefix to render the check/X status icon
- Fix parseFactValue regex to require a word boundary after Yes/No, so
  values like "Not documented"/"Not publicly documented" no longer get
  misread as a boolean "No" and render as neutral text again (Cursor)
- Reword the self-hosting FAQ question to drop the false presupposition
  that the competitor doesn't self-host, which was wrong for n8n,
  Langflow, and Flowise (Greptile)
- Rename isLastRow -> isNotLastRow in comparison-table.tsx to match
  what the variable actually computes (Greptile)
- Move critters to devDependencies; it's a next build -time-only CSS
  inliner, not needed at runtime (Greptile)
- Sitemap lastModified for comparison pages now matches the max(Sim,
  competitor) verified-date logic each page's own JSON-LD dateModified
  already uses, so the two never disagree (Cursor)
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

Comment thread apps/sim/app/(landing)/comparison/page.tsx Outdated
Comment thread apps/sim/app/(landing)/comparison/page.tsx Outdated
- Two hub FAQ answers prepended "Yes." to fact values that already
  start with "Yes:", producing "Yes. Yes: ..." in visible copy and
  FAQPage JSON-LD. Export and reuse ensurePeriod instead of a hardcoded
  prefix.
- The integrations-count FAQ answer ran two sentences together with no
  period before "Combined with...". Fixed with the same ensurePeriod
  helper.
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit fa00f5e. Configure here.

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

… section

The 5 facts it previewed (self-hosting, environment promotion,
human-in-the-loop, pricing model, data residency) are the exact same
rows shown again immediately below in the full comparison table, so
the section read as pure repetition for a human scrolling past it.
Comment thread apps/sim/app/(landing)/comparison/utils.ts Outdated
summarizeFact fed the raw fact value through lowercaseFirst even when
it started with "Yes: "/"No: ", producing broken mid-sentence FAQ text
like "n8n: yes: many providers via dedicated Chat Model nodes." Strip
the boolean prefix first, matching Greptile's suggested fix.
@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@greptile

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@cursor review

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit 98131d2. Configure here.

@waleedlatif1

Copy link
Copy Markdown
Collaborator Author

@waleedlatif1 waleedlatif1 merged commit 4086750 into staging Jul 3, 2026
18 checks passed
@waleedlatif1 waleedlatif1 deleted the worktree-compare-pages-data branch July 3, 2026 04:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant