Skip to content

feat(compare): rewrite /compare for the current wedge; stop leading on Raft - #763

Merged
samxu01 merged 1 commit into
mainfrom
feat/compare-page-alternatives
Jul 27, 2026
Merged

feat(compare): rewrite /compare for the current wedge; stop leading on Raft#763
samxu01 merged 1 commit into
mainfrom
feat/compare-page-alternatives

Conversation

@lilyshen0722

Copy link
Copy Markdown
Contributor

Why

The /compare page led with "the difference is ownership" and compared only against Raft. Both are now wrong.

Ownership isn't our wedge. Buzz is Apache-2.0, self-hostable and backed by Block. Any framing whose punchline is "we're the open one" loses to Buzz on its own terms.

A single-competitor page anchors visitors on a company they've never heard of. The landing page linked "Compare to Raft" four times (nav, two CTAs, footer) — free marketing for a competitor, on our own front door.

What changed

Before After
Thesis "The difference is ownership" Concede the parity, then what a team has to accept
Alternatives Raft only Buzz, Multica, Raft, and the incumbent workspaces
Layout 7-row checkmark grid we win Prose cards
Landing CTA "Compare to Raft" "How we compare"
Doc docs/commonly-vs-raft.md docs/commonly-vs-alternatives.md

The page now opens by conceding what's genuinely the same — agent-to-agent work and persistent per-agent memory are the shared bet, not our differentiator, and we don't claim to have described it first. Leading with that is what makes the rest believable.

Deliberately not a checkmark grid. A table we win every row of invites the cherry-picked-rows objection, and prose cards stack on mobile without needing a grid-template-columns override.

Claims discipline

Written into both the doc and the component header, because we've now made this mistake four times:

Never claim an alternative lacks a feature without a primary source that says so.

Earlier competitive drafts asserted Raft had no agent-to-agent collaboration and Buzz had no persistent memory. Both false — Raft's a2a is a headline feature with a published production metric, Buzz's memory is a signed spec (kind:30174) on by default. Both came from inferring absence from a single document.

The same rule now explicitly covers incumbents: "Slack bots are second-class" is no longer true. Slack ships autonomous AI apps and third-party agent surfaces, the Teams SDK ships MCP/A2A and agentic identity via Entra Agent ID, and Lark defines bots as group members with Docs/Base/Tasks/Calendar. Only definitional claims survive — they're SaaS, and their agent identity is vendor-scoped.

Verification

Real browser, because jsdom has no layout engine and this replaced a table with a grid:

  • 1280px and 390px — zero horizontal overflow at both, no offending elements
  • Cards stack to a single column on mobile via auto-fit + minmax(min(100%, 280px), 1fr)) — no media query needed
  • Both locales render with no missing keys; zh-CN checked in-browser at 390px
  • Mark icon uses align-items: flex-start so it sits on the first line when a card title wraps
Test Suites: 68 passed, 68 total
Tests:      308 passed, 308 total

Lint 0 errors. The 2 lint warnings and 5 typecheck errors present are pre-existing on main and touch none of these files (verified by stashing).

Reviewer note

🇨🇳 The zh-CN copy needs Sam's native pass before merge, per the i18n merge gate. I wrote it against the established glossary (agent → 智能体, memory → 记忆, DM → 私信, token → 令牌) but a native read is the gate, not my draft.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RWkf1SuYRHosxnPqsXwaVa

…n Raft

The page led with "the difference is ownership" and compared only against
Raft. Both are now wrong.

Ownership is not our wedge. Buzz is Apache-2.0, self-hostable and backed by
Block, so any framing whose punchline is "we're the open one" loses to Buzz on
its own terms. And a single-competitor page anchors visitors on a company most
of them have never heard of -- our homepage linked "Compare to Raft" four
times, which is free marketing for a competitor.

Now: concede the parity first (agent-to-agent work and per-agent memory are the
shared bet, not our differentiator), then what a team has to accept from each
of Buzz, Multica, Raft and the incumbent workspaces, then what we do
differently -- AI-native, built for the second agent, yours to run, humans are
seats.

Deliberately NOT a checkmark grid. A table we win every row of invites the
cherry-picked-rows objection, and prose cards stack on mobile without a
grid-template override.

Claims discipline, now written into both the doc and the component header:
never assert an alternative LACKS something without a primary source. Earlier
competitive drafts claimed Raft had no a2a and Buzz had no memory -- both false,
both inferred from a single document. The same rule now covers incumbents:
"Slack bots are second-class" is no longer true given Slack AI apps, Teams
Entra Agent ID, and Lark bots-as-group-members.

Renamed landing.actions.compareRaft -> landing.actions.compare; the key named a
competitor and the label now reads "How we compare".

Verified in a real browser (jsdom has no layout engine): 1280px and 390px, zero
horizontal overflow, cards stack to one column, both locales render with no
missing keys. 308/308 frontend tests pass. Typecheck errors and lint warnings
present are pre-existing on main and touch none of these files.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RWkf1SuYRHosxnPqsXwaVa
@samxu01
samxu01 merged commit 7bd6149 into main Jul 27, 2026
10 checks passed
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.

2 participants