Conversation
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughAdds Stripe payouts config to account-session payload, introduces dashboard Payouts pages and navigation, implements subscription cancellation endpoints and client APIs, adds grant-product POST, updates imports, and expands end-to-end tests for product granting and cancellation. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant Browser as Browser (Dashboard)
participant Frontend as Dashboard Frontend
participant Backend as Backend API
participant Stripe as Stripe API
Browser->>Frontend: navigate to /projects/:id/payments/payouts
Frontend->>Frontend: render PageClient -> StripeConnectProvider -> ConnectPayouts
ConnectPayouts->>Backend: request account session (POST /internal/.../account-session)
Backend->>Stripe: create account session (payload includes components.payouts)
Stripe-->>Backend: account session response
Backend-->>Frontend: return session data
Frontend-->>Browser: initialize Stripe widget with session
Browser->>Stripe: Stripe widget interactions (connect/confirm payouts)
Stripe-->>Backend: webhook/events (optional) — payout and account updates
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ❌ 3❌ Failed checks (2 warnings, 1 inconclusive)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
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. Comment |
Greptile OverviewGreptile SummaryAdded payouts management tab to the payments dashboard that displays Stripe's embedded payouts widget for viewing and managing payment disbursements. Key Changes
Issues Found
Confidence Score: 4/5
Important Files ChangedFile Analysis
Sequence DiagramsequenceDiagram
participant User as User/Browser
participant Page as Payouts Page
participant Provider as StripeConnectProvider
participant AdminApp as StackAdminApp
participant API as Backend API
participant Stripe as Stripe API
participant Widget as ConnectPayouts Widget
User->>Page: Navigate to /payments/payouts
Page->>Provider: Render with StripeConnectProvider
Provider->>AdminApp: getStripeConnectInstance()
Provider->>API: createStripeWidgetAccountSession()
API->>Stripe: accountSessions.create()
Note over API,Stripe: Components: payments, notification_banner, payouts
Stripe-->>API: Return client_secret
API-->>Provider: Return client_secret
Provider->>Stripe: loadConnectAndInitialize(client_secret)
Stripe-->>Provider: ConnectInstance
Provider->>Widget: Render ConnectPayouts
Widget->>Stripe: Fetch payout data
Stripe-->>Widget: Return payout information
Widget-->>User: Display payouts interface
|
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
Show resolved
Hide resolved
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx (1)
1-9: Drop"use client"here; keeppage.tsxas a server wrapper like the other Payments pages.
This avoids widening the client boundary for the entire route when the wrapper itself has no client-only logic.-"use client"; - import PageClient from "./page-client"; export default function Page() { return ( <PageClient /> ); }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
apps/backend/src/app/api/latest/internal/payments/stripe-widgets/account-session/route.ts(1 hunks)apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsx(1 hunks)apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsx(1 hunks)apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx(1 hunks)apps/dashboard/src/lib/apps-frontend.tsx(1 hunks)
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Always add new E2E tests when changing the API or SDK interface
For blocking alerts and errors, never use toast; use alerts instead as they are less easily missed by the user
NEVER try-catch-all, NEVER void a promise, and NEVER .catch(console.error); use loading indicators and async callbacks instead, or use runAsynchronously/runAsynchronouslyWithAlert for error handling
Use ES6 maps instead of records wherever you can
Files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsxapps/backend/src/app/api/latest/internal/payments/stripe-widgets/account-session/route.tsapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsxapps/dashboard/src/lib/apps-frontend.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
**/*.{ts,tsx,css}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,css}: Keep hover/click transitions snappy and fast; avoid fade-in delays on hover. Apply transitions after action completion instead, like smooth fade-out when hover ends
Use hover-exit transitions instead of hover-enter transitions; for example, use 'transition-colors hover:transition-none' instead of fade-in on hover
Files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsxapps/backend/src/app/api/latest/internal/payments/stripe-widgets/account-session/route.tsapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsxapps/dashboard/src/lib/apps-frontend.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
apps/**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
NEVER use Next.js dynamic functions if you can avoid them; prefer using client components and hooks like usePathname instead of await params to keep pages static
Files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsxapps/backend/src/app/api/latest/internal/payments/stripe-widgets/account-session/route.tsapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsxapps/dashboard/src/lib/apps-frontend.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
{.env*,**/*.{ts,tsx,js}}
📄 CodeRabbit inference engine (AGENTS.md)
Prefix environment variables with STACK_ (or NEXT_PUBLIC_STACK_ if public) so changes are picked up by Turborepo and improves readability
Files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsxapps/backend/src/app/api/latest/internal/payments/stripe-widgets/account-session/route.tsapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsxapps/dashboard/src/lib/apps-frontend.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
apps/dashboard/**/*
📄 CodeRabbit inference engine (AGENTS.md)
When making changes in the dashboard, provide the user with a deep link to the dashboard page changed, usually in the form of http://localhost:<NEXT_PUBLIC_STACK_PORT_PREFIX>01/projects/-selector-/... or using a.localhost, b.localhost, c.localhost for port prefixes 91, 92, 93
Files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsxapps/dashboard/src/lib/apps-frontend.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
apps/**/*.tsx
📄 CodeRabbit inference engine (AGENTS.md)
Check existing apps for inspiration when implementing new apps or pages; update apps-frontend.tsx and apps-config.ts to add new apps
Files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsxapps/dashboard/src/lib/apps-frontend.tsxapps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
🧠 Learnings (2)
📚 Learning: 2025-12-04T18:03:49.984Z
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T18:03:49.984Z
Learning: Applies to apps/**/*.tsx : Check existing apps for inspiration when implementing new apps or pages; update apps-frontend.tsx and apps-config.ts to add new apps
Applied to files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsxapps/dashboard/src/lib/apps-frontend.tsx
📚 Learning: 2025-12-04T18:03:49.984Z
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T18:03:49.984Z
Learning: Applies to apps/**/*.{ts,tsx} : NEVER use Next.js dynamic functions if you can avoid them; prefer using client components and hooks like usePathname instead of await params to keep pages static
Applied to files:
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
🧬 Code graph analysis (2)
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsx (1)
apps/dashboard/src/components/payments/stripe-connect-provider.tsx (1)
StripeConnectProvider(33-52)
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx (3)
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsx (1)
PageClient(7-16)apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/transactions/page.tsx (1)
Page(3-5)apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/customers/page.tsx (1)
Page(7-9)
⏰ 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). (12)
- GitHub Check: Vercel Agent Review
- GitHub Check: build (22.x)
- GitHub Check: restart-dev-and-test-with-custom-base-port
- GitHub Check: docker
- GitHub Check: build (22.x)
- GitHub Check: lint_and_build (latest)
- GitHub Check: E2E Tests (Node 22.x, Freestyle prod)
- GitHub Check: E2E Tests (Node 22.x, Freestyle mock)
- GitHub Check: all-good
- GitHub Check: check_prisma_migrations (22.x)
- GitHub Check: restart-dev-and-test
- GitHub Check: setup-tests
🔇 Additional comments (3)
apps/dashboard/src/lib/apps-frontend.tsx (1)
138-143: Navigation entry is consistent with existing Payments items (./...) and should route correctly.apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/layout.tsx (1)
14-15: Import paths resolve correctly; no action needed.Both imports reference existing files with the correct exports:
../app-enabled-guard→AppEnabledGuardfunction (line 11 of app-enabled-guard.tsx) ✓../use-admin-app→useAdminAppfunction (line 29 of use-admin-app.tsx) ✓apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsx (1)
1-16: Code follows Stripe's documented pattern forConnectPayouts.The
ConnectPayoutscomponent is correctly used without props and is properly nested withinStripeConnectProvider, which handles the requiredConnectInstanceinitialization. No modifications needed.
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page-client.tsx
Show resolved
Hide resolved
apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/payments/payouts/page.tsx
Show resolved
Hide resolved
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
<!-- Make sure you've read the CONTRIBUTING.md guidelines: https://github.com/stack-auth/stack-auth/blob/dev/CONTRIBUTING.md -->
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
apps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/route.ts (1)
86-155: Avoid passingundefinedintoProductCustomerTypeDoesNotMatchfor inline-product grants.When granting via
product_inline,body.product_idisundefined, but you pass it intoKnownErrors.ProductCustomerTypeDoesNotMatch(...)(Line 126-131). This risks confusing error payloads (or a runtime/type mismatch depending on constructor expectations).Proposed fix
- throw new KnownErrors.ProductCustomerTypeDoesNotMatch( - body.product_id, + throw new KnownErrors.ProductCustomerTypeDoesNotMatch( + body.product_id ?? null, params.customer_id, product.customerType, params.customer_type, );
🤖 Fix all issues with AI agents
In
@apps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.ts:
- Around line 12-138: The Stripe cancellation path in the DELETE route handler
is cancelling immediately (stripe.subscriptions.cancel in the handler) while the
local update sets cancelAtPeriodEnd: true and status: canceled, causing
inconsistent semantics; update the Stripe call in the DELETE handler to pass
cancel_at_period_end: true when intending period-end cancellation (or explicitly
document and implement immediate cancellation for both paths), and ensure the
local prisma.subscription.update (status/currentPeriodEnd/cancelAtPeriodEnd) is
aligned with the chosen Stripe behavior so Stripe and local state remain
consistent.
🧹 Nitpick comments (3)
apps/e2e/tests/js/payments.test.ts (1)
209-265: Potential flake: assert cancellation with polling/retry instead of immediate re-list.Immediately re-calling
listProducts()after cancellation (Line 233-234, 262-263) can be flaky if cancellation propagates asynchronously (Stripe/webhooks/background jobs). Consider polling until the product disappears.Example adjustment
- const after = await user.listProducts(); - expect(after.some((p) => p.id === "pro-sub")).toBe(false); + await expect.poll(async () => { + const after = await user.listProducts(); + return after.some((p) => p.id === "pro-sub"); + }).toBe(false);packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts (1)
1651-1670: Implementation is solid; minor ergonomics: reusegetUser({ or: "throw" })to avoid double fetch paths.Today you call
await this._getSession()and thenawait this.getUser()(Line 1652-1654). If you want to tighten this up, usinggetUser({ or: "throw" })can simplify control flow (and keep auth semantics uniform).apps/e2e/tests/backend/endpoints/api/v1/payments/products.test.ts (1)
3-437: Great E2E coverage for critical payments flows; consider tighteninganyinconfigureProduct(test-only).The expanded matrix around grant/cancel/list (including forbidden and one-time cases) is exactly what we want for this surface. The only nit:
configureProduct(config: any)(Line 5) could be a typed helper to catch shape regressions earlier.
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (7)
apps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/route.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.tsapps/e2e/tests/js/payments.test.tspackages/stack-shared/src/interface/client-interface.tspackages/template/src/lib/stack-app/apps/implementations/client-app-impl.tspackages/template/src/lib/stack-app/apps/interfaces/client-app.ts
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{tsx,ts,jsx,js}
📄 CodeRabbit inference engine (AGENTS.md)
For blocking alerts and errors, never use
toast; instead, use alerts as toasts are easily missed by the user
Files:
packages/template/src/lib/stack-app/apps/interfaces/client-app.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/route.tspackages/template/src/lib/stack-app/apps/implementations/client-app-impl.tsapps/e2e/tests/js/payments.test.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.tspackages/stack-shared/src/interface/client-interface.ts
**/*.{tsx,ts}
📄 CodeRabbit inference engine (AGENTS.md)
NEVER use Next.js dynamic functions if avoidable; prefer using client components instead to keep pages static (e.g., use
usePathnameinstead ofawait params)
Files:
packages/template/src/lib/stack-app/apps/interfaces/client-app.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/route.tspackages/template/src/lib/stack-app/apps/implementations/client-app-impl.tsapps/e2e/tests/js/payments.test.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.tspackages/stack-shared/src/interface/client-interface.ts
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,js,jsx}: NEVER try-catch-all, NEVER void a promise, and NEVER use .catch(console.error) or similar; use loading indicators instead; if asynchronous handling is necessary, userunAsynchronouslyorrunAsynchronouslyWithAlertinstead
Use ES6 maps instead of records wherever possible
Files:
packages/template/src/lib/stack-app/apps/interfaces/client-app.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/route.tspackages/template/src/lib/stack-app/apps/implementations/client-app-impl.tsapps/e2e/tests/js/payments.test.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.tspackages/stack-shared/src/interface/client-interface.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Code defensively; prefer?? throwErr(...)over non-null assertions with good error messages explicitly stating violated assumptions
Avoid theanytype; when necessary, leave a comment explaining why it's used, why the type system fails, and how errors would be caught at compile-, test-, or runtime
Files:
packages/template/src/lib/stack-app/apps/interfaces/client-app.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.tsapps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/route.tspackages/template/src/lib/stack-app/apps/implementations/client-app-impl.tsapps/e2e/tests/js/payments.test.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.tspackages/stack-shared/src/interface/client-interface.ts
**/e2e/**/*.{test,spec}.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
ALWAYS add new E2E tests when changing the API or SDK interface; err on the side of creating too many tests due to the critical nature of the authentication industry
Files:
apps/e2e/tests/js/payments.test.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.ts
**/*.{test,spec}.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
When writing tests, prefer
.toMatchInlineSnapshot()over other selectors if possible; check snapshot-serializer.ts to understand how snapshots are formatted and how non-deterministic values are handled
Files:
apps/e2e/tests/js/payments.test.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.ts
🧠 Learnings (1)
📚 Learning: 2026-01-07T00:55:19.871Z
Learnt from: CR
Repo: stack-auth/stack-auth PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-07T00:55:19.871Z
Learning: Applies to **/e2e/**/*.{test,spec}.{ts,tsx,js,jsx} : ALWAYS add new E2E tests when changing the API or SDK interface; err on the side of creating too many tests due to the critical nature of the authentication industry
Applied to files:
apps/e2e/tests/js/payments.test.tsapps/e2e/tests/backend/endpoints/api/v1/payments/products.test.ts
🧬 Code graph analysis (4)
apps/backend/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.ts (6)
packages/stack-shared/src/utils/errors.tsx (3)
StatusError(152-261)StackAssertionError(69-85)throwErr(10-19)apps/backend/src/prisma-client.tsx (1)
getPrismaClientForTenancy(67-69)apps/backend/src/lib/request-checks.tsx (1)
ensureUserTeamPermissionExists(82-115)apps/backend/src/lib/payments.tsx (1)
ensureProductIdOrInlineProduct(22-75)packages/stack-shared/src/utils/strings.tsx (1)
typedToUppercase(30-33)apps/backend/src/lib/stripe.tsx (1)
getStripeForAccount(29-54)
packages/template/src/lib/stack-app/apps/implementations/client-app-impl.ts (1)
packages/stack-shared/src/known-errors.tsx (2)
KnownErrors(1650-1652)KnownErrors(1654-1781)
apps/e2e/tests/backend/endpoints/api/v1/payments/products.test.ts (2)
apps/e2e/tests/helpers.ts (1)
it(12-12)apps/e2e/tests/backend/backend-helpers.ts (1)
niceBackendFetch(109-173)
packages/stack-shared/src/interface/client-interface.ts (2)
packages/stack-shared/src/sessions.ts (1)
InternalSession(81-288)packages/stack-shared/src/utils/urls.tsx (1)
urlString(314-316)
⏰ 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). (13)
- GitHub Check: Vercel Agent Review
- GitHub Check: restart-dev-and-test-with-custom-base-port
- GitHub Check: setup-tests-with-custom-base-port
- GitHub Check: setup-tests
- GitHub Check: build (22.x)
- GitHub Check: build (22.x)
- GitHub Check: lint_and_build (latest)
- GitHub Check: docker
- GitHub Check: check_prisma_migrations (22.x)
- GitHub Check: restart-dev-and-test
- GitHub Check: all-good
- GitHub Check: E2E Tests (Node 22.x, Freestyle mock)
- GitHub Check: E2E Tests (Node 22.x, Freestyle prod)
🔇 Additional comments (2)
packages/template/src/lib/stack-app/apps/interfaces/client-app.ts (1)
79-80: Public SDK surface addition looks consistent with intended user/team split.
Signature is clear and matches the usage pattern in tests/impl.packages/stack-shared/src/interface/client-interface.ts (1)
1809-1825: LGTM: correct URL construction + correct HTTP verb for cancellation.
...end/src/app/api/latest/payments/products/[customer_type]/[customer_id]/[product_id]/route.ts
Show resolved
Hide resolved
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Older cmux preview screenshots (latest comment is below)Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Preview Screenshots⏳ Preview screenshots are being captured... Workspace and dev browser links will appear here once the preview environment is ready. Generated by cmux preview system |
Summary by CodeRabbit
New Features
Tests
Chores
✏️ Tip: You can customize this high-level summary in your review settings.