diff --git a/src/components/TokenUtils.astro b/src/components/TokenUtils.astro
new file mode 100644
index 000000000..f99b2b3fa
--- /dev/null
+++ b/src/components/TokenUtils.astro
@@ -0,0 +1,30 @@
+
diff --git a/src/content/docs/developer-tools/about/our-sdks.mdx b/src/content/docs/developer-tools/about/our-sdks.mdx
index 18a1343bf..ca30c236a 100644
--- a/src/content/docs/developer-tools/about/our-sdks.mdx
+++ b/src/content/docs/developer-tools/about/our-sdks.mdx
@@ -48,7 +48,7 @@ Make sure that your tech stack’s versions are compatible with the SDK you want
- [Android SDK](/developer-tools/sdks/native/android-sdk/)
- [iOS SDK](/developer-tools/sdks/native/ios-sdk/)
- [React Native SDK](/developer-tools/sdks/native/react-native-sdk/)
-- [Expo and React Native SDK](/developer-tools/sdks/native/expo-react-native/)
+- [Expo and React Native SDK](/developer-tools/sdks/native/expo/)
- [Flutter SDK ](/developer-tools/sdks/native/flutter-sdk/)
## **Other**
diff --git a/src/content/docs/developer-tools/sdks/native/expo-react-native.mdx b/src/content/docs/developer-tools/sdks/native/expo-react-native.mdx
deleted file mode 100644
index 70b2aae92..000000000
--- a/src/content/docs/developer-tools/sdks/native/expo-react-native.mdx
+++ /dev/null
@@ -1,1048 +0,0 @@
----
-page_id: 3e372a8b-9168-4d50-a5e7-13941cfbd632
-title: Expo and React Native SDK
-sidebar:
- order: 20
-relatedArticles:
- - f626b8e4-79c2-4d17-8148-b298c115a552
-head:
- - tag: meta
- attrs:
- property: "og:image"
- content: "https://kinde.com/assets/images/open-graph/DOCS-SSI-SDK_react-native.png"
----
-
-The Kinde React Native SDK allows developers to quickly and securely integrate a new or an existing React Native application into the Kinde platform. This SDK is for people using Expo.
-
-## Supported versions
-
-We support Expo with React Native versions 0.70 and higher.
-
-Use this document for Expo and React Native.
-
-To use just React Native, see [React Native SDK](/developer-tools/sdks/native/react-native-sdk/). You can also view the [React Native docs](https://github.com/kinde-oss/kinde-react-native-sdk-0-7x) and [React Native starter kit](https://github.com/kinde-oss/kinde-react-native-sdk-0-7x) in GitHub.
-
-We are working on creating an updated Expo package (it is being tested) and we will add a link here when it's ready.
-
-## Register for Kinde
-
-If you haven’t already got a Kinde account, [register for free here](https://app.kinde.com/register) (no credit card required). Registering gives you a Kinde domain, which you need to get started, e.g. `yourapp.kinde.com`.
-
-## Before you install
-
-You will need Node, the React Native command line interface, a JDK, Android Studio (for Android) and Xcode (for iOS).
-
-Follow [the installation instructions for your chosen OS](https://reactnative.dev/docs/environment-setup) to install dependencies.
-
-## **Installation with Expo Managed Workflow**
-
-
-
-## **Installation with Bare React Native**
-
-### **Android**
-
-1. The SDK can be installed using your package manager or `expo` cli
-
-
-
- ```shell title="With Expo CLI"
- expo install @kinde-oss/react-native-sdk-0-7x
- ```
-
- ```shell title="With Expo CLI (npx)"
- npx expo install @kinde-oss/react-native-sdk-0-7x
- ```
-
-2. Configure the deep link support for your app
-
- ```shell
- npx uri-scheme add
-
- # npx uri-scheme add myapp
-
- ```
-
-3. Edit `android/settings.gradle`
-
- ```java
- ...
-
- include ':react-native-keychain'
- project(':react-native-keychain').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-keychain/android')
-
- include ':react-native-inappbrowser-reborn'
- project(':react-native-inappbrowser-reborn').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-inappbrowser-reborn/android')
- ...
-
- ```
-
-4. Edit `android/app/build.gradle`
-
- ```java
- apply plugin: 'com.android.application'
-
- android {
- ...
- }
-
- dependencies {
- ...
-
- implementation project(':react-native-keychain')
- implementation project(':react-native-inappbrowser-reborn')
-
- ...
- }
-
- ```
-
-5. Edit `MainApplication.java`
-
- ```java
- ...
- import com.oblador.keychain.KeychainPackage;
- import com.proyecto26.inappbrowser.RNInAppBrowserPackage;
- ...
-
- public class MainApplication extends Application implements ReactApplication {
- private final ReactNativeHost mReactNativeHost =
- new ReactNativeHost(this) {
- ...
- @Override
- protected List getPackages() {
- ...
- List packages = new PackageList(this).getPackages();
- packages.add(new KeychainPackage());
- packages.add(new RNInAppBrowserPackage());
- ...
- return packages;
- }
- ...
- };
-
- ...
- }
- ...
-
- ```
-
- In React Native version 0.73 or above, the `MainApplication.java` file has been replaced with `MainApplication.kt`
-
- ```kotlin
- import com.oblador.keychain.KeychainPackage;
- import com.proyecto26.inappbrowser.RNInAppBrowserPackage;
- ...
-
- class MainApplication : Application(), ReactApplication {
- override val reactNativeHost: ReactNativeHost =
- object : DefaultReactNativeHost(this) {
- override fun getPackages(): List =
- PackageList(this).packages.apply {
- // Packages that cannot be autolinked yet can be added manually here, for example:
- // add(MyReactNativePackage())
- add(KeychainPackage());
- add(RNInAppBrowserPackage());
- }
-
- ...
- }
-
- ...
- }
- ```
-
-6. Execute the command `yarn run android` or `npx expo run:android`
-
-### **iOS**
-
-1. Install the **CocoaPods**. We recommend installing **CocoaPods** using [Homebrew](https://brew.sh/).
-
- ```shell
- # Install CocoaPods via brew
- brew install cocoapods
-
- ```
-
-2. Install the SDK
-
- ```shell
- expo install @kinde-oss/react-native-sdk-0-7x expo-secure-store expo-web-browser expo-constants
- // or
- npx expo install @kinde-oss/react-native-sdk-0-7x expo-secure-store expo-web-browser expo-constants
-
- ```
-
-3. Add the following to your `Podfile` and run pod update:
-
- ```swift
- pod 'RNKeychain', :path => '../node_modules/react-native-keychain'
- pod 'RNInAppBrowser', :path => '../node_modules/react-native-inappbrowser-reborn'
-
- ```
-
- ```shell
- cd ios && pod update
-
- ```
-
-4. Execute the command `yarn run ios` or `npx expo run:ios`
-
-If you encounter any errors during the SDK installation process, you can refer to the **General tips** section at the bottom of this document, for troubleshooting guidance.
-
-## K**inde configuration**
-
-1. In Kinde, go to **Settings > Applications.**
-2. Select **View details** on the **Frontend app**.
-3. Scroll down to the **Callback URLs** section.
-4. Add in the callback URLs for your React Native app, which should look something like this:
- - Allowed callback URLs - `/kinde_callback`
- - Allowed logout redirect URLs - `/kinde_callback`
-
-Make sure you press the Save button at the bottom of the page!
-
-Note: The `/kinde_callback/kinde_callback` is used as an example of local URL Scheme, change to the local URL Scheme or production URL Scheme that you use.
-
-## Environments
-
-If you would like to use our Environments feature as part of your development process. You will need to create them first within your Kinde account. In this case you would use the Environment subdomain in the code block above.
-
-## Configure your app
-
-### **Environment variables**
-
-Put these variables in your .env file. You can find these variables on the same page as where you set the callback URLs.
-
-- `KINDE_ISSUER_URL` - your Kinde domain
-- `KINDE_POST_CALLBACK_URL` - After the user authenticates we will callback to this address. Make sure this URL is under your allowed callback URLs
-- `KINDE_POST_LOGOUT_REDIRECT_URL` - where you want users to be redirected to after logging out. Make sure this URL is under your allowed logout redirect URLs
-- `KINDE_CLIENT_ID` - you can find this on the App Keys page
-
-```jsx
-KINDE_ISSUER_URL=https://.kinde.com
-KINDE_POST_CALLBACK_URL=/kinde_callback
-KINDE_POST_LOGOUT_REDIRECT_URL=/kinde_callback
-KINDE_CLIENT_ID=
-
-```
-
-Note: The `myapp://localhost:3000/kinde_callback` is used as an example of local URL Scheme, change to the local URL Scheme or production URL Scheme that you use.
-
-## Configuration deep link
-
-### **Linking to your app**
-
-To link to your [development](https://docs.expo.dev/development/introduction/) build or standalone app, you need to specify a custom URL scheme for your app. You can register a scheme in your Expo config (**app.json**, **app.config.js**) by adding a string under the `scheme` key:
-
-```json
-{
- "expo": {
- "scheme": "myapp",
- ...
- }
-}
-
-```
-
-### **Linking to Expo Go**
-
-[Expo Go](https://expo.dev/expo-go) uses the `exp://` scheme, however, if we link to `exp://` without any address afterward, it will open the app to the home screen.
-
-In development, your app will live at a url like `exp://127.0.0.1:19000`. When published, an experience will be hosted at a URL like `exp://u.expo.dev/[project-id]?channel-name=channel-name]&runtime-version=[runtime-version]`, where `u.expo.dev/[project-id]` is the hosted URL that Expo Go fetches from.
-
-**Caution**: You also should update your callback URL to both your app and Kinde.
-
-```jsx
-KINDE_ISSUER_URL=https://your_kinde_domain.kinde.com
-KINDE_POST_CALLBACK_URL=exp://your_machine_ip:your_machine_port // f.e: exp://127.0.0.1:19000
-KINDE_CLIENT_ID=your_kinde_client_id
-KINDE_POST_LOGOUT_REDIRECT_URL=exp://your_machine_ip:your_machine_port // f.e: exp://127.0.0.1:19000
-
-```
-
-## Integrate with your app
-
-To create a new instance of the KindeSDK object, execute the code below.
-
-```jsx
-...
-import { KindeSDK } from '@kinde-oss/react-native-sdk-0-7x';
-...
-
-...
-const client = new KindeSDK(YOUR_KINDE_ISSUER, YOUR_KINDE_REDIRECT_URI, YOUR_KINDE_CLIENT_ID, YOUR_KINDE_LOGOUT_REDIRECT_URI);
-...
-
-```
-
-## Sign in and registration
-
-Kinde provides methods for easily implementing a login / register flow.
-
-As an example if you add buttons as follows.
-
-```jsx
-
-
-
-
-
-
-
-
-```
-
-Then define new functions that match for each button.
-
-Note: Make sure you've already defined **KindeSDK** as **client** in the state.
-
-```jsx
-...
-const handleSignUp = async () => {
- const token = await client.register();
- if (token) {
- // User was authenticated
- }
-};
-
-const handleSignIn = async () => {
- const token = await client.login();
- if (token) {
- // User was authenticated
- }
-};
-...
-
-```
-
-## **Log out**
-
-This is implemented in much the same way as signing in or registering. The Kinde SPA client comes with a logout method:
-
-```jsx
-const handleLogout = async () => {
- const loggedOut = await client.logout();
- if (loggedOut) {
- // User was logged out
- }
-};
-```
-
-We have also implemented an API for token revocation. Pass `true` as an argument in the `logout` function. This flag will assist in revoking the token without having to open the website within your apps.
-
-```jsx
-const handleLogout = async () => {
- const loggedOut = await client.logout(true);
- if (loggedOut) {
- // User was logged out
- }
-};
-```
-
-**Note: Handle redirects are now deprecated**
-
-Starting from version 1.1 of the SDK, the need to handle redirects has been eliminated. Authentication is now performed by launching a web browser within your app instead of relying on an external browser. For a comprehensive example of how to handle authentication, see below.
-
-## **Full code sample for authentication**
-
-```jsx
-const checkAuthenticate = async () => {
- // Using `isAuthenticated` to check if the user is authenticated or not
- if (await client.isAuthenticated) {
- // Need to implement, e.g: call an api, etc...
- } else {
- // Need to implement, e.g: redirect user to sign in, etc..
- }
-};
-
-useEffect(() => {
- checkAuthenticate();
-}, []);
-
-const handleSignIn = async () => {
- const token = await client.login();
-
- if (token) {
- // Need to implement, e.g: call an api, etc...
- }
-};
-
-const handleSignUp = async () => {
- const token = await client.register();
-
- if (token) {
- // Need to implement, e.g: call an api, etc...
- }
-};
-
-const handleLogout = async () => {
- // With open web in your apps
- const isLoggedOut = await client.logout();
-
- if (isLoggedOut) {
- // Need to implement, e.g: redirect user to login screen, etc...
- }
-
- // Without open web in your apps
- const isLoggedOut = await client.logout();
-
- if (isLoggedOut) {
- // Need to implement, e.g: redirect user to login screen, etc...
- }
-};
-```
-
-## **Get user information**
-
-To access the user information, use the `getUserDetails` helper function.
-
-```jsx
-const userProfile = await client.getUserDetails();
-console.log(userProfile);
-// output: {"given_name":"Dave","id":"abcdef","family_name":"Smith","email":"dave@smith.com"}
-```
-
-## View users in Kinde
-
-Go to the **Users** page within Kinde to see your newly registered user.
-
-### User Permissions
-
-Once a user has been verified, your product/application will return the JWT token with an array of permissions for that user. You will need to configure your product/application to read permissions and unlock the respective functions.
-
-[Set permissions](/manage-users/roles-and-permissions/user-permissions/) in your Kinde account. Here’s an example set of permissions.
-
-```jsx
-const permissions = [
- "create:todos",
- "update:todos",
- "read:todos",
- "delete:todos",
- "create:tasks",
- "update:tasks",
- "read:tasks",
- "delete:tasks"
-];
-```
-
-We provide helper functions to more easily access permissions.
-
-```jsx
-await client.getPermission("create:todos");
-// {orgCode: "org_1234", isGranted: true}
-
-await client.getPermissions();
-// {orgCode: "org_1234", permissions: ["create:todos", "update:todos", "read:todos"]}
-```
-
-A practical example in code might look something like.
-
-```jsx
-if ((await client.getPermission("create:todos")).isGranted) {
- // show Create Todo button in UI
-}
-```
-
-## Audience
-
-An audience is the intended recipient of an access token - for example the API for your application. The audience argument can be passed to the Kinde client to request an audience be added to the token.
-
-The audience of a token is the intended recipient of the token.
-
-```jsx
-const client = new KindeSDK(
- YOUR_KINDE_ISSUER,
- YOUR_KINDE_REDIRECT_URI,
- YOUR_KINDE_CLIENT_ID,
- YOUR_KINDE_LOGOUT_REDIRECT_URI,
- YOUR_SCOPES,
- {
- audience: "api.yourapp.com"
- }
-);
-```
-
-For details on how to connect, see [Register an API](/developer-tools/your-apis/register-manage-apis/).
-
-## Overriding scope
-
-By default the `KindeSDK` requests the following scopes:
-
-- profile
-- email
-- offline
-- openid
-
-You can override this by passing scope into the KindeSDK
-
-```jsx
-const client = new KindeSDK(
- YOUR_KINDE_ISSUER,
- YOUR_KINDE_REDIRECT_URI,
- YOUR_KINDE_CLIENT_ID,
- YOUR_KINDE_LOGOUT_REDIRECT_URI,
- "profile email offline openid"
-);
-```
-
-## Getting claims
-
-We have provided a helper to grab any claim from your id or access tokens. The helper defaults to access tokens:
-
-```jsx
-await client.getClaim("aud");
-// ["api.yourapp.com"]
-
-await client.getClaim("given_name", "id_token");
-// "David"
-```
-
-## Organizations
-
-For information about how organizations work in Kinde, see [Kinde organizations for developers](/build/organizations/orgs-for-developers/).
-
-### Create an organization
-
-To create a new organization within your application, you will need to run a similar function to this.
-
-```jsx
-
-```
-
-Then define the function of the button.
-
-Make sure you've already defined `KindeSDK` as the **client** in the state.
-
-```jsx
-const handleCreateOrg = () => {
- client.createOrg();
-};
-
-// You can also pass `org_name` as your organization
-client.createOrg({org_name: "Your Organization"});
-```
-
-### Sign in and sign up to organizations
-
-Kinde has a unique code for every organization. You’ll have to pass this code through when you register a new user.
-
-Example function below:
-
-```jsx
-client.register({org_code: "your_org_code"});
-```
-
-If you want a user to sign in into a particular organization, pass this code along with the sign in method.
-
-```jsx
-client.login({org_code: "your_org_code"});
-```
-
-Following authentication, Kinde provides a json web token (jwt) to your application. Along with the standard information we also include the `org_code` and the permissions for that organization (this is important as a user can belong to multiple organizations and have different permissions for each). Example of a returned token:
-
-Example of a returned token:
-
-```jsx
-{
- "aud": [],
- "exp": 1658475930,
- "iat": 1658472329,
- "iss": "https://your_subdomain.kinde.com",
- "jti": "123457890",
- "org_code": "org_1234",
- "permissions": ["read:todos", "create:todos"],
- "scp": ["openid", "profile", "email", "offline"],
- "sub": "kp:123457890"
-}
-
-```
-
-The `id_token` will also contain an array of organizations that a user belongs to - this is useful if you wanted to build out an organization switcher for example.
-
-```jsx
-{
- ...
- "org_codes": ["org_1234", "org_4567"]
- ...
-}
-
-```
-
-There are two helper functions you can use to extract information.
-
-```jsx
-await client.getOrganization();
-// {orgCode: "org_1234"}
-
-await client.getUserOrganizations();
-// {orgCodes: ["org_1234", "org_abcd"]}
-```
-
-## Token Storage
-
-Once the user has successfully authenticated, you'll have a JWT and a refresh token and that has been stored securely. E.g. using the `getAccessToken` method of the `Storage` class to get an access token.
-
-```jsx
-...
-import { Storage } from '@kinde-oss/react-native-sdk-0-7x'
-...
-
-const accessToken = await Storage.getAccessToken();
-console.log('access_token', accessToken);
-
-```
-
-We're using the [expo-secure-store](https://www.npmjs.com/package/expo-secure-store) for `Expo`.
-
-The storage handler can be found at: [Storage class](https://github.com/kinde-oss/kinde-react-native-sdk-0-7x/blob/main/dist/SDK/Storage/index.d.ts)
-
-## **How to test**
-
-Run the test suite using the following command at the root of your React Native.
-
-```shell
-npm run test
-
-```
-
-Note: Ensure you have already run `npm install`
-
-## SDK API Reference
-
-### `issuer`
-
-Either your Kinde URL or your custom domain. e.g `https://yourapp.kinde.com`.
-
-Type: `string`
-
-Required: Yes
-
-### `redirectUri`
-
-The URL that the user will be returned to after authentication.
-
-Type: `string`
-
-Required: Yes
-
-### `clientId`
-
-The unique ID of your application in Kinde.
-
-Type: `string`
-
-Required: Yes
-
-### `logoutRedirectUri`
-
-Where your user will be redirected when they sign out.
-
-Type: `string`
-
-Required: No
-
-### `scope`
-
-The scopes to be requested from Kinde.
-
-Type: `boolean`
-
-Required: No
-
-Default: `openid profile email offline`
-
-### `additionalParameters`
-
-Additional parameters that will be passed in the authorization request.
-
-Type: `object`
-
-Required: No
-
-Default: `{}`
-
-### `additionalParameters - audience`
-
-The audience claim for the JWT.
-
-Type: `string`
-
-Required: No
-
-## **KindeSDK** methods
-
-### `login`
-
-Constructs a redirect URL and sends the user to Kinde to sign in.
-
-Arguments:
-
-```jsx
-{org_code?: string}
-```
-
-Usage:
-
-```jsx
-await kinde.login();
-or;
-await kinde.login({org_code: "your organization code"});
-```
-
-Allow `org_code` to be provided if a specific organization is being signed into.
-
-Sample output:
-
-```jsx
-{
- "access_token": "eyJhbGciOiJSUzI...",
- "expires_in": 86400,
- "id_token": "eyJhbGciOiJSU...",
- "refresh_token": "yXI1bFQKbXKLD7AIU...",
- "scope": "openid profile email offline",
- "token_type": "bearer"
-}
-```
-
-### `register`
-
-Constructs a redirect URL and sends the user to Kinde to sign up.
-
-Arguments:
-
-```jsx
-{org_code?: string}
-```
-
-Usage:
-
-```jsx
-await kinde.register();
-or;
-await kinde.register({org_code: "your organization code"});
-```
-
-Allow `org_code` to be provided if a specific organization is being registered to.
-
-Sample output:
-
-```jsx
-{
- "access_token": "eyJhbGciOiJSUzI...",
- "expires_in": 86400,
- "id_token": "eyJhbGciOiJSU...",
- "refresh_token": "yXI1bFQKbXKLD7AIU...",
- "scope": "openid profile email offline",
- "token_type": "bearer"
-}
-```
-
-### `logout`
-
-Logs the user out of Kinde.
-
-Arguments:
-
-```jsx
-isRevoke: boolean; // default is false
-```
-
-Usage:
-
-```jsx
-await kinde.logout();
-or;
-await kinde.logout(true);
-```
-
-Sample output: `true` or `false`
-
-### `getToken`
-
-Returns the raw Access token from URL after logged from Kinde.
-
-Arguments:
-
-```jsx
-url?: string
-```
-
-Usage:
-
-```jsx
-await kinde.getToken(url);
-or;
-await kinde.getToken();
-```
-
-You need to have already authenticated. Otherwise, an error will occur.
-
-Sample output:
-
-```jsx
-{
- "access_token": "eyJhbGciOiJSUzI...",
- "expires_in": 86400,
- "id_token": "eyJhbGciOiJSU...",
- "refresh_token": "yXI1bFQKbXKLD7AIU...",
- "scope": "openid profile email offline",
- "token_type": "bearer"
-}
-```
-
-### `createOrg`
-
-Constructs a redirect URL and sends the user to Kinde to sign up and create a new organization in your business.
-
-Arguments:
-
-```jsx
-{org_name?: string}
-```
-
-Usage:
-
-```jsx
-await kinde.createOrg();
-or;
-await kinde.createOrg({org_name: "your organization name"});
-```
-
-Allow `org_name` to be provided if you want a specific organization name when you create.
-
-Sample output:
-
-```jsx
-{
- "access_token": "eyJhbGciOiJSUzI...",
- "expires_in": 86400,
- "id_token": "eyJhbGciOiJSU...",
- "refresh_token": "yXI1bFQKbXKLD7AIU...",
- "scope": "openid profile email offline",
- "token_type": "bearer"
-}
-```
-
-### `getClaim`
-
-Gets a claim from an access or ID token.
-
-Arguments:
-
-```jsx
-claim: string; tokenKey?: string
-```
-
-Usage:
-
-```jsx
-await kinde.getClaim("given_name", "id_token");
-```
-
-Sample output:
-
-```jsx
-"David";
-```
-
-### `getPermission`
-
-Returns the state of a given permission.
-
-Arguments: `key: string`
-
-Usage:
-
-```jsx
-await kinde.getPermission("read:todos");
-```
-
-Sample output:
-
-```jsx
-{
- "orgCode": "org_1234",
- "isGranted": true
-}
-```
-
-### `getPermissions`
-
-Returns all permissions for the current user for the organization they are signed into.
-
-Usage:
-
-```jsx
-await kinde.getPermissions();
-```
-
-Sample output:
-
-```jsx
-{
- "orgCode":"org_1234",
- "permissions": ["create:todos","update:todos","read:todos"]
-}
-```
-
-### `getOrganization`
-
-Get details for the organization your user is signed into.
-
-Usage:
-
-```jsx
-await kinde.getOrganization();
-```
-
-Sample output:
-
-```jsx
-{
- "orgCode": "org_1234"
-}
-```
-
-### `getUserDetails`
-
-Returns the profile for the current user.
-
-Usage:
-
-```jsx
-await kinde.getUserDetails();
-```
-
-Sample output:
-
-```jsx
-{
- "given_name": "Dave",
- "id": "abcdef",
- "family_name": "Smith",
- "email": "dave@smith.com"
-}
-```
-
-### `getUserOrganizations`
-
-Gets an array of all organizations the user has access to.
-
-Usage:
-
-```jsx
-await kinde.getUserOrganizations();
-```
-
-Sample output:
-
-```jsx
-{ "orgCodes": ["org1234", "org5678"] }
-```
-
-### `isAuthenticated`
-
-Return the boolean to demonstrate whether the user is authenticated or not.
-
-Usage:
-
-```jsx
-await kinde.isAuthenticate;
-```
-
-Sample output: `true` or `false`
-
-## General tips
-
-### **Building Issues**
-
-- **`'value'`** **is unavailable: introduced in iOS 12.0**
-
- If you got the error **'value' is unavailable: introduced in iOS 12.0** when trying to build the app, you can follow the below steps to fix that:
-
- 1. In your Xcode project navigator, select **Pods.**
- 2. Under Targets, select **React-Codegen**.
- 3. Select the **Build Settings** tab**.**
- 4. Under **Deployment**, set **iOS Deployment Target** to **12.4.**
- 5. Clean project and rebuild: **Product > Clean Build Folder, Product > Build.**
-
-
-
-- Dependency `'androidx.browser:browser:1.6.0-beta01'` requires libraries and applications that depend on it to compile against version 34 or later of the Android APIs.
-
- The solution is add `androidXBrowser = "1.4.0"` in your project.
-
- ```java
- // android/build.gradle
- buildscript {
- ...
- ext {
- // ...
- androidXBrowser = "1.4.0"
- // ....
- }
- ...
- }
-
-
- ```
-
-- Duplicate class **kotlin.collections.jdk8.CollectionsJDK8Kt** found in modules **jetified-kotlin-stdlib-1.8.10** (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and **jetified-kotlin-stdlib-jdk8-1.7.22** (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.22)
-
- The solution is add `org.jetbrains.kotlin:kotlin-bom:1.8.0` dependency in your project.
-
- ```text
- // android/app/build.grade
- dependencies {
- ...
- implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
- ...
- }
-
-
- ```
-
-### **Caching Issues**
-
-Sometimes there will be issues related to caching when you develop React Native.
-There are some recommendations for cleaning the cache:
-
-1. Remove `node_modules`, `yarn.lock` or `package-lock.json`.
-2. Clean cache: `yarn cache clean` or `npm cache clean --force`.
-3. Make sure you have changed values in `.env` file.
-4. Trying to install packages again: `yarn install` or `npm install`.
-5. Run Metro Bundler: `yarn start --reset-cache` or `npm start --reset-cache`.
-
-Assume your StarterKit path is ``.
-
-**Clean cache for Android**
-
-1. Run this:
-
- ```shell
- cd /android
- ./gradlew clean
-
- ```
-
-**Clean cache for iOS**
-
-1. Run this:
-
- ```shell
- cd /ios
- rm -rf Pods && rm Podfile.lock
-
- ```
-
-2. Clean build folders on **Xcode**.
-
-If you need help connecting to Kinde, please contact us at [support@kinde.com](mailto:support@kinde.com).
diff --git a/src/content/docs/developer-tools/sdks/native/expo.mdx b/src/content/docs/developer-tools/sdks/native/expo.mdx
new file mode 100644
index 000000000..653f306e8
--- /dev/null
+++ b/src/content/docs/developer-tools/sdks/native/expo.mdx
@@ -0,0 +1,414 @@
+---
+page_id: 3e372a8b-9168-4d50-a5e7-13941cfbd632
+title: Expo
+sidebar:
+ order: 20
+relatedArticles:
+ - f626b8e4-79c2-4d17-8148-b298c115a552
+tableOfContents:
+ maxHeadingLevel: 3
+head:
+ - tag: meta
+ attrs:
+ property: "og:image"
+ content: "https://kinde.com/assets/images/open-graph/DOCS-SSI-SDK_react-native.png"
+---
+
+The Kinde React Native SDK allows developers to quickly and securely integrate a new or an existing React Native application into the Kinde platform. This SDK is for people using Expo.
+
+## Register for Kinde
+
+If you haven't already got a Kinde account, [register for free here](https://app.kinde.com/register) (no credit card required). Registering gives you a Kinde domain, which you need to get started, e.g. `yourapp.kinde.com`.
+
+## Before you install
+
+You will need Node, the React Native command line interface, a JDK, Android Studio (for Android) and Xcode (for iOS).
+
+Follow [the installation instructions for your chosen OS](https://reactnative.dev/docs/environment-setup) to install dependencies.
+
+## Installation with Expo Managed Workflow
+
+### Install package
+
+
+
+### Setup provider
+
+```jsx
+", // e.g https://mybusiness.kinde.com
+ clientId: "",
+ }}
+ // All callbacks are optional
+ callbacks={{
+ onSuccess: async (token, state, context) => {
+ },
+ onError: (error) => {
+ },
+ onEvent: async (event, state, context) => {
+ },
+ }}
+>
+ {/* Your app components go here */}
+
+```
+
+### Auth Methods
+
+```jsx
+const kinde = useKindeAuth();
+
+const handleSignUp = async () => {
+ const token = await kinde.register();
+
+ if (token) {
+ // User was authenticated
+ }
+};
+
+const handleSignIn = async () => {
+ const token = await kinde.login();
+ if (token) {
+ // User was authenticated
+ }
+};
+
+const handleLogout = async () => {
+ console.log("logout", await kinde.logout());
+};
+```
+
+#### Example usage
+
+```jsx
+
+ Sign In
+
+```
+
+Login and register methods accept and object containing all [Kinde supported URL parameters](https://docs.kinde.com/developer-tools/about/using-kinde-without-an-sdk/#request-parameters).
+
+Logout accepts object which allows you to revoke the token
+
+```jsx
+kinde.logout({ revokeToken: true })
+```
+
+#### Properties (Only available from `useKindeAuth`)
+
+- `isAuthenticated` - Returns true/false if the user is authenticated
+
+## Kinde configuration
+
+1. In Kinde, go to **Settings > Applications.**
+2. Select **View details** on the **Frontend app**.
+3. Scroll down to the **Callback URLs** section.
+4. Add in the callback URLs for your React Native app, which should look something like this:
+ - Allowed callback URLs - ``
+ - Allowed logout redirect URLs - ``
+
+
+Make sure you press the Save button at the bottom of the page!
+
+Note: The `` is used as an example of local URL Scheme, change to the local URL Scheme or production URL Scheme that you use.
+
+## Token Utilities
+
+All utility functions from `@kinde/js-utils` are available through `@kinde/expo/utils` and also through the `useKindeAuth` hook. This allows you to use these utilities directly in your Expo application.
+
+```ts
+import { getUserProfile, getFlag, getRoles } from "@kinde/expo/utils";
+
+// Example usage
+const checkUserProfile = async () => {
+ const profile = await getUserProfile();
+ console.log("User profile:", profile);
+};
+```
+
+#### Utility functions include:
+
+- `getDecodedToken` - Get token decoded values
+- `getUserProfile` - Get the current user's profile
+- `getFlag` - Check feature flag values
+- `getRoles` - Get the current user's roles
+- `getCurrentOrganization` - Get the current organization
+- `getUserOrganizations` - Get all organizations the user belongs to
+- `getPermission` - get a single permission value
+- `getPermissions` - get all user permissions
+- `getClaim` - Get a specific claim from the token
+- `getClaims` - Get all claims from the token
+- `refreshToken` - Manually refresh the access token
+
+
+### `getDecodedToken`
+
+Get the decoded access token or ID token.
+
+```typescript
+getDecodedToken = async (
+ tokenType: "accessToken" | "idToken" = StorageKeys.accessToken,
+): Promise<(T & JWTDecoded) | null>
+```
+
+Example usage:
+```javascript
+// Get the decoded access token
+const decodedAccessToken = await getDecodedToken("accessToken");
+// Get the decoded ID token
+const decodedIdToken = await getDecodedToken("idToken");
+
+// Adding custom claims to the decoded token
+const decodedAccessTokenWithCustomClaims = await getDecodedToken<{
+ customClaim: string;
+}>("accessToken");
+```
+
+### `getClaim`
+
+Gets a claim from an access or ID token.
+
+```typescript
+getClaim = async (
+ keyName: keyof T,
+ tokenType: "accessToken" | "idToken" = "accessToken",
+): Promise<{
+ name: keyof T;
+ value: V;
+} | null>
+```
+
+Example usage:
+```javascript
+// Get the decoded access token
+const roles = await getClaim("roles", "accessToken");
+// Get the decoded ID token
+const givenName = await getClaim("given_name", "idToken");
+
+// Acessing custom claims
+const decodedAccessTokenWithCustomClaims = await getClaim<{
+ customClaim: string;
+}>("customClaim", "accessToken");
+```
+
+### `getCurrentOrganization`
+
+Returns the current users logged in organization code.
+
+```typescript
+getCurrentOrganization = async (): Promise
+```
+
+Example usage:
+```javascript
+// Get the decoded access token
+const orgCode = await getCurrentOrganization();
+// org_123456
+```
+
+### `getUserOrganizations`
+
+Returns all organization codes the current user belongs to.
+
+```typescript
+getUserOrganizations = async (): Promise
+```
+
+Example usage:
+```javascript
+// Get the decoded access token
+const orgCode = await getUserOrganizations();
+// [
+// "org_0000000000001",
+// "org_0000000000002",
+// "org_0000000000003",
+// "org_0000000000004"
+// ]
+```
+
+### `getFlag`
+
+Get the value of a feature flag.
+
+```typescript
+getFlag = async (
+ name: string,
+): Promise
+```
+
+Example usage:
+```javascript
+// Get the feature flag value
+const featureValue = await getFlag("feature_flag_name");
+
+// Define the type of the feature flag
+const featureValue = await getFlag("feature_flag_name");
+const featureValue = await getFlag("feature_flag_name");
+const featureValue = await getFlag("feature_flag_name");
+const featureValue = await getFlag