@clerk/clerk-js
6.40.0 · 20 Oct 2026MIT532.6k / weekRepositoryHomepagenpmAtom feed
690 stable releases, newest first, by release line. Notes are quoted as the maintainers published them.
6.40.0
20 Oct 2026Support passkeys as a second factor during sign-in and session reverification.
When a user has a passkey, the prebuilt
<SignIn/>and<UserVerification/>
components preselect it as the second factor, as they already do for the first
factor. Other methods stay available under "Use another method".To use it, your instance must allow passkeys to satisfy the second factor. This
is on by default for instances created after 2026-07-08, and can be turned on
in the Dashboard for older ones. Web apps also need to opt in to the passkey
second factor update in the Dashboard.If you build a custom flow,
supportedSecondFactorscan now includepasskey.
CallsignIn.authenticateWithPasskey()to complete it.Passkeys are no longer preselected, for either factor, where the SDK reports
that WebAuthn is unavailable (for example, Electron apps without passkey
support enabled).
Minor Changes
Support passkeys as a second factor during sign-in and session reverification.
When a user has a passkey, the prebuilt
<SignIn/>and<UserVerification/>
components preselect it as the second factor, as they already do for the first
factor. Other methods stay available under "Use another method".To use it, your instance must allow passkeys to satisfy the second factor. This
is on by default for instances created after 2026-07-08, and can be turned on
in the Dashboard for older ones. Web apps also need to opt in to the passkey
second factor update in the Dashboard.If you build a custom flow,
supportedSecondFactorscan now includepasskey.
CallsignIn.authenticateWithPasskey()to complete it.Passkeys are no longer preselected, for either factor, where the SDK reports
that WebAuthn is unavailable (for example, Electron apps without passkey
support enabled).
6.39.1
16 Oct 2026Fix
oidcPromptbeing ignored for OAuth strategies insignIn.sso()andsignIn.authenticateWithRedirect(). The value is now sent when the sign-in is created, so a prompt such asselect_accountreaches the OAuth provider.session.getToken()no longer skips the network request whennavigator.onLinereportsfalse. Some environments, such as Chrome behind certain VPN clients, can report offline while the network works, which caused every token refresh to fail withclerk_offline. HTTP errors from the Frontend API, including ones with non-JSON bodies such as a proxy's HTML 502, are now surfaced as-is instead of being relabeled asClerkOfflineError. When a resource cache is configured (e.g. Expo), a 5xx response during startup now falls back to the cached resources, and non-JSON 5xx responses no longer clear the Chrome extension's stored development browser token.
6.39.0
9 Oct 2026Add a role mapping step to the self-serve Directory Sync setup in
<OrganizationProfile />. Organization admins can now assign an organization role to each directory group their identity provider pushes, set which group wins when a member belongs to several, and turn role syncing on or off. Members in no mapped group keep the organization's default role. The step is read-only for members without theorg:sys_memberships:managepermission and while the organization's role set is being migrated.Add an
enterpriseConnectionsUrloption tohandleRedirectCallback()and<AuthenticateWithRedirectCallback />. When the Clerk API asks an OAuth sign-up to choose between several enterprise connections for the same email domain, the callback navigates to this URL, which defaults to theenterprise-connectionsroute of your sign-up page.
Minor Changes
Add a role mapping step to the self-serve Directory Sync setup in
<OrganizationProfile />. Organization admins can now assign an organization role to each directory group their identity provider pushes, set which group wins when a member belongs to several, and turn role syncing on or off. Members in no mapped group keep the organization's default role. The step is read-only for members without theorg:sys_memberships:managepermission and while the organization's role set is being migrated.
Patch Changes
Add an
enterpriseConnectionsUrloption tohandleRedirectCallback()and<AuthenticateWithRedirectCallback />. When the Clerk API asks an OAuth sign-up to choose between several enterprise connections for the same email domain, the callback navigates to this URL, which defaults to theenterprise-connectionsroute of your sign-up page.
6.38.1
7 Oct 2026Fix
<HandleSSOCallback />dropping the error when a Clerk Protect challenge fails on the SSO callback. The error is now available onerrorsfromuseSignIn()oruseSignUp(), and a failed sign-up challenge callsnavigateToSignUpinstead ofnavigateToSignIn.
Patch Changes
Fix
<HandleSSOCallback />dropping the error when a Clerk Protect challenge fails on the SSO callback. The error is now available onerrorsfromuseSignIn()oruseSignUp(), and a failed sign-up challenge callsnavigateToSignUpinstead ofnavigateToSignIn.
6.38.0
5 Oct 2026- deprecated
SAML enterprise connections can trust several Identity Provider signing certificates at once.
EnterpriseConnection.samlConnectionnow includesidpCertificates, every trusted certificate with its validity window, andorganization.createEnterpriseConnection()andorganization.updateEnterpriseConnection()acceptsaml.idpCertificates, an array that replaces the connection's whole set. The singlesaml.idpCertificateinput is deprecated in favor of the array; it keeps working and still replaces the whole set.
Minor Changes
- deprecated
SAML enterprise connections can trust several Identity Provider signing certificates at once.
EnterpriseConnection.samlConnectionnow includesidpCertificates, every trusted certificate with its validity window, andorganization.createEnterpriseConnection()andorganization.updateEnterpriseConnection()acceptsaml.idpCertificates, an array that replaces the connection's whole set. The singlesaml.idpCertificateinput is deprecated in favor of the array; it keeps working and still replaces the whole set.
6.37.0
1 Oct 2026Add experimental APIs for biometric sign-in in native apps. This includes the
trusted_devicestrategy for sign-in and session reverification,nativeSettingson the auth config, and__experimental_methods onUserfor managing biometric credentials. These may change in minor releases.
Minor Changes
Add experimental APIs for biometric sign-in in native apps. This includes the
trusted_devicestrategy for sign-in and session reverification,nativeSettingson the auth config, and__experimental_methods onUserfor managing biometric credentials. These may change in minor releases.
6.36.0
30 Sep 2026Custom flows built with
useSignIn()anduseSignUp()now handle Clerk Protect challenges for you. When a sign-in or sign-up method gets a challenge, Clerk shows it in a modal and the method returns once the user passes it. For SSO, the challenge appears when the user comes back to<HandleSSOCallback />. Classic resource methods such asclerk.client.signIn.create(), and apps without Clerk's UI loaded, still return withprotectCheckset, as before.The Solana wallet picker downloads about 2 KB instead of about 306 KB, and installing
@clerk/uior@clerk/clerk-jsno longer pulls in React Native, Metro, and@solana/web3.js. The picker now lists only wallets that can complete Sign in with Solana, so the Mobile Wallet Adapter option that appeared on Android Chrome is gone.
Minor Changes
Custom flows built with
useSignIn()anduseSignUp()now handle Clerk Protect challenges for you. When a sign-in or sign-up method gets a challenge, Clerk shows it in a modal and the method returns once the user passes it. For SSO, the challenge appears when the user comes back to<HandleSSOCallback />. Classic resource methods such asclerk.client.signIn.create(), and apps without Clerk's UI loaded, still return withprotectCheckset, as before.
Patch Changes
The Solana wallet picker downloads about 2 KB instead of about 306 KB, and installing
@clerk/uior@clerk/clerk-jsno longer pulls in React Native, Metro, and@solana/web3.js. The picker now lists only wallets that can complete Sign in with Solana, so the Mobile Wallet Adapter option that appeared on Android Chrome is gone.
6.35.0
29 Sep 2026Support Google Workspace directories in Directory Sync. Organization admins can upload a service account key and delegated admin email from the setup flow, start a sync on demand, and see the result of the last one.
DirectorySyncgainssetCredentials(),sync(),getSyncStatus(), andcredentialsConfigured.Capture authentication timezones so Clerk emails can display timestamps in a stored user timezone.
Fix abandoned passkey registrations counting toward the limit on unverified identifications. Cancelling or failing the browser passkey prompt left a pending registration on the account that is hidden from the user's passkey list, so it could silently block adding an email address or phone number until it expired. The pending registration is now removed as soon as the prompt is abandoned. In
<UserProfile />, the "Add a passkey" button also shows a loading state while a registration is in progress, and a failed attempt no longer leaves its error banner on screen after a later attempt succeeds.
Minor Changes
Support Google Workspace directories in Directory Sync. Organization admins can upload a service account key and delegated admin email from the setup flow, start a sync on demand, and see the result of the last one.
DirectorySyncgainssetCredentials(),sync(),getSyncStatus(), andcredentialsConfigured.
Patch Changes
Capture authentication timezones so Clerk emails can display timestamps in a stored user timezone.
Fix abandoned passkey registrations counting toward the limit on unverified identifications. Cancelling or failing the browser passkey prompt left a pending registration on the account that is hidden from the user's passkey list, so it could silently block adding an email address or phone number until it expired. The pending registration is now removed as soon as the prompt is abandoned. In
<UserProfile />, the "Add a passkey" button also shows a loading state while a registration is in progress, and a failed attempt no longer leaves its error banner on screen after a later attempt succeeds.Ignore errors from the background session touch that runs when the page regains focus.
These errors were previously both unhandled and uncaught, now they are just intentionally unhandled. The page is usually in a good enough state to recover gracefully, but the uncaught errors led to noise in the browser console and error tracking tools which we now avoid.
6.34.1
25 Sep 2026Fix enterprise SSO sign-ins erroring instead of showing a verification challenge raised while handing off to the identity provider.
If you use the prebuilt
<SignIn />component, there is nothing to do. If you have Clerk Protect enabled and callsignIn.authenticateWithRedirect()orsignIn.authenticateWithPopup()from a custom sign-in flow, catch aClerkRuntimeErrorwith codeprotect_check_requiredand show the verification challenge, to avoid a stalled sign-in.That error means a verification challenge has to be completed before the sign-in can redirect. It replaces the generic "not supported" error these methods threw before. When it is thrown, the sign-in is gated:
signIn.protectCheckis set, or its status isneeds_protect_check. For enterprise SSO, run the challenge and then callauthenticateWithRedirect()again withcontinueSignIn: true. If the server has already prepared the redirect, the sign-in continues to the identity provider and the challenge runs when it returns, so no error is thrown.
Patch Changes
Fix enterprise SSO sign-ins erroring instead of showing a verification challenge raised while handing off to the identity provider.
If you use the prebuilt
<SignIn />component, there is nothing to do. If you have Clerk Protect enabled and callsignIn.authenticateWithRedirect()orsignIn.authenticateWithPopup()from a custom sign-in flow, catch aClerkRuntimeErrorwith codeprotect_check_requiredand show the verification challenge, to avoid a stalled sign-in.That error means a verification challenge has to be completed before the sign-in can redirect. It replaces the generic "not supported" error these methods threw before. When it is thrown, the sign-in is gated:
signIn.protectCheckis set, or its status isneeds_protect_check. For enterprise SSO, run the challenge and then callauthenticateWithRedirect()again withcontinueSignIn: true. If the server has already prepared the redirect, the sign-in continues to the identity provider and the challenge runs when it returns, so no error is thrown.
6.34.0
24 Sep 2026The "Add members" card on the SSO allow list page of
<OrganizationProfile />now offers two ways to add people: by email address, or every member with a given role at once. Members whose email address is not served by one of the organization's enterprise connections are skipped. When nothing could be added the card stays open and says why, and when some were added it moves to a success step that reports how many were skipped.For custom flows,
organization.ssoBypassAllowlistgainsaddUsers({ userIds }), which calls the new bulk endpoint in batches of 100 and returns the added entries together with the users that could not be added and why.Inputs marked to be ignored by password managers now also carry the Bitwarden, LastPass and Dashlane opt-out attributes, so those extensions stop offering to fill fields such as the allow list email address.
The member picker that the "Add member" card shipped with in 4.18.0 is gone, and so are its localization keys under
organizationProfile.securityPage.ssoBypassPage.addForm:memberLabel,memberPlaceholder,changeButtonandnoResults. The feature was never enabled on any instance, so no application depends on them.New customization handles: the
organizationProfileSecuritySsoBypassEmailInput,organizationProfileSecuritySsoBypassRoleWarning,organizationProfileSecuritySsoBypassFailureandorganizationProfileSecuritySsoBypassBulkResultappearance elements.Show the provider logo next to each connection name on the enterprise account chooser.
Fix
<OAuthConsent />rendering a blank page when reached through the redirect after completing<SignIn />or<SignUp />.
Minor Changes
The "Add members" card on the SSO allow list page of
<OrganizationProfile />now offers two ways to add people: by email address, or every member with a given role at once. Members whose email address is not served by one of the organization's enterprise connections are skipped. When nothing could be added the card stays open and says why, and when some were added it moves to a success step that reports how many were skipped.For custom flows,
organization.ssoBypassAllowlistgainsaddUsers({ userIds }), which calls the new bulk endpoint in batches of 100 and returns the added entries together with the users that could not be added and why.Inputs marked to be ignored by password managers now also carry the Bitwarden, LastPass and Dashlane opt-out attributes, so those extensions stop offering to fill fields such as the allow list email address.
The member picker that the "Add member" card shipped with in 4.18.0 is gone, and so are its localization keys under
organizationProfile.securityPage.ssoBypassPage.addForm:memberLabel,memberPlaceholder,changeButtonandnoResults. The feature was never enabled on any instance, so no application depends on them.New customization handles: the
organizationProfileSecuritySsoBypassEmailInput,organizationProfileSecuritySsoBypassRoleWarning,organizationProfileSecuritySsoBypassFailureandorganizationProfileSecuritySsoBypassBulkResultappearance elements.
Patch Changes
Show the provider logo next to each connection name on the enterprise account chooser.
Fix
<OAuthConsent />rendering a blank page when reached through the redirect after completing<SignIn />or<SignUp />.
6.33.0
23 Sep 2026Rename the SSO fallback sign-in flow to SSO bypass, matching the name the feature ships under. The sign-in resource's
ssoFallbackFirstFactorsis nowssoBypassFirstFactorsand reads thesso_bypass_first_factorsfield from the API, thesignIn.ssoFallbacklocalization keys are nowsignIn.ssoBypass, and thessoFallbackcard action element id is nowssoBypass. The flow has not been enabled on any instance, so no application is affected by the old names going away.Add the ability for Organization admins to manage the SSO bypass allowlist from the Security page of
<OrganizationProfile />.For custom flows,
organization.ssoBypassAllowlistexposesgetUsers(),addUser({ userId })andremoveUser(userId).
Minor Changes
Rename the SSO fallback sign-in flow to SSO bypass, matching the name the feature ships under. The sign-in resource's
ssoFallbackFirstFactorsis nowssoBypassFirstFactorsand reads thesso_bypass_first_factorsfield from the API, thesignIn.ssoFallbacklocalization keys are nowsignIn.ssoBypass, and thessoFallbackcard action element id is nowssoBypass. The flow has not been enabled on any instance, so no application is affected by the old names going away.Add the ability for Organization admins to manage the SSO bypass allowlist from the Security page of
<OrganizationProfile />.For custom flows,
organization.ssoBypassAllowlistexposesgetUsers(),addUser({ userId })andremoveUser(userId).
6.32.1
15 Sep 2026Only updates a dependency:@clerk/shared 4.33.0
6.32.0
15 Sep 2026Introduce self-serve Directory Sync (SCIM) capabilities and related functionality.
Add the SSO fallback sign-in flow to
<SignIn />, for enterprise users the instance has allowlisted to sign in with an email code when they cannot reach their identity provider.For such a user the sign-in no longer redirects straight to the identity provider. It shows the SSO action — or the connection picker, when several connections serve the address — alongside a "Can't use SSO?" link leading to the standard email code step, which carries a notice that the organization requires single sign-on and that the attempt is recorded. Users without a fallback, and instances without the feature, are unaffected.
Custom flows can read the same factor from the new
ssoFallbackFirstFactorsproperty on the sign-in resource. The flow adds thesignIn.enterpriseSSOandsignIn.ssoFallbacklocalization keys and thessoFallbackcard action element id.
Minor Changes
Introduce self-serve Directory Sync (SCIM) capabilities and related functionality.
Add the SSO fallback sign-in flow to
<SignIn />, for enterprise users the instance has allowlisted to sign in with an email code when they cannot reach their identity provider.For such a user the sign-in no longer redirects straight to the identity provider. It shows the SSO action — or the connection picker, when several connections serve the address — alongside a "Can't use SSO?" link leading to the standard email code step, which carries a notice that the organization requires single sign-on and that the attempt is recorded. Users without a fallback, and instances without the feature, are unaffected.
Custom flows can read the same factor from the new
ssoFallbackFirstFactorsproperty on the sign-in resource. The flow adds thesignIn.enterpriseSSOandsignIn.ssoFallbacklocalization keys and thessoFallbackcard action element id.
6.31.1
9 Sep 2026Update the
@tanstack/query-coredependency range to^5.101.4.Complete local sign-out while offline when cached resources surface a network error.
Patch Changes
Update the
@tanstack/query-coredependency range to^5.101.4.Complete local sign-out while offline when cached resources surface a network error.
6.31.0
2 Sep 2026Add an authenticated OAuth device verification component and workflow hook for approving or denying OAuth Device Authorization Grant requests.
Minor Changes
Add an authenticated OAuth device verification component and workflow hook for approving or denying OAuth Device Authorization Grant requests.
6.30.3
1 Sep 2026Fix
oidcPromptandoidcLoginHintbeing silently dropped from the Frontend API request inuser.createExternalAccount()andexternalAccount.reauthorize(). Both parameters were already accepted by the public types but never serialized, so providers such as Google would fall back to their default prompt behavior. They are now sent asoidc_promptandoidc_login_hint.
6.30.2
28 Aug 2026Fix development instance initialization when a stale dev browser value is rejected by clearing the value and retrying the environment and client requests.
Patch Changes
Fix development instance initialization when a stale dev browser value is rejected by clearing the value and retrying the environment and client requests.
6.30.1
25 Aug 2026Fix an issue where a verification that was still progressing normally could be cancelled and reported to the user as having timed out.
Patch Changes
Fix an issue where a verification that was still progressing normally could be cancelled and reported to the user as having timed out.
6.30.0
24 Aug 2026Fixes an issue where OAuth account transfers that needed additional verification were returned to the beginning of sign-in.
Minor Changes
Fixes an issue where OAuth account transfers that needed additional verification were returned to the beginning of sign-in.
6.29.2 – 6.29.32 releases that only update dependencies@clerk/shared 4.29.3Show each
- 6.29.320 Aug 2026@clerk/shared 4.29.3
- 6.29.218 Aug 2026@clerk/shared 4.29.2
6.29.1
14 Aug 2026Add custom user profile pages to the native
UserProfileViewandUserButtoncomponents. Usecontentto render a React Native screen orhrefto open an external URL.import { UserButton, UserProfileView } from '@clerk/expo/native'; import type { UserProfileCustomPage } from '@clerk/expo/native'; const customPages: UserProfileCustomPage[] = [ { path: 'api-keys', label: 'API keys', icon: 'key', content: <APIKeysView />, }, { path: 'docs', label: 'Docs', icon: 'book', href: 'https://clerk.com/docs', }, ]; <UserProfileView customPages={customPages} />; <UserButton userProfileProps={{ customPages }} />;
Minor Changes
Add custom user profile pages to the native
UserProfileViewandUserButtoncomponents. Usecontentto render a React Native screen orhrefto open an external URL.import { UserButton, UserProfileView } from '@clerk/expo/native'; import type { UserProfileCustomPage } from '@clerk/expo/native'; const customPages: UserProfileCustomPage[] = [ { path: 'api-keys', label: 'API keys', icon: 'key', content: <APIKeysView />, }, { path: 'docs', label: 'Docs', icon: 'book', href: 'https://clerk.com/docs', }, ]; <UserProfileView customPages={customPages} />; <UserButton userProfileProps={{ customPages }} />;
6.29.0
13 Aug 2026Internal improvements to Clerk Protect. No action is required, and instances that do not use Protect are unaffected.
Billing applied-discount snapshots now include optional
durationInCycles. Payment attempt and statement UIs use the original discount length instead of cycles remaining, and omit the duration copy when it is unavailable.
Minor Changes
Internal improvements to Clerk Protect. No action is required, and instances that do not use Protect are unaffected.
Patch Changes
Billing applied-discount snapshots now include optional
durationInCycles. Payment attempt and statement UIs use the original discount length instead of cycles remaining, and omit the duration copy when it is unavailable.
6.28.1
10 Aug 2026Fix native OAuth transport flows (e.g.
@clerk/electron) breaking out of modal components and failing with "Redirect url mismatch" errors.Intermediate OAuth callback steps (sign-in to sign-up transfer, continue, MFA factors, password reset) now navigate inside the component's own router instead of navigating the app window to an internal Clerk route. Transport flows also always send the registered transport callback URL as the completion redirect, so production instances no longer reject sign-in or sign-up requests when a page-derived URL was picked up as the completion redirect.
Patch Changes
Fix native OAuth transport flows (e.g.
@clerk/electron) breaking out of modal components and failing with "Redirect url mismatch" errors.Intermediate OAuth callback steps (sign-in to sign-up transfer, continue, MFA factors, password reset) now navigate inside the component's own router instead of navigating the app window to an internal Clerk route. Transport flows also always send the registered transport callback URL as the completion redirect, so production instances no longer reject sign-in or sign-up requests when a page-derived URL was picked up as the completion redirect.
6.27.1
7 Aug 2026Only updates a dependency:@clerk/shared 4.27.1
6.27.0
6 Aug 2026Add
<InviteMembersButton />, a control component that opens the organization invite-members form in a modal when clicked, working like<SignInButton mode="modal">.Wrap your own button (or omit children for a default one). The button requires an active organization and should be rendered for members who can manage memberships (
org:sys_memberships:manage). Opening it without an active organization or that permission is a no-op in production, and throws a descriptive error in development.import { InviteMembersButton } from '@clerk/nextjs'; <InviteMembersButton> <button>Invite members</button> </InviteMembersButton>;This also adds
Clerk.openInviteMembers()andClerk.closeInviteMembers()for opening and closing the modal programmatically.
Minor Changes
Add
<InviteMembersButton />, a control component that opens the organization invite-members form in a modal when clicked, working like<SignInButton mode="modal">.Wrap your own button (or omit children for a default one). The button requires an active organization and should be rendered for members who can manage memberships (
org:sys_memberships:manage). Opening it without an active organization or that permission is a no-op in production, and throws a descriptive error in development.import { InviteMembersButton } from '@clerk/nextjs'; <InviteMembersButton> <button>Invite members</button> </InviteMembersButton>;This also adds
Clerk.openInviteMembers()andClerk.closeInviteMembers()for opening and closing the modal programmatically.
6.26.0
4 Aug 2026Support sign-in-or-sign-up combined flow with Clerk <SignIn> component
when strict enumeration protection is enabled.
On development instances,
<SignIn>now logs a warning when the sign-in-or-up flow is rendered on an instance that has both password and strict enumeration protection enabled. In that configuration visitors without an account are routed to the password screen and cannot complete a sign-up, so the warning names both settings and how to resolve them.Recover from partitioned-cookie startup races by removing stale non-partitioned cookies when partitioned cookies become available.
Complete the Safari ITP cookie refresh when
setActive({ redirectUrl })navigates.Safari's ITP caps the client cookie at 7 days when it is re-issued from a fetch, so
setActive()routes its redirect through/v1/client/touchto restore the full lifetime. That navigation was immediately followed by a second one to the undecorated redirect URL, which superseded it and aborted the touch request before it completed, leaving the cookie capped.This applies to flows that pass
redirectUrlwithout anavigatecallback — email link sign-in, the password reset success screen, the OAuth popup flow, and directsetActive({ session, redirectUrl })calls — in apps where Clerk performs a full page navigation rather than handing off to a router. Users still landed on the correct page, so the only symptom was Safari sessions ending after 7 days and returning devices being challenged as if they were new.
Minor Changes
Support sign-in-or-sign-up combined flow with Clerk <SignIn> component
when strict enumeration protection is enabled.
On development instances,
<SignIn>now logs a warning when the sign-in-or-up flow is rendered on an instance that has both password and strict enumeration protection enabled. In that configuration visitors without an account are routed to the password screen and cannot complete a sign-up, so the warning names both settings and how to resolve them.
Patch Changes
Recover from partitioned-cookie startup races by removing stale non-partitioned cookies when partitioned cookies become available.
Complete the Safari ITP cookie refresh when
setActive({ redirectUrl })navigates.Safari's ITP caps the client cookie at 7 days when it is re-issued from a fetch, so
setActive()routes its redirect through/v1/client/touchto restore the full lifetime. That navigation was immediately followed by a second one to the undecorated redirect URL, which superseded it and aborted the touch request before it completed, leaving the cookie capped.This applies to flows that pass
redirectUrlwithout anavigatecallback — email link sign-in, the password reset success screen, the OAuth popup flow, and directsetActive({ session, redirectUrl })calls — in apps where Clerk performs a full page navigation rather than handing off to a router. Users still landed on the correct page, so the only symptom was Safari sessions ending after 7 days and returning devices being challenged as if they were new.
6.25.13
31 Jul 2026Enable self-serve OIDC configuration for every application. Organization admins can now select an OIDC provider in the
<OrganizationProfile />Security tab without theexperimental.oidcSelfServeoption, and existing OIDC connections open their configuration steps instead of the unsupported-provider state. Theexperimental.oidcSelfServeoption no longer does anything and can be removed from<ClerkProvider />andClerk.load().
Patch Changes
Enable self-serve OIDC configuration for every application. Organization admins can now select an OIDC provider in the
<OrganizationProfile />Security tab without theexperimental.oidcSelfServeoption, and existing OIDC connections open their configuration steps instead of the unsupported-provider state. Theexperimental.oidcSelfServeoption no longer does anything and can be removed from<ClerkProvider />andClerk.load().
6.25.12
29 Jul 2026Apply the Safari ITP cookie refresh on sign-out.
Signing out re-issues the client cookie from a fetch, which Safari's ITP caps at 7 days. The client outlives sign-out, and it is what Client Trust uses to recognize a known device, so the cap meant a user who signed out and came back more than a week later was treated as being on a new device and challenged for a second factor.
signOut()now routes its redirect through/v1/client/touchwhen the client cookie is close to expiring, the same workaroundsetActive()already applies after sign-in. The redirect is left unchanged when no refresh is needed.This covers
signOut()calls that navigate to a redirect URL, including<UserButton />and<SignOutButton />. Passing your own callback tosignOut(callback)still navigates on your behalf and is not decorated.
6.25.11
29 Jul 2026Add support for configuring custom OpenID Connect enterprise connections through the Organization Profile.
Expose whether an organization member has been deprovisioned, and mark deprovisioned members as inactive in the Organization Profile.
Patch Changes
Add support for configuring custom OpenID Connect enterprise connections through the Organization Profile.
Expose whether an organization member has been deprovisioned, and mark deprovisioned members as inactive in the Organization Profile.
6.25.10
27 Jul 2026Introduce the
useHostedAuth()hook for signing users in or up through Clerk's hosted Account Portal from native Expo apps.import { useHostedAuth } from '@clerk/expo/hosted-auth'; const { startHostedAuth } = useHostedAuth(); // Opens Account Portal on the sign-in page await startHostedAuth(); // Or open the sign-up page first await startHostedAuth({ mode: 'sign-up' });Add a
logoprop to the nativeAuthView, allowing Expo apps to replace the dashboard-configured logo with custom React Native content on Android and iOS.Keep the active session when a native client change resolves to a different, signed-out client. The check that discards those clients compared a reference that the refresh had already mutated, so it never engaged and the signed-out client was applied over the current session.
Minor Changes
Introduce the
useHostedAuth()hook for signing users in or up through Clerk's hosted Account Portal from native Expo apps.import { useHostedAuth } from '@clerk/expo/hosted-auth'; const { startHostedAuth } = useHostedAuth(); // Opens Account Portal on the sign-in page await startHostedAuth(); // Or open the sign-up page first await startHostedAuth({ mode: 'sign-up' });
Patch Changes
Bump the bundled
clerk-iosSDK from1.3.3to1.3.4. See the Clerk iOS release: github.com/clerk/clerk-ios/releases/tag/1.3.4.Add a
logoprop to the nativeAuthView, allowing Expo apps to replace the dashboard-configured logo with custom React Native content on Android and iOS.Keep the active session when a native client change resolves to a different, signed-out client. The check that discards those clients compared a reference that the refresh had already mutated, so it never engaged and the signed-out client was applied over the current session.
6.25.9
27 Jul 2026Fix the standalone
<APIKeys />component failing to render when an organization is active and user API keys are disabled but organization API keys are enabled. The component now correctly checks the user API keys setting only when no organization is active.Bias proactive session token refresh ownership toward the focused browser tab and poll more often while focused in multi-tab apps.
When running in a browser context, session token requests now include a
tab_stateparameter (focused,visible, orhidden) so the backend can distinguish foreground from background token refreshes. The parameter is omitted in environments without a document, such as extension service workers.
6.25.8
24 Jul 2026Reading the note…
6.25.7
23 Jul 2026Reading the note…
6.25.6
21 Jul 2026Reading the note…
6.25.5
16 Jul 2026Reading the note…
6.25.4
15 Jul 2026Reading the note…
6.25.3
14 Jul 2026Reading the note…
6.25.2
9 Jul 2026Reading the note…
6.25.1
9 Jul 2026Reading the note…
6.25.0
7 Jul 2026Reading the note…
6.24.0
6 Jul 2026Reading the note…
6.23.0
30 Jun 2026Reading the note…
6.22.1
29 Jun 2026Reading the note…
6.22.0
25 Jun 2026Reading the note…
6.21.1
25 Jun 2026Reading the note…
6.21.0
23 Jun 2026Reading the note…
6.20.0
19 Jun 2026Reading the note…
6.19.0
19 Jun 2026Reading the note…
6.18.1
18 Jun 2026Reading the note…