Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
100 commits
Select commit Hold shift + click to select a range
c8b4e8c
feat: add native UserButton and UserProfile components for iOS
chriscanin Dec 3, 2025
39fb327
feat(clerk): add getSession and signOut methods to ClerkExpoModule an…
chriscanin Dec 3, 2025
6d393b8
feat(user-button): fetch and display user details in UserButton compo…
chriscanin Dec 3, 2025
96dcbbc
Refactor code structure for improved readability and maintainability
chriscanin Dec 4, 2025
9962fdc
Merge remote-tracking branch 'origin/main' into chris/mobile-342-brid…
chriscanin Jan 7, 2026
82edb61
feat(clerk): integrate Clerk SDK for Android with authentication and …
chriscanin Jan 8, 2026
13f7a46
Merge remote-tracking branch 'origin/main' into chris/mobile-343-brid…
chriscanin Jan 16, 2026
b2b12c2
feat(clerk): enhance error handling and user session management in Cl…
chriscanin Jan 22, 2026
638887d
feat(clerk): iOS bridging is working. Only minor debugging left to do.
chriscanin Jan 23, 2026
aba2c72
refactor: Revamp Clerk bridging integration for improved session hand…
chriscanin Jan 23, 2026
36780e7
feat(clerk): update Android integration with new dependency versions …
chriscanin Jan 23, 2026
1a0b4ee
feat: Update Clerk SDK versions and enhance Android packaging
chriscanin Jan 24, 2026
04ba08f
feat: add AuthView component for native authentication flows
chriscanin Jan 27, 2026
d7d2300
feat(clerk): enable native module support and fix module config
chriscanin Feb 3, 2026
7a295ab
feat(expo): add .md suggestion
chriscanin Feb 3, 2026
d5408eb
fix(react): conditionally load UI scripts to prevent document.createE…
chriscanin Feb 4, 2026
184feae
feat: enhance native module support for core-3 and add hooks for auth…
chriscanin Feb 10, 2026
21945eb
clean up images from maestro testing, should not have been commited.
chriscanin Feb 11, 2026
cfc635d
Fix android build for core-3 components release.
chriscanin Feb 12, 2026
73a0f6d
Continued fixes for android build for core-3 components release.
chriscanin Feb 12, 2026
956cdc9
fix: improve native bridge quality and prevent coroutine leaks in And…
chriscanin Feb 13, 2026
b8127fd
Merge origin/main and resolve conflicts
chriscanin Feb 13, 2026
519479b
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Feb 13, 2026
2283b41
Delete .changeset/modern-hornets-fold.md
chriscanin Feb 13, 2026
4559673
fix(expo): address CodeRabbit review feedback
chriscanin Feb 13, 2026
52aa40b
fix(expo): remove unused isSignedIn destructure in UserButton
chriscanin Feb 13, 2026
c36a4a6
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Feb 13, 2026
95c714d
fix(expo): address remaining CodeRabbit review issues (round 2)
chriscanin Feb 13, 2026
2a5d8f1
chore: update changeset to reflect feature scope
chriscanin Feb 13, 2026
e1ad295
fix(expo): address final CodeRabbit review issues (round 3)
chriscanin Feb 13, 2026
4995b61
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Feb 13, 2026
31eccd6
fix(react): remove non-null assertion to satisfy ESLint rule
chriscanin Feb 13, 2026
5aebb5e
fix(expo): resolve all ESLint errors in @clerk/expo
chriscanin Feb 13, 2026
6aa39b3
- Improved session synchronization by writing the JS SDK's client JWT…
chriscanin Feb 24, 2026
d0e7866
App should now have 0 native internals exposed to the user. This is t…
chriscanin Feb 24, 2026
ece2b92
feat(android): enable new architecture support in build.gradle and up…
chriscanin Feb 24, 2026
f66b79c
feat(android): implement new architecture support and refactor Clerk …
chriscanin Feb 24, 2026
d03b662
Update lockfile after expo-modules-core removal
chriscanin Feb 24, 2026
ddc58d3
Merge remote-tracking branch 'origin/main' into chris/mobile-405-reac…
chriscanin Feb 24, 2026
eb3e46b
Fix lint errors in @clerk/expo spec files and imports
chriscanin Feb 24, 2026
6450ede
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Feb 25, 2026
02771e0
Codderrabit comment resolutions
chriscanin Feb 26, 2026
6123d1a
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Feb 26, 2026
5b09fbf
fix(expo): drop support for Expo 50-52 and update peer dependency to …
chriscanin Feb 26, 2026
886615e
fix(expo): make expo-auth-session and expo-web-browser optional depen…
chriscanin Feb 26, 2026
608112e
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Feb 26, 2026
8fa8943
fix(expo): use TurboModuleRegistry.get instead of getEnforcing for Cl…
chriscanin Feb 26, 2026
5d321c9
fix(clerk-js): skip DOM-based captcha in React Native environments
chriscanin Feb 27, 2026
44bee1d
fix(expo): use UnsafeObject instead of object in TurboModule specs
chriscanin Feb 27, 2026
e238e49
feat(expo): add useUserProfileModal hook, remove callback props, pin …
chriscanin Mar 2, 2026
c6c86da
feat(expo): remove callback props from AuthView, add keychain customi…
chriscanin Mar 2, 2026
11c55c0
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 2, 2026
d1c968e
fix(expo): resolve lint errors in native module specs and providers
chriscanin Mar 2, 2026
9aa45b5
fix(expo): suppress consistent-type-imports for dynamic optional imports
chriscanin Mar 2, 2026
8b4dc22
chore: simplify native components changeset to 3 bullet points
chriscanin Mar 2, 2026
5f3be94
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
jacekradko Mar 3, 2026
0d6afa8
fix(expo): captcha guard, keychain customization, non-enforcing nativ…
chriscanin Mar 4, 2026
be91033
Merge remote-tracking branch 'origin/main' into chris/mobile-405-reac…
chriscanin Mar 4, 2026
5485e1d
refactor(expo): consolidate CLERK_CLIENT_JWT_KEY into shared constant
chriscanin Mar 4, 2026
57db664
refactor(expo): use tokenCache abstraction instead of direct SecureSt…
chriscanin Mar 4, 2026
b12c46f
fix(expo): use ClerkRuntimeError with error codes in native views
chriscanin Mar 4, 2026
37d0dbc
fix(expo): add max poll limit to native session fallback polling
chriscanin Mar 4, 2026
4f48db6
fix(expo): distinguish modal dismissal from unexpected errors
chriscanin Mar 4, 2026
27c4ca3
fix(expo): correct error handling for presentUserProfile
chriscanin Mar 4, 2026
2d87892
fix(expo): guard presentUserProfile error logging with __DEV__
chriscanin Mar 4, 2026
21933a6
refactor(expo): hoist isClerkNetworkError helper, remove unnecessary …
chriscanin Mar 4, 2026
b5d4d5e
refactor(expo): move pk change reset to useEffect
chriscanin Mar 4, 2026
14ae51a
refactor(expo): clean up eslint disables in codegen spec files
chriscanin Mar 4, 2026
ff5fe97
chore(expo): remove generated app.plugin.d.ts build artifacts
chriscanin Mar 4, 2026
16b94ca
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 4, 2026
b58159e
fix(expo): fix import sort order after merge from main
chriscanin Mar 4, 2026
5d9bc78
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 5, 2026
aa76e5a
fix(expo): fix iOS auth event handling for password reset and email c…
chriscanin Mar 5, 2026
4c158c5
fix(expo): bump clerk-android to 1.0.5 to fix reset password flow
chriscanin Mar 5, 2026
78fb57c
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 5, 2026
0be41ac
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 5, 2026
ca6c5b6
chore(upgrade): remove expo-native-components upgrade guide
chriscanin Mar 5, 2026
42728b9
fix(expo): bump clerk-android to 1.0.6
chriscanin Mar 5, 2026
d7819f8
temporary comment out org checker step
wobsoriano Mar 5, 2026
98dbc88
temporary comment out org checker step
wobsoriano Mar 5, 2026
83f0903
revert previous commit
wobsoriano Mar 5, 2026
cec4ab5
retry
wobsoriano Mar 5, 2026
0962a90
revert ci
wobsoriano Mar 5, 2026
dd1c7e9
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 6, 2026
b438280
fix(expo): add Kotlin metadata version check skip to config plugin
chriscanin Mar 6, 2026
32fd283
fix(expo): add Kotlin metadata version skip to app.plugin.js
chriscanin Mar 6, 2026
2a98917
fix(expo): bump clerk-android-ui to 1.0.8 and remove Kotlin metadata …
chriscanin Mar 6, 2026
6b9fea2
fix(expo): restore Kotlin metadata skip in library build.gradle
chriscanin Mar 6, 2026
7b8de79
fix(expo): bump clerk-android-ui to 1.0.9
chriscanin Mar 6, 2026
48dc2bc
fix(expo): restore Kotlin metadata skip in app.plugin.js for 1.0.9
chriscanin Mar 6, 2026
0c84f42
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 6, 2026
55d793a
fix(react): use explicit experimental flag for headless runtime inste…
chriscanin Mar 6, 2026
825d79f
refactor(react): unify headless init with replayInterceptedInvocation…
chriscanin Mar 9, 2026
e5b3a67
chore(expo): remove unused NATIVE_IOS_SETUP.md
chriscanin Mar 9, 2026
f8f0f76
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 9, 2026
246f4aa
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 9, 2026
6e42996
fix(expo): gate all console calls behind __DEV__ flag
chriscanin Mar 9, 2026
225abee
fix(expo): gate native_api_disabled console.error behind __DEV__
chriscanin Mar 9, 2026
c59b281
Merge branch 'main' into chris/mobile-405-react-native-components-rel…
chriscanin Mar 9, 2026
a42091f
refactor(expo): address PR review feedback
chriscanin Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/fix-native-bridge-quality.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@clerk/expo': minor
---

- Add native React Native components (AuthView, UserButton, UserProfileView) with `useUserProfileModal()` hook
- Add native Google Sign-In via Credential Manager (Android) and ASAuthorization (iOS)
- Update to Core-3 Signal APIs
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,10 @@ sessions.pem
# pkglab / Verdaccio local registry
.verdaccio

# yalc
.yalc/
yalc.lock

# Release preflight
.release-artifacts/

Expand Down
57 changes: 51 additions & 6 deletions packages/expo/android/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.plugin.compose' version '2.1.20'
}

// Required for React Native codegen to generate Fabric component descriptors
if (project.hasProperty("newArchEnabled") && project.newArchEnabled == "true") {
apply plugin: "com.facebook.react"
}

group = 'com.clerk.expo'
version = '1.0.0'
Expand All @@ -10,14 +18,19 @@ ext {
credentialsVersion = "1.3.0"
googleIdVersion = "1.1.1"
kotlinxCoroutinesVersion = "1.7.3"
clerkAndroidApiVersion = "1.0.6"
clerkAndroidUiVersion = "1.0.9"
composeVersion = "1.7.0"
activityComposeVersion = "1.9.0"
lifecycleVersion = "2.8.0"
}

def safeExtGet(prop, fallback) {
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}

android {
namespace "expo.modules.clerk.googlesignin"
namespace "expo.modules.clerk"

compileSdk safeExtGet("compileSdkVersion", 36)

Expand All @@ -41,18 +54,32 @@ android {

kotlinOptions {
jvmTarget = "17"
// clerk-android transitive deps (e.g. telemetry-api) still ship Kotlin 2.3.x metadata
freeCompilerArgs += ['-Xskip-metadata-version-check']
}

buildFeatures {
compose = true
}

packaging {
resources {
excludes += ['META-INF/versions/9/OSGI-INF/MANIFEST.MF']
}
}

sourceSets {
main {
java.srcDirs = ['src/main/java']
java.srcDirs = ['src/main/java', "${project.buildDir}/generated/source/codegen/java"]
}
}
}

// Note: kotlin-stdlib exclusions are handled in the clerk-android-ui dependency declaration

dependencies {
// Expo modules core
implementation project(':expo-modules-core')
// React Native
implementation 'com.facebook.react:react-native:+'

// Credential Manager for Google Sign-In with nonce support
implementation "androidx.credentials:credentials:$credentialsVersion"
Expand All @@ -61,4 +88,22 @@ dependencies {

// Coroutines for async operations
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlinxCoroutinesVersion"

// Clerk Android SDK with prebuilt UI
// Exclude kotlin-stdlib to prevent 2.3.0 from polluting the project
// Exclude okhttp to prevent version conflict with React Native's okhttp
implementation("com.clerk:clerk-android-ui:$clerkAndroidUiVersion") {
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib'
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk7'
exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
exclude group: 'com.squareup.okhttp3', module: 'okhttp-urlconnection'
}

// Jetpack Compose for wrapping Clerk views
implementation "androidx.compose.ui:ui:$composeVersion"
implementation "androidx.compose.material3:material3:1.3.0"
implementation "androidx.activity:activity-compose:$activityComposeVersion"
implementation "androidx.lifecycle:lifecycle-runtime-compose:$lifecycleVersion"
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycleVersion"
}
15 changes: 15 additions & 0 deletions packages/expo/android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,2 +1,17 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<!-- Clerk Auth Activity - hosts AuthView for sign-in/sign-up flows -->
<activity
android:name="expo.modules.clerk.ClerkAuthActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
android:exported="false"
android:windowSoftInputMode="adjustResize" />

<!-- Clerk User Profile Activity - hosts UserProfileView for account management -->
<activity
android:name="expo.modules.clerk.ClerkUserProfileActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
android:exported="false"
android:windowSoftInputMode="adjustResize" />
</application>
</manifest>
Loading
Loading