Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(expo): Allow disabling native client sync by wobsoriano · Pull Request #9396 · clerk/javascript · GitHub
Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(expo): Allow disabling native client sync by wobsoriano · Pull Request #9396 · clerk/javascript · GitHub
Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(expo): Allow disabling native client sync by wobsoriano · Pull Request #9396 · clerk/javascript · GitHub
Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix(expo): Allow disabling native client sync by wobsoriano · Pull Request #9396 · clerk/javascript · GitHub
Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(expo): Allow disabling native client sync by wobsoriano · Pull Request #9396 · clerk/javascript · GitHub
Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(expo): Allow disabling native client sync by wobsoriano · Pull Request #9396 · clerk/javascript · GitHub
Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix(expo): Allow disabling native client sync by wobsoriano · Pull Request #9396 · clerk/javascript · GitHub
Skip to content

fix(expo): Allow disabling native client sync - #9396

Merged
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync
Aug 11, 2026
Merged

fix(expo): Allow disabling native client sync#9396
wobsoriano merged 5 commits into
mainfrom
rob/internal-disable-native-client-sync

Conversation

@wobsoriano

@wobsorianowobsoriano commented Aug 11, 2026

Copy link
Copy Markdown
Member

Description

Adds an experimental ClerkProvider prop to disable native client synchronization for Expo apps that do not use Clerk native components. This provides a temporary escape hatch for apps affected by native and JS client desynchronization.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Aug 11, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1ae7c7c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
NameType
@clerk/expoPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreviewAug 11, 2026 4:02pm
swingsetReadyReadyPreviewAug 11, 2026 4:02pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Aug 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@9396

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@9396

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@9396

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@9396

@clerk/electron

npm i https://pkg.pr.new/@clerk/electron@9396

@clerk/electron-passkeys

npm i https://pkg.pr.new/@clerk/electron-passkeys@9396

@clerk/eslint-plugin

npm i https://pkg.pr.new/@clerk/eslint-plugin@9396

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@9396

@clerk/expo-google-signin

npm i https://pkg.pr.new/@clerk/expo-google-signin@9396

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@9396

@clerk/express

npm i https://pkg.pr.new/@clerk/express@9396

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@9396

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@9396

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@9396

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@9396

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@9396

@clerk/react

npm i https://pkg.pr.new/@clerk/react@9396

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@9396

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@9396

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@9396

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@9396

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@9396

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@9396

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@9396

commit: 1ae7c7c

@github-actions

github-actionsBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

API Changes Report

Generated by Break Check on 2026-08-11T16:06:59.059Z

Summary

MetricCount
Packages analyzed19
Packages with changes1
🔴 Breaking changes0
🟡 Non-breaking changes2
🟢 Additions0

🤖 This report was reviewed by claude-sonnet-4-6.


@clerk/expo

Current version: 4.2.5
Recommended bump: MINOR → 4.3.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (97%): The only change is the addition of a new optional property __experimental_disableNativeClientSync?: boolean to ClerkProviderProps, which is an input type (used as a parameter to ClerkProvider). Adding an optional property to an input type does not break existing consumers who omit it.

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
// ... 2 unchanged lines elided ...
tokenCache?: TokenCache;
__experimental_passkeys?: BuildClerkOptions['__experimental_passkeys'];
__experimental_resourceCache?: BuildClerkOptions['__experimental_resourceCache'];
+ __experimental_disableNativeClientSync?: boolean;
};

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…!Omit:type<import("@clerk/react").ClerkProviderProps<TUi>,'publishableKey'>&{publishableKey:string;tokenCache?:import("…

🤖 AI review (reclassified as non-breaking) (95%): A new optional property __experimental_disableNativeClientSync?: boolean is added to ClerkProviderProps, which is an input type (passed as props to ClerkProvider); adding an optional field to an input type does not break existing callers who do not supply it.


Report generated by Break Check

Last ran on 1ae7c7c.

@coderabbitai

coderabbitaiBot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: 97deaf8f-bd47-466a-8902-2cca67ee8d1a

📥 Commits

Reviewing files that changed from the base of the PR and between 2dbf5bf and 1ae7c7c.

📒 Files selected for processing (1)
  • integration/templates/expo-native/App.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

📝 Walkthrough

Walkthrough

Adds the experimental __experimental_disableNativeClientSync option to ClerkProvider. The option gates native bootstrap, event synchronization, and NativeClientSync rendering. The bootstrap hook responds to enabled-state changes. Tests cover disabled synchronization. The Expo native fixture removes JavaScript sign-in and E2E controls and updates profile rendering. A patch changeset documents the option.

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

Possibly related PRs

Suggested reviewers:mikepitre

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 0.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly summarizes the main change: allowing Expo apps to disable native client synchronization.
Description check✅ PassedThe description explains the experimental prop, its intended use, and the related synchronization issue.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.

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

@coderabbitaicoderabbitaiBot left a comment

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.

Caution

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

⚠️ Outside diff range comments (1)
packages/expo/src/provider/nativeClientSync.tsx (1)

987-991: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Invalidate bootstrap work when enabled changes.

When enabled changes to false, the next effect sets isMountedRef.current back to true. An in-flight configureNativeClerk can then continue token-cache reads, native configuration, or synchronization while disabled. Clear the started key and readiness state when disabled, and use an effect-local cancellation token or generation counter. Include tests for both enable transitions.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/nativeClientSync.tsx` around lines 987 - 991,
Update the effect governing native bootstrap around configureNativeClerk so
disabling enabled invalidates in-flight work: clear startedPublishableKeyRef and
readiness state, and use an effect-local cancellation token or generation
counter checked before token-cache reads, native configuration, and
synchronization. Ensure re-enabling starts a fresh bootstrap for the
publishableKey, and add tests covering both enabled-to-disabled and
disabled-to-enabled transitions.
🧹 Nitpick comments (1)
packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx (1)

175-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for runtime opt-out transitions.

This test covers only the initially disabled provider. Add cases that disable synchronization during bootstrap and re-enable it after disabling. Assert that no native work continues while disabled and that a fresh bootstrap handles the later enable.

As per coding guidelines, “Unit tests are required for all new functionality. Include tests for all new features. Verify proper error handling and edge cases.”

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`
around lines 175 - 200, Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/expo/src/provider/nativeClientSync.tsx`:
- Around line 987-991: Update the effect governing native bootstrap around
configureNativeClerk so disabling enabled invalidates in-flight work: clear
startedPublishableKeyRef and readiness state, and use an effect-local
cancellation token or generation counter checked before token-cache reads,
native configuration, and synchronization. Ensure re-enabling starts a fresh
bootstrap for the publishableKey, and add tests covering both
enabled-to-disabled and disabled-to-enabled transitions.
---
Nitpick comments:
In
`@packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx`:
- Around line 175-200: Extend the native client synchronization tests around
ClerkProvider to cover runtime opt-out transitions: disable synchronization
during bootstrap and verify no native configuration, token retrieval, listener
setup, or state syncing continues, then re-enable it and verify a fresh
bootstrap performs the expected native work. Reuse the existing mocks and
synchronization controls in the test suite, and preserve the current
initially-disabled assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: CHILL

Plan: Pro Plus

Run ID: a94a3db7-7ced-4f48-9b1f-ef7d75ee28e5

📥 Commits

Reviewing files that changed from the base of the PR and between 29c9017 and f7ad951.

📒 Files selected for processing (4)
  • .changeset/calm-pandas-sync.md
  • packages/expo/src/provider/ClerkProvider.tsx
  • packages/expo/src/provider/__tests__/ClerkProvider.nativeClientSync.test.tsx
  • packages/expo/src/provider/nativeClientSync.tsx
🔗 Linked repositories identified

CodeRabbit considers these linked repositories for cross-repo context during reviews:

  • clerk/clerk_go(manual)
  • clerk/dashboard(manual)
  • clerk/accounts(manual)
  • clerk/backoffice(manual)
  • clerk/clerk(manual)
  • clerk/clerk-docs(manual)
  • clerk/cloudflare-workers(manual)
  • clerk/cli(auto-detected)
  • clerk/clerk-ios(auto-detected)
  • clerk/clerk-android(auto-detected)

@wobsoriano
wobsoriano merged commit a0124c5 into mainAug 11, 2026
58 checks passed
@wobsoriano
wobsoriano deleted the rob/internal-disable-native-client-sync branch August 11, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@wobsoriano@swolfand