> 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/get-started/install-the-sdk.md).

# Install the FME SDK

Learn how to install the Harness FME SDKs.

Our SDKs are designed to run at the application layer of your application and provide a secure, out-of-the-box way to control your experiments and feature flags.

Each SDK has two main functions:

* [Serve as a decision engine for your application](#decision-engine)
* [Automatically capture what variants of your features your customers are served](#capturing-what-your-customer-was-served)

### Harness FME SDKs <a href="#harness-fme-sdks" id="harness-fme-sdks"></a>

Harness FME SDKs are for specific languages or use cases. To choose the best SDK for your scenario, see the respective SDK documentation.

#### Client-side SDKs

<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="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-c3714f212487f9a07adde714bed0ef07b4a46e4f%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Android SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/android-sdk.md">Android SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-df7072c1729a3164f21750a75c8725ef275f81bb%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Angular Utilities</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/angular-utilities.md">Angular utilities</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-34d3e35cd3d7f5a12d822394d47596332a36355a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Browser SDK</strong></td><td></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-52ee20d3fdb13ea24a64c3072e0d223fa821df70%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Flutter Plugin</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/flutter-plugin.md">Flutter plugin</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-8bd7dfb480bf6ed4f0129f3278a7d7266d323a9a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>iOS SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/ios-sdk.md">iOS SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-ed0c02f95bc2d533c7ae6750a769f486018c0ddf%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>JavaScript SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/javascript-sdk.md">JavaScript SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-67b161905f0cd2eeec21cdd6712ca22601dd5e67%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>React SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/react-sdk.md">React SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-67b161905f0cd2eeec21cdd6712ca22601dd5e67%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>React Native SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/react-native-sdk.md">React Native SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-531a5d53cad59eb3aade4e6548357fa1cd66baa2%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Redux SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdks/client-side-standard-sdks/redux-sdk.md">Redux SDK</a></td></tr></tbody></table>

#### Client-side SDK Suites

<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="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-c3714f212487f9a07adde714bed0ef07b4a46e4f%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Android Suite</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdk-suites/android-suite.md">Android Suite</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-34d3e35cd3d7f5a12d822394d47596332a36355a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Browser Suite</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdk-suites/browser-suite.md">Browser Suite</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-8bd7dfb480bf6ed4f0129f3278a7d7266d323a9a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>iOS Suite</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-sdk-suites/ios-suite.md">iOS Suite</a></td></tr></tbody></table>

#### Client-side RUM Agents

<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="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-c3714f212487f9a07adde714bed0ef07b4a46e4f%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Android Agents</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-agents/android-rum-agent.md">Android RUM Agent</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-34d3e35cd3d7f5a12d822394d47596332a36355a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Browser Agents</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-agents/browser-rum-agent.md">Browser RUM Agent</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-8bd7dfb480bf6ed4f0129f3278a7d7266d323a9a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>iOS Agents</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/client-side-agents/ios-rum-agent.md">iOS RUM Agent</a></td></tr></tbody></table>

#### Server-side SDKs

<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="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-5d6b254e7b3e2a65c4151a8a749f75af4ab433f4%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Elixir Thin Client SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/elixir-thin-client-sdk.md">Elixir Thin Client SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-fdf1a084104403268edde7112359ef90eaac7fe7%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Go SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/go-sdk.md">Go SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-123bb1fe4b2fa49d54852fa2afdef9b2c450519a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Java SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/java-sdk.md">Java SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-a73f55478934ce00f07a3971f97888fed1ea601a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>.NET SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/net-sdk.md">.NET SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-c61605d4c97c58c9358111f3c8b787f2796a4bc7%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>NodeJS SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/nodejs-sdk.md">Node.js SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-8f2e1bf7a5b8ebd317b04344f7311738845150b6%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>PHP SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/php-sdk.md">PHP SDK</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-8f2e1bf7a5b8ebd317b04344f7311738845150b6%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>PHP Thin Client SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/php-thin-client-sdk.md">PHP Thin Client SDK</a></td></tr><tr><td align="center"><img src="https://developer.harness.io/provider-logos/python-logo.svg" alt="Python SDK"></td><td align="center"><strong>Python SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/python-sdk.md">Python SDK</a></td></tr><tr><td align="center"><img src="https://developer.harness.io/provider-logos/ruby-logo.svg" alt="Ruby SDK"></td><td align="center"><strong>Ruby SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/ruby-sdk.md">Ruby SDK</a></td></tr></tbody></table>

#### Optional Infrastructure

<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="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-5bf3e8df9a68c29b807051ae5f3d947bd7dee6b6%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Split Daemon (splitd)</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/customer-deployed-components/split-daemon-splitd.md">Split Daemon (splitd)</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-5bf3e8df9a68c29b807051ae5f3d947bd7dee6b6%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Split Evaluator</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/customer-deployed-components/split-evaluator.md">Split Evaluator</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-5bf3e8df9a68c29b807051ae5f3d947bd7dee6b6%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Split Proxy</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/customer-deployed-components/split-proxy.md">Split Proxy</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-5bf3e8df9a68c29b807051ae5f3d947bd7dee6b6%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Split Synchronizer</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/customer-deployed-components/split-synchronizer.md">Split Synchronizer</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-ed0c02f95bc2d533c7ae6750a769f486018c0ddf%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Split JavaScript Synchronizer Tools</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/customer-deployed-components/split-javascript-synchronizer-tools.md">Split JavaScript synchronizer tools</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-c9d6514f8c09bde8cf1fe0a726d68e8c17488cae%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Harness Proxy</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/customer-deployed-components/harness-proxy.md">Harness Proxy</a></td></tr></tbody></table>

#### OpenFeature Providers

<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="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-c3714f212487f9a07adde714bed0ef07b4a46e4f%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Android SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/android-sdk.md">Android OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-8bd7dfb480bf6ed4f0129f3278a7d7266d323a9a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>iOS SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/ios-sdk.md">iOS OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-34d3e35cd3d7f5a12d822394d47596332a36355a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Web SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/web-sdk.md">Web OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-df7072c1729a3164f21750a75c8725ef275f81bb%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Angular</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/angular-sdk.md">Angular OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-67b161905f0cd2eeec21cdd6712ca22601dd5e67%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>React</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/react-sdk.md">React OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-123bb1fe4b2fa49d54852fa2afdef9b2c450519a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Java SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/java-sdk.md">Java OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-c61605d4c97c58c9358111f3c8b787f2796a4bc7%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Node.js</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/nodejs-sdk.md">Node.js OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://developer.harness.io/provider-logos/python-logo.svg" alt="Python SDK"></td><td align="center"><strong>Python SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/python-sdk.md">Python OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-a73f55478934ce00f07a3971f97888fed1ea601a%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>.NET SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/net-sdk.md">.NET OpenFeature Provider</a></td></tr><tr><td align="center"><img src="https://1473625385-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FrT2RGHAjtBTaObzchfpb%2Fuploads%2Fgit-blob-fdf1a084104403268edde7112359ef90eaac7fe7%2Fimage.png?alt=media" alt="" data-size="original"></td><td align="center"><strong>Go SDK</strong></td><td><a href="/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/openfeature-providers/go-sdk.md">Go OpenFeature Provider</a></td></tr></tbody></table>

### Decision engine <a href="#decision-engine" id="decision-engine"></a>

When you set up rules for your feature flags and experiments to be targeted to subsets of your customer base in Harness FME (e.g., run a 50/50 test of a new home page on customers in New York), our SDKs automatically download down these rules and maintain a local copy of them on your machines. From there, our SDKs then take care of keeping themselves up to date by periodically checking for any changes to the rules that are made in the Harness FME user interface.

When your application then loads for your customers, you can simply ask the SDK via a method called `getTreatment` to decide what variant of a feature the customer should see.

Since the SDK is maintaining a local copy of the rules that govern your features and experiments, it can simply reference that copy of your rules and make the decision to serve "on" or "off" to your customer without having to make a single remote call. From there, you can take the decision returned by our SDK and use that information to serve up the proper experience to your customer.

The `getTreatment` function requires a customer ID, which is usually a hash representation of the current session's customer. The SDK uses the customer ID when the feature flag includes percentage-based targeting rules (for example: 50% `"On"` and 50% `"Off"`). In this case, this is not relevant since we are assigning 100% of a single treatment. However, the SDK still requires the customer ID to calculate the treatment.

If the implementation will not use percentage-based treatments, then apply a dummy customer ID with any string value.

In this manner, our SDK is able to abstract out any need to hardcode this type of decision making in your application.

### Capturing what your customer was served <a href="#capturing-what-your-customer-was-served" id="capturing-what-your-customer-was-served"></a>

Each time our SDK makes a decision of what your customer should be served, it automatically takes that information and queues it up on your machines. The SDK then takes care of all the work in passing this information up to Harness FME in the background without ever slowing down your application.

By capturing this information, you can easily understand what customers are being served and set the basis for being able to properly measure your experiments.

### Handling impressions and events load <a href="#handling-impressions-and-events-load" id="handling-impressions-and-events-load"></a>

{% hint style="danger" %}
**WHAT HAPPENS IF THE SDK CANNOT KEEP UP WITH THE INCOMING IMPRESSIONS AND EVENTS LOAD?**

The SDK will post the queue content when it becomes full. However, if the load consistently exceeds capacity, the queue will repeatedly fill and be posted, clearing it. Meanwhile, new impressions or events generated during this period are not stored because the queue is full, resulting in data loss.

Harness recommends verifying these SDK configuration parameters against your production generation rates for impressions and events, ensuring the SDK is properly configured to handle the load.
{% endhint %}

By default, all FME SDKs have configuration parameters that allow them to process a heavy load of generated Impressions and Events. These default parameter values are documented in the respective SDK documentation.

In the [Java SDK](/feature-management-experimentation/new-to-fme/sdks-and-customer-deployed-components/server-side-sdks/java-sdk.md#configuration), for example, the Configuration section includes parameters and default values for posting impressions:

* `impressionsRefreshRate = 60` (seconds)
* `impressionsQueueSize = 30k`

These settings mean the SDK can handle up to 30,000 impressions (each generated by a single `getTreatment` call) every 60 seconds.

If your application generates more than 30,000 impressions per minute, you will need to adjust these parameters. For instance, generating 60,000 impressions per minute could be handled by setting:

* `impressionsRefreshRate = 20` or `impressionsQueueSize = 70k`

Harness recommends providing some buffer so the SDK can handle the actual load. If the queue size is reached, the SDK will attempt to post its contents regardless of the impression post thread’s scheduled run time.

The same concept applies to events created using the SDK’s `track()` method.

The relevant Java SDK parameters for posting events are:

* `eventFlushIntervalInMillis = 30000` (30 seconds)
* `eventsQueueSize = 500`

These values allow the Java SDK to handle up to 1,000 events per minute.

{% @harness-feedback/feedback %}
