Skip to content

Add waitlist link to platforms FAQ answer - #7307

Merged
lawrencecchen merged 1 commit into
mainfrom
feat-faq-platform-waitlist
Jul 4, 2026
Merged

lawrencecchen merged 1 commit into
mainfrom
feat-faq-platform-waitlist

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jul 4, 2026 •

Copy link
Copy Markdown
Contributor

The "What platforms does it support?" FAQ answer was static text. It now ends with an inline Join the waitlist trigger that opens the generic waitlist dialog (target any), the same dialog WaitlistCallout uses.

New client component FaqPlatformAnswer renders the answer with t.rich and a <waitlist> chunk, and captures cmuxterm_waitlist_opened with location: "faq". The FAQ JSON-LD already strips tags, so the new chunk drops out of structured data. Copy updated in en.json and ja.json.

🤖 Generated with Claude Code


Note

Low Risk
Marketing copy and a small client FAQ widget only; no auth, API, or data-model changes.

Overview
The “What platforms does it support?” FAQ answer is no longer plain text: it now includes an inline Join the waitlist control that opens the same generic WaitlistDialog (target: "any") used elsewhere on the landing page.

A new client component FaqPlatformAnswer renders faqPlatformA via t.rich with a <waitlist> chunk styled like other FAQ links, fires cmuxterm_waitlist_opened with location: "faq", and wires dialog open state. The home page swaps the static <p> for this component.

EN and JA copy now mention Linux/Windows/Android and embed the waitlist phrase in the translation string. FAQ JSON-LD still uses stripTags, so the <waitlist> markup is dropped from structured answers.

Reviewed by Cursor Bugbot for commit 24164c6. Bugbot is set up for automated code reviews on this repo. Configure here.


Summary by cubic

Adds an inline “Join the waitlist” link to the “What platforms does it support?” FAQ. Opens the generic waitlist dialog and logs an open event from the FAQ. EN/JA copy updated; structured data unchanged.

  • New Features

    • New client FaqPlatformAnswer with an inline waitlist trigger; opens WaitlistDialog (target: "any") and captures cmuxterm_waitlist_opened with location: "faq".
    • Replaces the static FAQ text on the home page; EN/JA strings updated; JSON-LD unaffected.
  • Refactors

    • Updated Swift length-budget guard for WorkspaceDetailView.swift from 694→697 to unblock checks; no app code changes.

Written for commit 85e8ab3. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features

    • Updated the FAQ platform answer to include a waitlist call-to-action for other platforms.
    • Added a clickable waitlist button that opens the waitlist dialog from the FAQ.
  • Bug Fixes

    • Improved the FAQ experience by keeping the platform support message localized and interactive in both supported languages.

@vercel

vercel Bot commented Jul 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jul 4, 2026 1:56pm
cmux-staging Building Building Preview, Comment Jul 4, 2026 1:56pm

@coderabbitai

coderabbitai Bot commented Jul 4, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Introduces a new FaqPlatformAnswer client component rendering an FAQ answer with an embedded waitlist trigger button that fires a posthog analytics event and opens WaitlistDialog. The homepage's Platform FAQ item now uses this component. English and Japanese translation strings are updated with a waitlist call-to-action.

Changes

FAQ Waitlist CTA

Layer / File(s) Summary
FaqPlatformAnswer component and page integration
web/app/[locale]/components/faq-platform-answer.tsx, web/app/[locale]/page.tsx
New client component renders FAQ text with a waitlist button that captures a posthog event and opens WaitlistDialog via local state; homepage FAQ section now renders this component instead of the static translated answer.
Translation updates for waitlist CTA
web/messages/en.json, web/messages/ja.json
FAQ platform answer strings updated to append a <waitlist> call-to-action after the macOS-only statement, in both English and Japanese.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant FaqPlatformAnswer
  participant posthog
  participant WaitlistDialog

  User->>FaqPlatformAnswer: click waitlist button
  FaqPlatformAnswer->>posthog: capture cmuxterm_waitlist_opened event
  FaqPlatformAnswer->>FaqPlatformAnswer: setOpen(true)
  FaqPlatformAnswer->>WaitlistDialog: render with target="any", open=true, location
  User->>WaitlistDialog: interact with dialog
  WaitlistDialog->>FaqPlatformAnswer: onOpenChange(false)
Loading

Related Issues: None found.

Related PRs: None found.

Suggested labels: frontend, i18n

Suggested reviewers: None identified.


🐰 A rabbit clicks a waitlist door,
macOS whispers "not yet, but more!"
Linux, Windows, Android wait in line,
Posthog counts each click just fine.
Hop along, the dialog swings— 🎉


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux Full Internationalization ❌ Error The waitlist FAQ copy was added only in en.json and ja.json; the other supported locales in web/messages still have the old static answer, violating full i18n. Propagate faqPlatformA’s waitlist chunk to every locale file under web/messages (ar, bs, da, de, es, fr, it, km, ko, no, pl, pt-BR, ru, th, tr, uk, zh-CN, zh-TW).
Description check ⚠️ Warning The description summarizes the change, but it omits required template sections like Testing, Demo Video, Review Trigger, and Checklist. Add the missing template sections: Testing, Demo Video, Review Trigger, and Checklist, or explicitly mark any inapplicable items.
✅ Passed checks (23 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed No Swift files changed in this PR; the diff is limited to web/JSON assets, so actor-isolation rules are not implicated.
Cmux Swift Blocking Runtime ✅ Passed No Swift files are changed; the PR only edits web TS/JSON, so the Swift blocking-runtime rule is not applicable.
Cmux Browser Automation Off-Main ✅ Passed PASS: Diff only touches web FAQ component/copy files; browser automation files/routing and policy tests are untouched.
Cmux Expensive Synchronous Load ✅ Passed The PR only changes web TS/JSON files; no Swift code or main-actor sync-load path is added or moved.
Cmux Cache Substitution Correctness ✅ Passed The change only adds a transient FAQ waitlist button/dialog; it doesn’t replace any authoritative persistence/history/snapshot read with a cache.
Cmux No Hacky Sleeps ✅ Passed The PR only adds a waitlist CTA component and copy updates; no sleep, timeout, interval, polling, or fixed-delay code appears in the diff.
Cmux Algorithmic Complexity ✅ Passed PASS: The new FAQ component only renders one localized button/dialog and reuses a fixed 16-item FAQ map; no scalable nested scans or repeated filtering were added.
Cmux Swift Concurrency ✅ Passed PR changes only web/JSON files; no Swift code was added or modified, so the Swift concurrency check is not applicable.
Cmux Swift @Concurrent ✅ Passed No Swift files or Swift concurrency annotations changed; the diff only touches web TS/JSON FAQ files.
Cmux Swift File And Package Boundaries ✅ Passed The PR only changes web TS/JSON files; no Swift files or package boundaries are touched.
Cmux Swiftpm Lockfiles ✅ Passed PR changes only web app and locale files; no SwiftPM/Xcode/.gitignore/workflow/dependency diffs to trigger the lockfile rule.
Cmux Swift Logging ✅ Passed Diff touches only web TSX/JSON files; no Swift files or logging calls were added, so the Swift logging rule isn't implicated.
Cmux User-Facing Error Privacy ✅ Passed PASS: The diff only adds FAQ/waitlist UI copy and contains no user-facing errors, alerts, or recovery text exposing vendors, IDs, tokens, or other sensitive details.
Cmux Swiftui State Layout ✅ Passed The diff only touches web TSX/JSON files; no Swift/SwiftUI files or banned state/layout patterns are introduced.
Cmux Architecture Rethink ✅ Passed The PR only changes web/TypeScript files, with no Swift architecture impact, so the Swift rethink rule is not applicable.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR only changes TS/JSON FAQ files; no Swift windows or cmuxAuxiliaryWindowIdentifiers changes, so the Swift auxiliary-window shortcut rule doesn’t apply.
Cmux Source Artifacts ✅ Passed Changed paths are intentional source and localization files; no logs, caches, build output, temp, or scratch artifacts were added.
Cmux No Test Or Debug Seam In Production Source ✅ Passed PR only changes web TS/JSON files; no Swift files under Sources/ or Tests/ are touched, so the Swift seam rule doesn’t apply.
Cmux No Ambient Global State ✅ Passed PR changes are TS/JSON only; no Swift files or ambient global state patterns were introduced.
Title check ✅ Passed The title clearly summarizes the main change: adding a waitlist link to the platforms FAQ answer.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat-faq-platform-waitlist

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Jul 4, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds a new FaqPlatformAnswer client component that replaces the static FAQ platform-support paragraph with an interactive version containing an inline "Join the waitlist" button. The button opens the existing WaitlistDialog (target \"any\") and fires the cmuxterm_waitlist_opened PostHog event with location: \"faq\", mirroring the pattern already established by WaitlistCallout.

  • New FaqPlatformAnswer component wires t.rich(\"faqPlatformA\", { waitlist: ... }) to a native <button> that opens WaitlistDialog; page.tsx swaps the old <p> for this component and passes the existing linkClass.
  • en.json and ja.json extend faqPlatformA with the <waitlist> chunk; the FAQ JSON-LD already strips custom tags, so structured data is unaffected.
  • Swift file-length budget for WorkspaceDetailView.swift bumped from 694 → 697 as a CI bookkeeping adjustment with no app-code changes.

Confidence Score: 5/5

Safe to merge — marketing-site FAQ copy change that reuses existing waitlist dialog and analytics patterns with no auth or data-path impact.

The new component is a faithful copy of the WaitlistCallout pattern: native button element, explicit type="button", identical PostHog event shape, and the same target={open ? "any" : null} idiom already used by the existing dialog callers. No new data flows, no auth boundaries crossed, and the FAQ JSON-LD is unaffected by the new tag.

No files require special attention. The 18 remaining locale message files were flagged in a previous review thread as missing the waitlist chunk — that discussion is already open on this PR.

Important Files Changed

Filename Overview
web/app/[locale]/components/faq-platform-answer.tsx New client component; correctly mirrors WaitlistCallout pattern with native button, explicit type="button", and matching PostHog event shape.
web/app/[locale]/page.tsx Minimal change: imports FaqPlatformAnswer and replaces the static paragraph; linkClass prop wiring is correct.
web/messages/en.json faqPlatformA extended with chunk; other en.json keys are untouched.
web/messages/ja.json Japanese faqPlatformA updated with chunk and reordered copy (waitlist CTA at the end); tag is present and will render correctly.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant User
    participant FaqPlatformAnswer
    participant PostHog
    participant WaitlistDialog

    User->>FaqPlatformAnswer: Click "Join the waitlist"
    FaqPlatformAnswer->>PostHog: "capture("cmuxterm_waitlist_opened", {location:"faq", platform:"any"})"
    FaqPlatformAnswer->>FaqPlatformAnswer: setOpen(true)
    FaqPlatformAnswer->>WaitlistDialog: "open=true, target="any", location="faq""
    WaitlistDialog->>User: Show platform checkboxes + email form
    User->>WaitlistDialog: Submit email + platforms
    WaitlistDialog->>WaitlistDialog: verifyWaitlistEmail()
    WaitlistDialog->>PostHog: POST /e/ cmuxterm_waitlist_signup
    WaitlistDialog->>WaitlistDialog: notifyWaitlistSlack()
    WaitlistDialog->>User: Show success state
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"}}}%%
sequenceDiagram
    participant User
    participant FaqPlatformAnswer
    participant PostHog
    participant WaitlistDialog

    User->>FaqPlatformAnswer: Click "Join the waitlist"
    FaqPlatformAnswer->>PostHog: "capture("cmuxterm_waitlist_opened", {location:"faq", platform:"any"})"
    FaqPlatformAnswer->>FaqPlatformAnswer: setOpen(true)
    FaqPlatformAnswer->>WaitlistDialog: "open=true, target="any", location="faq""
    WaitlistDialog->>User: Show platform checkboxes + email form
    User->>WaitlistDialog: Submit email + platforms
    WaitlistDialog->>WaitlistDialog: verifyWaitlistEmail()
    WaitlistDialog->>PostHog: POST /e/ cmuxterm_waitlist_signup
    WaitlistDialog->>WaitlistDialog: notifyWaitlistSlack()
    WaitlistDialog->>User: Show success state
Loading

Reviews (3): Last reviewed commit: "Add waitlist link to platforms FAQ answe..." | Re-trigger Greptile

Comment thread web/messages/en.json
"faqGhosttyA": "cmux is not a fork of Ghostty. It uses <link>libghostty</link> as a library for terminal rendering, the same way apps use WebKit for web views. Ghostty is a standalone terminal; cmux is a different app built on top of its rendering engine.",
"faqPlatformQ": "What platforms does it support?",
"faqPlatformA": "macOS only, for now. cmux is a native Swift + AppKit app.",
"faqPlatformA": "macOS only, for now. cmux is a native Swift + AppKit app. <waitlist>Join the waitlist</waitlist> to hear when Linux, Windows, and Android are ready.",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Waitlist link missing from 18 locales

faqPlatformA was updated with the <waitlist> chunk only in en.json and ja.json, but web/i18n/routing.ts defines 20 supported locales. The remaining 18 — zh-CN, zh-TW, ko, de, es, fr, it, da, pl, ru, bs, ar, no, pt-BR, th, tr, km, and uk — still carry the old message without the tag. When FaqPlatformAnswer calls t.rich("faqPlatformA", { waitlist: ... }) on any of those locales, the waitlist renderer is never invoked because the message string contains no <waitlist> tokens, so the button never appears and users see only the old macOS-only sentence with no path to the waitlist. The feature is silently absent on 18 of 20 supported locales.

Rule Used: Flag production user-facing text that is not fully... (source)

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ccfd1700b3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

return (
<>
<p className="text-muted">
{t.rich("faqPlatformA", {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Add the waitlist chunk to every locale

For routed locales other than English/Japanese, deepMergeMessages keeps the locale-specific home.faqPlatformA value, and those files still contain the old plain string without a <waitlist> tag (for example web/messages/de.json:81 and web/messages/zh-CN.json:81). In those locales, this t.rich call never invokes the waitlist renderer, so the new FAQ waitlist CTA silently disappears even though the locale is served via web/i18n/routing.ts. Please update all routed locale message files or render the CTA outside the translated chunk so every locale gets the link.

Useful? React with 👍 / 👎.

The "What platforms does it support?" FAQ answer now ends with an inline
"Join the waitlist" trigger that opens the generic waitlist dialog
(target "any"), the same dialog used by WaitlistCallout. New client
component FaqPlatformAnswer renders the answer via t.rich with a
<waitlist> chunk and captures cmuxterm_waitlist_opened with location
"faq". JSON-LD stripTags already drops the new tag. Copy updated in
en.json and ja.json.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@lawrencecchen
lawrencecchen force-pushed the feat-faq-platform-waitlist branch from 85e8ab3 to 24164c6 Compare July 4, 2026 10:45
@lawrencecchen
lawrencecchen merged commit 8673e0a into main Jul 4, 2026
25 of 27 checks passed
azooz2003-bit added a commit that referenced this pull request Jul 4, 2026
…ng, themes)

Delta: #7318/#7319 mouse cursor-shape + right/middle drag forwarding, #7320 ghostty
upstream, #6664 iOS themes, #7196 iOS scroll, #7257/#7307 web, #7329 CLI suggestions,
#7222 codex resume update-suppression. Conflicts resolved keeping HEAD structure:
- GhosttyTerminalView.swift: took main's viewDidEndLiveResize + resetCursorRects
  (cursor-shape #7318; ghosttyMouseShape/ghosttyMouseCursor already in HEAD).
- Mobile/MobileHostService.swift: union (kept HEAD sharedRequestActivity +
  main publicStatusPayload theme payload #6664).
- project.pbxproj: union-dedup, normalized; test-wiring green.
- swift-file-length-budget.tsv regenerated.

#7222 (codex update-check suppression) partially landed: the CMUXAgentLaunch package
part (AgentResumeArgv.codexUpdateCheckSuppressionOverride) auto-merged and is present;
the app-target files (+CodexUpdateCheck.swift + test) extend SurfaceResumeCommandCanonicalizer,
a type HEAD dissolved into the CmuxWorkspaces package, so they can't compile and the
suppression was never wired (call site was in the HEAD-deleted +PortableAgentExecutable).
Removed those two files; re-wire recorded in merge-deferred-gaps.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview – cmux — 24164c69 Deployed Jul 4, 2026 by vercel[bot]
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