{"id":25457393,"url":"https://github.com/livekit/client-sdk-react-native","last_synced_at":"2025-04-07T13:08:02.769Z","repository":{"id":38349777,"uuid":"466724366","full_name":"livekit/client-sdk-react-native","owner":"livekit","description":null,"archived":false,"fork":false,"pushed_at":"2024-04-10T10:49:19.000Z","size":2675,"stargazers_count":84,"open_issues_count":19,"forks_count":23,"subscribers_count":17,"default_branch":"main","last_synced_at":"2024-04-14T04:30:48.820Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/livekit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2022-03-06T12:01:38.000Z","updated_at":"2024-08-21T05:00:27.326Z","dependencies_parsed_at":"2023-12-09T02:30:14.482Z","dependency_job_id":"84a512b8-0062-4d7f-836a-8d7c4de4cdf7","html_url":"https://github.com/livekit/client-sdk-react-native","commit_stats":{"total_commits":91,"total_committers":2,"mean_commits":45.5,"dds":0.03296703296703296,"last_synced_commit":"49b7ecbe2a4c24279ee61417fcf5c8f2ef3b0e23"},"previous_names":[],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-react-native","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-react-native/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-react-native/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/livekit%2Fclient-sdk-react-native/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/livekit","download_url":"https://codeload.github.com/livekit/client-sdk-react-native/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247249027,"owners_count":20908202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-18T02:17:15.284Z","updated_at":"2025-04-07T13:08:02.763Z","avatar_url":"https://github.com/livekit.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003c!--BEGIN_BANNER_IMAGE--\u003e\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"/.github/banner_dark.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"/.github/banner_light.png\"\u003e\n  \u003cimg style=\"width:100%;\" alt=\"The LiveKit icon, the name of the repository and some sample code in the background.\" src=\"https://raw.githubusercontent.com/livekit/client-sdk-react-native/main/.github/banner_light.png\"\u003e\n\u003c/picture\u003e\n\n\u003c!--END_BANNER_IMAGE--\u003e\n\n# livekit-react-native\n\n\u003c!--BEGIN_DESCRIPTION--\u003e\nUse this SDK to add realtime video, audio and data features to your React Native app. By connecting to \u003ca href=\"https://livekit.io/\"\u003eLiveKit\u003c/a\u003e Cloud or a self-hosted server, you can quickly build applications such as multi-modal AI, live streaming, or video calls with just a few lines of code.\n\u003c!--END_DESCRIPTION--\u003e\n\n\u003e [!NOTE]\n\u003e This is v2 of the React-Native SDK. When migrating from v1.x to v2.x you might encounter a small set of breaking changes.\n\u003e Read the [migration guide](https://docs.livekit.io/recipes/migrate-from-v1/) for a detailed overview of what has changed.\n\n## Installation\n\n### NPM\n\n```sh\nnpm install @livekit/react-native @livekit/react-native-webrtc livekit-client\n```\n\n### Yarn\n\n```sh\nyarn add @livekit/react-native @livekit/react-native-webrtc livekit-client\n```\n\nThis library depends on `@livekit/react-native-webrtc`, which has additional installation instructions found here:\n\n- [iOS Installation Guide](https://github.com/livekit/react-native-webrtc/blob/master/Documentation/iOSInstallation.md)\n- [Android Installation Guide](https://github.com/livekit/react-native-webrtc/blob/master/Documentation/AndroidInstallation.md)\n\n---\n\nOnce the `@livekit/react-native-webrtc` dependency is installed, one last step is needed to finish the installation:\n\n### Android\n\nIn your [MainApplication.java](https://github.com/livekit/client-sdk-react-native/blob/main/example/android/app/src/main/java/com/example/livekitreactnative/MainApplication.java) file:\n\n#### Java\n```java\nimport com.livekit.reactnative.LiveKitReactNative;\nimport com.livekit.reactnative.audio.AudioType;\n\npublic class MainApplication extends Application implements ReactApplication {\n\n  @Override\n  public void onCreate() {\n    // Place this above any other RN related initialization\n    // When AudioType is omitted, it'll default to CommunicationAudioType.\n    // Use MediaAudioType if user is only consuming audio, and not publishing.\n    LiveKitReactNative.setup(this, new AudioType.CommunicationAudioType());\n\n    //...\n  }\n}\n```\n\nOr in your **MainApplication.kt** if you are using RN 0.73+\n#### Kotlin\n```kotlin\nimport com.livekit.reactnative.LiveKitReactNative\nimport com.livekit.reactnative.audio.AudioType\n\nclass MainApplication : Application, ReactApplication() {\n  override fun onCreate() {\n    // Place this above any other RN related initialization\n    // When AudioType is omitted, it'll default to CommunicationAudioType.\n    // Use MediaAudioType if user is only consuming audio, and not publishing.\n    LiveKitReactNative.setup(this, AudioType.CommunicationAudioType())\n\n    //...\n  }\n}\n```\n----\n\n### iOS\n\nIn your [AppDelegate.m](https://github.com/livekit/client-sdk-react-native/blob/main/example/ios/LivekitReactNativeExample/AppDelegate.mm) file:\n\n```objc\n#import \"LivekitReactNative.h\"\n#import \"WebRTCModuleOptions.h\"\n\n@implementation AppDelegate\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  // Place this above any other RN related initialization\n  [LivekitReactNative setup];\n\n  // Uncomment the following lines if you want to use the camera in the background\n  // Requires voip background mode and iOS 18+.\n\n  // WebRTCModuleOptions *options = [WebRTCModuleOptions sharedInstance];\n  // options.enableMultitaskingCameraAccess = YES;\n\n  //...\n}\n```\n\n### Expo\n\nLiveKit is available on Expo through development builds. You can find our Expo plugin and setup instructions [here](https://github.com/livekit/client-sdk-react-native-expo-plugin).\n\n## Example app\n\nYou can try our standalone example app [here](https://github.com/livekit-examples/react-native-meet/).\n\n## Usage\n\nIn your `index.js` file, setup the LiveKit SDK by calling `registerGlobals()`.\nThis sets up the required WebRTC libraries for use in Javascript, and is needed for LiveKit to work.\n\n```js\nimport { registerGlobals } from '@livekit/react-native';\n\n// ...\n\nregisterGlobals();\n```\n\nIn your app, wrap your component in a `LiveKitRoom` component, which manages a\nRoom object and allows you to use our hooks to create your own real-time video/audio app.\n\n```js\nimport * as React from 'react';\nimport {\n  StyleSheet,\n  View,\n  FlatList,\n  ListRenderItem,\n} from 'react-native';\nimport { useEffect } from 'react';\nimport {\n  AudioSession,\n  LiveKitRoom,\n  useTracks,\n  TrackReferenceOrPlaceholder,\n  VideoTrack,\n  isTrackReference,\n  registerGlobals,\n} from '@livekit/react-native';\nimport { Track } from 'livekit-client';\n\nconst wsURL = \"wss://example.com\"\nconst token = \"your-token-here\"\n\nexport default function App() {\n  // Start the audio session first.\n  useEffect(() =\u003e {\n    let start = async () =\u003e {\n      await AudioSession.startAudioSession();\n    };\n\n    start();\n    return () =\u003e {\n      AudioSession.stopAudioSession();\n    };\n  }, []);\n\n  return (\n    \u003cLiveKitRoom\n      serverUrl={wsURL}\n      token={token}\n      connect={true}\n      options={{\n        // Use screen pixel density to handle screens with differing densities.\n        adaptiveStream: { pixelDensity: 'screen' },\n      }}\n      audio={true}\n      video={true}\n    \u003e\n      \u003cRoomView /\u003e\n    \u003c/LiveKitRoom\u003e\n  );\n};\n\nconst RoomView = () =\u003e {\n  // Get all camera tracks.\n  // The useTracks hook grabs the tracks from LiveKitRoom component\n  // providing the context for the Room object.\n  const tracks = useTracks([Track.Source.Camera]);\n\n  const renderTrack: ListRenderItem\u003cTrackReferenceOrPlaceholder\u003e = ({item}) =\u003e {\n    // Render using the VideoTrack component.\n    if(isTrackReference(item)) {\n      return (\u003cVideoTrack trackRef={item} style={styles.participantView} /\u003e)\n    } else {\n      return (\u003cView style={styles.participantView} /\u003e)\n    }\n  };\n\n  return (\n    \u003cView style={styles.container}\u003e\n      \u003cFlatList\n        data={tracks}\n        renderItem={renderTrack}\n      /\u003e\n    \u003c/View\u003e\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    alignItems: 'stretch',\n    justifyContent: 'center',\n  },\n  participantView: {\n    height: 300,\n  },\n});\n```\n\n[API documentation is located here.](https://htmlpreview.github.io/?https://raw.githubusercontent.com/livekit/client-sdk-react-native/main/docs/modules.html)\n\nAdditional documentation for the LiveKit SDK can be found at https://docs.livekit.io/\n\n## Audio sessions\n\nAs seen in the above example, we've introduced a class `AudioSession` that helps\nto manage the audio session on native platforms. This class wraps either [AudioManager](https://developer.android.com/reference/android/media/AudioManager) on Android, or [AVAudioSession](https://developer.apple.com/documentation/avfaudio/avaudiosession) on iOS.\n\nYou can customize the configuration of the audio session with `configureAudio`.\n\n### Android\n#### Media playback\n\nBy default, the audio session is set up for bidirectional communication. In this mode, the audio framework exhibits the following behaviors:\n\n- The volume cannot be reduced to 0.\n- Echo cancellation is available and is enabled by default.\n- A microphone indicator can be displayed, depending on the platform.\n\nIf you're leveraging LiveKit primarily for media playback, you have the option to reconfigure the audio session to better suit media playback. Here's how:\n\n```js\nuseEffect(() =\u003e {\n  let connect = async () =\u003e {\n    // configure audio session prior to starting it.\n    await AudioSession.configureAudio({\n      android: {\n        // currently supports .media and .communication presets\n        audioTypeOptions: AndroidAudioTypePresets.media,\n      },\n    });\n    await AudioSession.startAudioSession();\n    await room.connect(url, token, {});\n  };\n  connect();\n  return () =\u003e {\n    room.disconnect();\n    AudioSession.stopAudioSession();\n  };\n}, [url, token, room]);\n```\n\n#### Customizing audio session\n\nInstead of using our presets, you can further customize the audio session to suit your specific needs.\n\n```js\nawait AudioSession.configureAudio({\n  android: {\n    preferredOutputList: ['earpiece'],\n    // See [AudioManager](https://developer.android.com/reference/android/media/AudioManager)\n    // for details on audio and focus modes.\n    audioTypeOptions: {\n      manageAudioFocus: true,\n      audioMode: 'normal',\n      audioFocusMode: 'gain',\n      audioStreamType: 'music',\n      audioAttributesUsageType: 'media',\n      audioAttributesContentType: 'unknown',\n    },\n  },\n});\nawait AudioSession.startAudioSession();\n```\n\n### iOS\n\nFor iOS, the most appropriate audio configuration may change over time when local/remote\naudio tracks publish and unpublish from the room. To adapt to this, the [`useIOSAudioManagement`](https://htmlpreview.github.io/?https://raw.githubusercontent.com/livekit/client-sdk-react-native/main/docs/functions/useIOSAudioManagement.html)\nhook is advised over just configuring the audio session once for the entire audio session.\n\n## Screenshare\n\nEnabling screenshare requires extra installation steps:\n\n### Android\n\nAndroid screenshare requires a foreground service with type `mediaProjection` to be present.\n\nFrom version 2.4.0 onwards, the foreground service is handled internally,\nbut you must declare the permission yourself in your app's AndroidManifest.xml file.\n\n```\n\u003cuses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION\" /\u003e\n```\n\n### iOS\n\niOS screenshare requires adding a Broadcast Extension to your iOS project. Follow the integration instructions here:\n\nhttps://jitsi.github.io/handbook/docs/dev-guide/dev-guide-ios-sdk/#screen-sharing-integration\n\nIt involves copying the files found in this [sample project](https://github.com/jitsi/jitsi-meet-sdk-samples/tree/18c35f7625b38233579ff34f761f4c126ba7e03a/ios/swift-screensharing/JitsiSDKScreenSharingTest/Broadcast%20Extension)\nto your iOS project, and registering a Broadcast Extension in Xcode.\n\nIt's also recommended to use [CallKeep](https://github.com/react-native-webrtc/react-native-callkeep),\nto register a call with CallKit (as well as turning on the `voip` background mode).\nDue to background app processing limitations, screen recording may be interrupted if the app is restricted\nin the background. Registering with CallKit allows the app to continue processing for the duration of the call.\n\nOnce setup, iOS screenshare can be initiated like so:\n\n```js\nconst screenCaptureRef = React.useRef(null);\nconst screenCapturePickerView = Platform.OS === 'ios' \u0026\u0026 (\n  \u003cScreenCapturePickerView ref={screenCaptureRef} /\u003e\n);\nconst startBroadcast = async () =\u003e {\n  if (Platform.OS === 'ios') {\n    const reactTag = findNodeHandle(screenCaptureRef.current);\n    await NativeModules.ScreenCapturePickerViewManager.show(reactTag);\n    room.localParticipant.setScreenShareEnabled(true);\n  } else {\n    room.localParticipant.setScreenShareEnabled(true);\n  }\n};\n\nreturn (\n  \u003cView style={styles.container}\u003e\n    /*...*/ // Make sure the ScreenCapturePickerView exists in the view tree.\n    {screenCapturePickerView}\n  \u003c/View\u003e\n);\n```\n\n### Note\n\nYou will not be able to publish camera or microphone tracks on iOS Simulator.\n\n## Background Processing\n\n### Android\n\nTo support staying connected to LiveKit in the background, you will need a foreground service on Android.\n\nThe example app uses [@supersami/rn-foreground-service](https://github.com/Raja0sama/rn-foreground-service) for this.\n\nAdd the following permissions to your `AndroidManifest.xml` file:\n\n```xml\n\u003cuses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.FOREGROUND_SERVICE_CAMERA\" /\u003e\n\u003cuses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MICROPHONE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\" /\u003e\n```\n\nDeclare the the service and ensure it's labelled a `mediaProjection` service like so:\n\n```xml\n\u003cservice android:name=\"com.supersami.foregroundservice.ForegroundService\" android:foregroundServiceType=\"camera|microphone|mediaPlayback\" /\u003e\n\u003cservice android:name=\"com.supersami.foregroundservice.ForegroundServiceTask\" /\u003e\n```\n\nThe camera and microphone permissions/foreground service types can be omitted if you are not using those.\n\nOnce setup, [start the foreground service](https://github.com/livekit/client-sdk-react-native/blob/main/example/src/callservice/CallService.android.ts) to keep the app alive in the background.\n\n### iOS\n\nBy default, simple background processing can be enabled by selecting the `audio` and `voip`\n[UIBackgroundModes](https://developer.apple.com/documentation/bundleresources/information_property_list/uibackgroundmodes)\nin your XCode project. In your project, select your app target -\u003e Signing \u0026 Capabilities -\u003e Add Capability -\u003e Background Modes.\n\nThese background modes will keep the app alive in the background as long as a mic or audio track is playing.\n\nFor a more robust background that isn't sensitive to the above conditions, we suggest using\n[CallKit](https://developer.apple.com/documentation/callkit/) to maintain the\nconnection while in the background. The example uses\n[react-native-callkeep](https://github.com/react-native-webrtc/react-native-callkeep)\nfor simple integration with CallKit.\n\nOur example code can be found [here](https://github.com/livekit/client-sdk-react-native/blob/main/example/src/callservice/CallService.ios.ts).\n\nFor apps planning to use CallKit to handle incoming calls in the background, [it is important to call\n`RTCAudioSession.audioSessionDidActivate/Deactivate` when the call provider activates/deactivates\nthe audio session.](https://github.com/livekit/react-native-webrtc/blob/master/Documentation/iOSInstallation.md#callkit)\n\n## Troubleshooting\n\n#### Cannot read properties of undefined (reading 'split')\n\nThis error could happen if you are using yarn and have incompatible versions of dependencies with livekit-client.\n\nTo fix this, you can either:\n\n- use another package manager, like npm\n- use [yarn-deduplicate](https://www.npmjs.com/package/yarn-deduplicate) to deduplicate dependencies\n\n## Contributing\n\nSee the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow.\n\n## License\n\nApache License 2.0\n\n\u003c!--BEGIN_REPO_NAV--\u003e\n\u003cbr/\u003e\u003ctable\u003e\n\u003cthead\u003e\u003ctr\u003e\u003cth colspan=\"2\"\u003eLiveKit Ecosystem\u003c/th\u003e\u003c/tr\u003e\u003c/thead\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\u003ctd\u003eLiveKit SDKs\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/client-sdk-js\"\u003eBrowser\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-swift\"\u003eiOS/macOS/visionOS\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-android\"\u003eAndroid\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-flutter\"\u003eFlutter\u003c/a\u003e · \u003cb\u003eReact Native\u003c/b\u003e · \u003ca href=\"https://github.com/livekit/rust-sdks\"\u003eRust\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/node-sdks\"\u003eNode.js\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/python-sdks\"\u003ePython\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-unity\"\u003eUnity\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/client-sdk-unity-web\"\u003eUnity (WebGL)\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eServer APIs\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/node-sdks\"\u003eNode.js\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/server-sdk-go\"\u003eGolang\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/server-sdk-ruby\"\u003eRuby\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/server-sdk-kotlin\"\u003eJava/Kotlin\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/python-sdks\"\u003ePython\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/rust-sdks\"\u003eRust\u003c/a\u003e · \u003ca href=\"https://github.com/agence104/livekit-server-sdk-php\"\u003ePHP (community)\u003c/a\u003e · \u003ca href=\"https://github.com/pabloFuente/livekit-server-sdk-dotnet\"\u003e.NET (community)\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eUI Components\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/components-js\"\u003eReact\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/components-android\"\u003eAndroid Compose\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/components-swift\"\u003eSwiftUI\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eAgents Frameworks\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/agents\"\u003ePython\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/agents-js\"\u003eNode.js\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/agent-playground\"\u003ePlayground\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eServices\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://github.com/livekit/livekit\"\u003eLiveKit server\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/egress\"\u003eEgress\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/ingress\"\u003eIngress\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/sip\"\u003eSIP\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003eResources\u003c/td\u003e\u003ctd\u003e\u003ca href=\"https://docs.livekit.io\"\u003eDocs\u003c/a\u003e · \u003ca href=\"https://github.com/livekit-examples\"\u003eExample apps\u003c/a\u003e · \u003ca href=\"https://livekit.io/cloud\"\u003eCloud\u003c/a\u003e · \u003ca href=\"https://docs.livekit.io/home/self-hosting/deployment\"\u003eSelf-hosting\u003c/a\u003e · \u003ca href=\"https://github.com/livekit/livekit-cli\"\u003eCLI\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003c!--END_REPO_NAV--\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flivekit%2Fclient-sdk-react-native","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flivekit%2Fclient-sdk-react-native","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flivekit%2Fclient-sdk-react-native/lists"}