> For the complete documentation index, see [llms.txt](https://developer.harness.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://developer.harness.io/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks.md).

# Client-side Standard SDKs

Harness FME provides client-side SDKs that let you evaluate feature flags, run experiments, and deliver personalized experiences directly in your application's frontend.

These SDKs are optimized for real-time updates and minimal latency, ensuring that your users always experience the most up-to-date feature set.

Standard SDKs evaluate feature flags locally on the device. They pull rollout rules and segment-membership data from FME cloud, cache them, and run `getTreatment` in-process. **Standard SDKs are the recommended path for most applications**: user attributes stay on the device, and once the SDK is ready it can evaluate any flag for any target.

If you have not chosen between local and remote evaluation yet, see [Choosing an evaluation mode](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/evaluation-modes.md).

### Certificate pinning <a href="#certificate-pinning" id="certificate-pinning"></a>

If your application uses certificate pinning with Harness FME SDKs, you may need to [update your configuration](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/examples/certificate-pinning-migration.md) to support streaming infrastructure migrations and future SDK capabilities.

For platform-specific configuration instructions, see [Certificate Pinning for Android](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/android-sdk.md#certificate-pinning) and [Certificate Pinning for iOS](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/ios-sdk.md#certificate-pinning).

### Does the SDK cache expire? <a href="#does-the-sdk-cache-expire" id="does-the-sdk-cache-expire"></a>

The Split mobile (iOS and Android) and JavaScript Browser SDKs download a local cache of flag data and store it in the device or browser file system. This cache has a default expiration period of 10 days in most SDKs, after which the SDK refreshes the cache from scratch.

The default and configuration options differ slightly by SDK:

* JavaScript SDK (v11.2.0 and later): Default expiration of 10 days, configurable via the `LOCALSTORAGE` setting.
* Browser SDK (v1.2.0 and later): Default expiration of 10 days, configurable via the `InLocalStorage` setting. See [Configure cache behavior for the SDK](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/browser-sdk.md#configure-cache-behavior).
* Android SDK (v5.3.0 and later): Default expiration of 10 days, configurable via the `rolloutCacheConfiguration` setting.
* iOS SDK (v3.3.0 and later): Default expiration of 10 days, configurable via the `rolloutCacheConfiguration` setting.

All SDKs continue to store impressions and events for up to 90 days. After that period, the cache is considered stale and may be purged.

### How to initialize for multiple user IDs? <a href="#how-to-initialize-for-multiple-user-ids" id="how-to-initialize-for-multiple-user-ids"></a>

The JavaScript SDK supports initializing [multiple client objects](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/javascript-sdk.md#instantiate-multiple-sdk-clients) from the same SDK factory, each with a unique user key (or user ID):

```javascript
client1 = factory.client("user_id1");
client2 = factory.client("user_id2");
```

For mobile SDKs, see the [iOS](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/ios-sdk.md#instantiate-multiple-sdk-clients) and [Android SDK documentation](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/android-sdk.md#instantiate-multiple-sdk-clients).

{% hint style="info" %}
**FEATURE FLAG UPDATE TIMING**

When you make changes to a feature flag in the Harness UI, mobile (iOS, Android) and JavaScript Browser SDKs may not reflect the update immediately for all users.

Updates roll out gradually (some devices sync within the first day, with more devices updating in the following days) unless your code waits for the `SDK_READY` event. If your app only uses cached data from the previous session (triggered by `SDK_READY_FROM_CACHE`), users may continue to see the old values until their cache syncs.

To ensure the latest changes are reflected, calculate treatments after the `SDK_READY` event fires, and update them if the value changes after initial load.
{% endhint %}

### Get started <a href="#get-started" id="get-started"></a>

Select a platform to start integrating FME into your client application.

<table data-view="cards"><thead><tr><th align="center"></th><th align="center"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td align="center"><img src="/files/oWRKBcvYbKBZJMMRBmwI" alt="" data-size="original"></td><td align="center"><strong>Android SDK</strong></td><td><a href="/pages/8AF59NZ2aqPq17XR8ugB">/pages/8AF59NZ2aqPq17XR8ugB</a></td></tr><tr><td align="center"><img src="/files/soPWT6wbCTl0b9bEFgDV" alt="" data-size="original"></td><td align="center"><strong>Angular Utilities</strong></td><td><a href="/pages/LJUbiHqsA3WW7eSs02EX">/pages/LJUbiHqsA3WW7eSs02EX</a></td></tr><tr><td align="center"><img src="/files/CqaWt0Uy93H5vJ0nFmtJ" alt="" data-size="original"></td><td align="center"><strong>Browser SDK</strong></td><td></td></tr><tr><td align="center"><img src="/files/D01mpEtmTHjfjToJj0KA" alt="" data-size="original"></td><td align="center"><strong>Flutter Plugin</strong></td><td><a href="/pages/snGwWXajHlfJW7GDuFNF">/pages/snGwWXajHlfJW7GDuFNF</a></td></tr><tr><td align="center"><img src="/files/pL4DiVOsgdh4w7jQ2Txe" alt="" data-size="original"></td><td align="center"><strong>iOS SDK</strong></td><td><a href="/pages/7GUS0j7lBbffwUUTAgvq">/pages/7GUS0j7lBbffwUUTAgvq</a></td></tr><tr><td align="center"><img src="/files/pQNKS701qi00prXBdB5T" alt="" data-size="original"></td><td align="center"><strong>JavaScript SDK</strong></td><td><a href="/pages/2W8f1cXqxHpZb3xLL5je">/pages/2W8f1cXqxHpZb3xLL5je</a></td></tr><tr><td align="center"><img src="/files/PliXZnKOzH0SvzaaLkPP" alt="" data-size="original"></td><td align="center"><strong>React SDK</strong></td><td><a href="/pages/avzO8zntoEWOK5ZVqkA3">/pages/avzO8zntoEWOK5ZVqkA3</a></td></tr><tr><td align="center"><img src="/files/PliXZnKOzH0SvzaaLkPP" alt="" data-size="original"></td><td align="center"><strong>React Native SDK</strong></td><td><a href="/pages/foy1cK0LEZ2lp8QguIuf">/pages/foy1cK0LEZ2lp8QguIuf</a></td></tr><tr><td align="center"><img src="/files/AhgbPtOGsnmICleCirfp" alt="" data-size="original"></td><td align="center"><strong>Redux SDK</strong></td><td><a href="/pages/zbpMQAvyCnZBKNbFmCc3">/pages/zbpMQAvyCnZBKNbFmCc3</a></td></tr></tbody></table>
