# Remote Config

As explained in the [core concepts](../../core-concepts#remote-configs) section, remote configurations are a development technique where an application's feature behaviour can be changed remotely without publishing an application update.

![](https://1873622848-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MK4yy7MeiUC0w8GtqSH%2F-MMLjK5XkMBrdepRCMyW%2F-MMLoWp24yUkC1wkTIZB%2FRemote%20Config%203-1.jpeg?alt=media\&token=5c72b135-96e7-4005-a769-7c04718440bb)

Let's see how to create a remote config in Koople!

A remote config needs a name and key. Like in the release toggles, the key is gonna autocomplete from the name. The key must be unique in the project, is the way Koople identify your remote config. If the key already exists, the platform will throw an error message when trying to create it, and the key must be changed to complete the process.

![](https://1873622848-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MK4yy7MeiUC0w8GtqSH%2F-MS3oFleT_etcPhYHWw8%2F-MS3pvYN9a4oQM53OaMq%2FScreenshot%202021-01-27%20at%2018.15.05.png?alt=media\&token=a54a27c4-e7b1-49c8-9c8c-bba54a82fe95)

{% hint style="warning" %}
Pay particular attention to the "Server Only" checkbox. The remote configurations (and release toggles) marked as Server Only will be evaluated only by the server SDKs, never by the client SDKs. The main reason is that, for example, you may want to provide confidential information (for example, some configuration keys). For this reason, we will prevent it from appearing outside of trusted environments such as a web browser.
{% endhint %}

Now you can add the remote config value.

![](https://1873622848-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MK4yy7MeiUC0w8GtqSH%2F-MS3oFleT_etcPhYHWw8%2F-MS3wC_bQj4tB0f07IyP%2FScreenshot%202021-01-27%20at%2018.42.17.png?alt=media\&token=a63d5218-a5c9-471f-aad7-0b156b66eefc)

This is the most basic use of a remote config. Now, your application can get this value from remote. Changing the default value in the Koople platform to change the behaviour of your application without redeploying it.

It is possible to add variations to the remote config to return different values depending on some rules. The user that match the rules will get the variation value. The users that don't match with the rules will get the default value. You can add multiple variations in a remote config.

![](https://1873622848-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MK4yy7MeiUC0w8GtqSH%2F-MMWy1FJZGrDEQ57Sk8S%2F-MMWyBQjja4j8mFOe7m3%2FScreenshot%202020-11-19%20at%2020.26.08.png?alt=media\&token=f2132185-80a8-441b-a0cb-2f81e8798b28)

The complete list of operators:&#x20;

* is one of
* is not one of
* exists
* doesn't exist
* contains
* does not contain
* <
* <=
* \>
* \>=
* is truthy
* is falsy
* user in target group
* user not in target group

{% hint style="info" %}
Learn more about how to reuse rules using [target groups](target-groups).
{% endhint %}

It is possible to combine different rule with and/or operators.

Let's see how this works with the SDK

{% tabs %}
{% tab title="Javascript" %}
```javascript
import {PFClient} from "@pataflags/sdk-js";

const user = { id: 'koople@koople.io', country: 'gondor', age: 31 }
const pfclient = PFClient.initialize('YOUR_API_KEY', user);

pfclient.onReady(() => {
    const remoteConfig = pfclient.valueOf('theme');
}
```
{% endtab %}

{% tab title="C#" %}
```csharp
var pfclient = PfClient.Initialize('YOUR_API_KEY');

var attributes = new[] { 
    new PfUserAttribute("country", 'gondor'), 
    new PfUserAttribute("age", 31)
};

var user = PfUser.Create('koople@koople.io', attributes);
var remoteConfig = pfclient.ValueOf('theme', user);

```
{% endtab %}

{% tab title="Java" %}
```java
PFClient pfclient = PFClient.initialize('YOUR_API_KEY');

PFUser user = PFUser.create('koople@koople.io');
                    .with("country", "gondor")
                    .with("age", 31);

String remoteConfig = pfclient.valueOf('theme', user);
```
{% endtab %}
{% endtabs %}

