Skip to content

Conversation

@richiemcilroy
Copy link
Member

@richiemcilroy richiemcilroy commented Sep 1, 2025

Summary by CodeRabbit

  • Chores

    • Updated Cap Pro pricing across app: $12 per user (monthly) or $8.16 per user (when billed annually). Upgrade screens and modals now display and calculate totals using the new rates.
    • Updated internal plan identifiers to match new pricing (no user-facing impact).
  • Documentation

    • Revised pricing copy on homepage, FAQ, and comparison pages to reflect the new rates and clarify “when billed annually.”
  • Style

    • Minor formatting cleanup with no functional or user-visible impact.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 1, 2025

Walkthrough

Cap Pro pricing updated across desktop and web: monthly from $9 to $12 and annual-equivalent from $6 to $8.16. FAQ, marketing pages, and copy adjusted. Stripe plan IDs for production updated in desktop and shared utils. One type declaration file reformatted for quoting; no logic changes.

Changes

Cohort / File(s) Summary
Pricing display updates (UI/Copy)
apps/desktop/src/routes/(window-chrome)/upgrade.tsx, apps/web/components/UpgradeModal.tsx, apps/web/components/pages/FaqPage.tsx, apps/web/components/pages/HomePage/Pricing/ProCard.tsx, apps/web/components/pages/seo/LoomAlternativePage.tsx, apps/web/data/homepage-copy.ts, apps/web/public/llms.txt
Updated Cap Pro per-user prices: monthly $12, annual-billed $8.16. Adjusted displayed amounts, derived constants, and marketing/FAQ text. No behavioral or control-flow changes.
Plan IDs (production)
apps/desktop/src/utils/plans.ts, packages/utils/src/constants/plans.ts
Replaced production Stripe price IDs for monthly and yearly plans with new IDs. Function signatures and behavior unchanged.
Type decl formatting
packages/ui-solid/src/auto-imports.d.ts
Switched double-quoted to single-quoted module specifiers in typeof import(...)['default'] type declarations. No functional impact.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Suggested labels

codex

Suggested reviewers

  • Brendonovich

Poem

A rabbit taps the price with care,
From nine to twelve, new numbers there.
And eight point one six hops in line,
For annual trails that neatly shine.
IDs swapped, the checkout sings—
Carrots counted, shiny things.
Thump-thump! Deploy on velvet springs. 🥕✨

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch price-updates

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

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

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/web/data/homepage-copy.ts (2)

245-248: Fix discount label: 33% → 32%.

$12 → $8.16 is a 32% savings, not 33%. Correct the label to avoid misleading pricing.

Apply this diff:

-        annually: "Annual (save 33%)",
+        annually: "Annual (save 32%)",

290-293: Typo in user-facing copy (“linkes”).

Correct spelling to “links”.

Apply this diff:

-          "Native desktop apps for macOS (Apple Silicon & Intel) and Windows. View your shareable linkes from anywhere.",
+          "Native desktop apps for macOS (Apple Silicon & Intel) and Windows. View your shareable links from anywhere.",
🧹 Nitpick comments (7)
apps/web/components/UpgradeModal.tsx (2)

67-70: Avoid hard-coded prices; derive from shared source.

Use homepageCopy (or a shared constants module) to prevent drift from ProCard and marketing copy.

Apply this diff:

@@
-import { buildEnv } from "@cap/env";
+import { buildEnv } from "@cap/env";
+import { homepageCopy } from "../data/homepage-copy";
@@
-  const pricePerUser = isAnnual ? 8.16 : 12;
+  const CAP_PRO_ANNUAL_PRICE_PER_USER =
+    homepageCopy.pricing.pro.pricing.annual;
+  const CAP_PRO_MONTHLY_PRICE_PER_USER =
+    homepageCopy.pricing.pro.pricing.monthly;
+  const pricePerUser = isAnnual
+    ? CAP_PRO_ANNUAL_PRICE_PER_USER
+    : CAP_PRO_MONTHLY_PRICE_PER_USER;

59-61: Return null from React component guard.

Prefer return null; over bare return; for clarity.

Apply this diff:

-  if (buildEnv.NEXT_PUBLIC_IS_CAP !== "true") return;
+  if (buildEnv.NEXT_PUBLIC_IS_CAP !== "true") return null;
apps/web/components/pages/FaqPage.tsx (1)

12-13: Consider adding monthly price for clarity.

Optionally include “or $12/month billed monthly” to preempt questions.

packages/utils/src/constants/plans.ts (1)

9-10: Stripe price IDs updated—consider DRY refactor
Old IDs are fully removed ✅ and the new IDs only appear in:

  • packages/utils/src/constants/plans.ts
  • apps/desktop/src/utils/plans.ts

Optional: centralize/export plan IDs (e.g. from utils) so both desktop and web share one source and avoid future drift.

apps/web/components/pages/seo/LoomAlternativePage.tsx (1)

30-30: Avoid hard-coded prices; import and interpolate from shared pricing data

  • In apps/web/components/pages/seo/LoomAlternativePage.tsx, replace the literal “$8.16/month” with a template literal using homepageCopy.pricing.pro.pricing.annual (e.g. starts from ${formatMoney(homepageCopy.pricing.pro.pricing.annual)}/month per user).
  • In FreeScreenRecorderPage.tsx and ScreenRecordingSoftwarePage.tsx, replace “$6/month” with ${formatMoney(homepageCopy.pricing.pro.pricing.monthly)}.
  • Use a consistent money formatter (e.g. Intl.NumberFormat or existing formatMoney) when interpolating numeric values.
  • Repo-wide search for “$6” to catch any remaining hard-coded pricing.
packages/ui-solid/src/auto-imports.d.ts (1)

9-9: Generated file shows mixed quoting style

No functional impact, but confirm this file is generator-owned and not manually edited. If style changed, re-run the generator or align its config for consistency.

Also applies to: 16-16, 55-55, 81-81

apps/desktop/src/utils/plans.ts (1)

9-10: Use the shared plan‐ID util instead of duplicating values
In apps/desktop/src/utils/plans.ts (lines 9–10), import and call the existing getProPlanId (or directly reference planIds) from packages/utils/src/constants/plans.ts rather than hardcoding “price_…” strings.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 57c45f2 and 76676d7.

📒 Files selected for processing (10)
  • apps/desktop/src/routes/(window-chrome)/upgrade.tsx (2 hunks)
  • apps/desktop/src/utils/plans.ts (1 hunks)
  • apps/web/components/UpgradeModal.tsx (1 hunks)
  • apps/web/components/pages/FaqPage.tsx (1 hunks)
  • apps/web/components/pages/HomePage/Pricing/ProCard.tsx (2 hunks)
  • apps/web/components/pages/seo/LoomAlternativePage.tsx (3 hunks)
  • apps/web/data/homepage-copy.ts (1 hunks)
  • apps/web/public/llms.txt (1 hunks)
  • packages/ui-solid/src/auto-imports.d.ts (3 hunks)
  • packages/utils/src/constants/plans.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (5)
apps/web/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/web/**/*.{ts,tsx}: Use TanStack Query v5 for client-side server state and data fetching in the web app
Mutations should call Server Actions and perform precise cache updates with setQueryData/setQueriesData, avoiding broad invalidations
Prefer Server Components for initial data and pass initialData to client components for React Query hydration

Files:

  • apps/web/components/UpgradeModal.tsx
  • apps/web/components/pages/FaqPage.tsx
  • apps/web/data/homepage-copy.ts
  • apps/web/components/pages/seo/LoomAlternativePage.tsx
  • apps/web/components/pages/HomePage/Pricing/ProCard.tsx
{apps/web,packages/ui}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

{apps/web,packages/ui}/**/*.{ts,tsx}: Use Tailwind CSS exclusively for styling in the web app and shared React UI components
Component naming: React components in PascalCase; hooks in camelCase starting with 'use'

Files:

  • apps/web/components/UpgradeModal.tsx
  • apps/web/components/pages/FaqPage.tsx
  • apps/web/data/homepage-copy.ts
  • apps/web/components/pages/seo/LoomAlternativePage.tsx
  • apps/web/components/pages/HomePage/Pricing/ProCard.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use strict TypeScript and avoid any; prefer shared types from packages

Files:

  • apps/web/components/UpgradeModal.tsx
  • packages/utils/src/constants/plans.ts
  • apps/desktop/src/routes/(window-chrome)/upgrade.tsx
  • apps/web/components/pages/FaqPage.tsx
  • apps/web/data/homepage-copy.ts
  • apps/web/components/pages/seo/LoomAlternativePage.tsx
  • apps/desktop/src/utils/plans.ts
  • apps/web/components/pages/HomePage/Pricing/ProCard.tsx
  • packages/ui-solid/src/auto-imports.d.ts
apps/desktop/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

apps/desktop/**/*.{ts,tsx}: In the desktop app, rely on unplugin-icons auto-imports; do not manually import icon modules
Use generated tauri_specta commands/events (commands, events) in the desktop frontend; listen to generated events directly
Use @tanstack/solid-query for server state in the desktop app

Files:

  • apps/desktop/src/routes/(window-chrome)/upgrade.tsx
  • apps/desktop/src/utils/plans.ts
{apps/desktop,packages/ui-solid}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Component naming (Solid): components in PascalCase; hooks/utilities in camelCase starting with 'use' where applicable

Files:

  • apps/desktop/src/routes/(window-chrome)/upgrade.tsx
  • apps/desktop/src/utils/plans.ts
  • packages/ui-solid/src/auto-imports.d.ts
🧠 Learnings (1)
📚 Learning: 2025-08-25T10:58:06.142Z
Learnt from: CR
PR: CapSoftware/Cap#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-25T10:58:06.142Z
Learning: Applies to apps/desktop/**/*.{ts,tsx} : In the desktop app, rely on unplugin-icons auto-imports; do not manually import icon modules

Applied to files:

  • packages/ui-solid/src/auto-imports.d.ts
🪛 LanguageTool
apps/web/public/llms.txt

[grammar] ~81-~81: There might be a mistake here.
Context: ...- includes cloud storage and AI features - Teams: Custom pricing for organization...

(QB_NEW_EN)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Build Desktop (x86_64-pc-windows-msvc, windows-latest)
  • GitHub Check: Build Desktop (aarch64-apple-darwin, macos-latest)
  • GitHub Check: Analyze (rust)
🔇 Additional comments (6)
apps/web/data/homepage-copy.ts (1)

241-243: Prices updated correctly.

Annual and monthly per-user values align with the PR objective.

apps/web/public/llms.txt (1)

81-82: Pricing line updated — looks good.

Matches $12 monthly / $8.16 when billed annually.

apps/web/components/pages/FaqPage.tsx (1)

12-13: FAQ pricing copy aligned.

$8.16/month (when billed annually) matches the new pricing.

apps/web/components/pages/HomePage/Pricing/ProCard.tsx (1)

134-142: LGTM: totals now computed from centralized per-user prices.

Using homepageCopy-derived constants removes duplicated literals.

Also applies to: 158-166

apps/web/components/pages/seo/LoomAlternativePage.tsx (1)

109-109: LGTM: pricing FAQ copy update is clear and accurate

Reads well and correctly notes “when billed annually.”

apps/desktop/src/routes/(window-chrome)/upgrade.tsx (1)

497-499: LGTM: toggle hint prices/billing text align with new pricing

Monthly shows $12; annual shows $8.16 when billed annually. Consistent with the PR objective.

Comment on lines +475 to 477
{isProAnnual() ? "$8.16" : "$12"}
<span class="text-gray-10 text-[16px]">.00 /</span>
</h3>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Price formatting bug: renders “$8.16.00 /” for annual

Use currency formatting and drop the hard-coded “.00”.

-          {isProAnnual() ? "$8.16" : "$12"}
-          <span class="text-gray-10 text-[16px]">.00 /</span>
+          {(isProAnnual() ? 8.16 : 12).toLocaleString(undefined, {
+            style: "currency",
+            currency: "USD",
+            minimumFractionDigits: 2,
+            maximumFractionDigits: 2,
+          })}
+          <span class="text-gray-10 text-[16px]">/</span>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{isProAnnual() ? "$8.16" : "$12"}
<span class="text-gray-10 text-[16px]">.00 /</span>
</h3>
{(isProAnnual() ? 8.16 : 12).toLocaleString(undefined, {
style: "currency",
currency: "USD",
minimumFractionDigits: 2,
maximumFractionDigits: 2,
})}
<span class="text-gray-10 text-[16px]">/</span>
</h3>
🤖 Prompt for AI Agents
In apps/desktop/src/routes/(window-chrome)/upgrade.tsx around lines 475-477, the
markup currently concatenates a hard-coded “.00” span after a literal price
string which causes outputs like “$8.16.00 /”; replace this with a single
formatted currency value: compute the numeric price as a number (e.g. dollars as
8.16 or cents converted to dollars), use Intl.NumberFormat('en-US', { style:
'currency', currency: 'USD' }) to produce the full formatted string (no extra
“.00” span), and render that formatted string conditionally for isProAnnual() vs
monthly pricing, removing the separate span entirely so the output reads
correctly like "$8.16 /" or "$12.00 /" depending on the value.

title: "Half the Price of Loom",
description:
"Cap is just $9/month per user, compared to Loom's $18/month per user. Plus, Cap offers a generous free plan that includes Studio mode for personal use.",
"Cap stars from just $8.16/month per user, compared to Loom's $18/month per user. Plus, Cap offers a generous free plan that includes Studio mode for personal use.",
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Typo: “stars” → “starts” and clarify annual billing

Fix the copy to read naturally and disclose billing basis.

-        "Cap stars from just $8.16/month per user, compared to Loom's $18/month per user. Plus, Cap offers a generous free plan that includes Studio mode for personal use.",
+        "Cap starts from just $8.16/month per user when billed annually, compared to Loom's $18/month per user. Plus, Cap offers a generous free plan that includes Studio mode for personal use.",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"Cap stars from just $8.16/month per user, compared to Loom's $18/month per user. Plus, Cap offers a generous free plan that includes Studio mode for personal use.",
"Cap starts from just $8.16/month per user when billed annually, compared to Loom's $18/month per user. Plus, Cap offers a generous free plan that includes Studio mode for personal use.",
🤖 Prompt for AI Agents
In apps/web/components/pages/seo/LoomAlternativePage.tsx around line 30, fix the
typo "stars" → "starts" and clarify the billing basis by changing the copy to
state that the $8.16/month price is when billed annually; e.g., update the
sentence to read naturally like "Cap starts from $8.16/month per user when
billed annually, compared to Loom's $18/month per user. Plus, Cap offers a
generous free plan that includes Studio mode for personal use." Ensure
punctuation and spacing remain correct.

rows: [
["Open Source", "✅ Yes", "❌ No"],
["Pricing", "✅ $9/month per user", "⚠️ $18/month per user"],
["Pricing", "✅ $from 8.16/month per user", "⚠️ $18/month per user"],
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Copy bug: stray “$from” and missing dollar before amount

Render “from $8.16/month per user”.

-      ["Pricing", "✅ $from 8.16/month per user", "⚠️ $18/month per user"],
+      ["Pricing", "✅ from $8.16/month per user", "⚠️ $18/month per user"],
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
["Pricing", "✅ $from 8.16/month per user", "⚠️ $18/month per user"],
["Pricing", "✅ from $8.16/month per user", "⚠️ $18/month per user"],
🤖 Prompt for AI Agents
In apps/web/components/pages/seo/LoomAlternativePage.tsx around line 128, the
pricing string currently contains a stray " $from" and is missing a dollar sign
before the amount; update the array entry to render "from $8.16/month per user"
by replacing the string "✅ $from 8.16/month per user" with "✅ from $8.16/month
per user" (ensure spacing and punctuation match surrounding items).

@richiemcilroy richiemcilroy merged commit 00f22bf into main Sep 2, 2025
15 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