Feature Flag & Remote Config Service

Release features with confidence; manage feature flags across web, mobile, and server side applications. Use our hosted API, deploy to your own private cloud, or run on-premises

Start For Free
flagsmith-import.js
1import flagsmith from 'flagsmith';
2
3flagsmith.init({
4  environmentID: 'QjgYur4LQTwe5HpvbvhpzK',
5});
6
7const App = () => (
8    <Layout 
9      darkMode={flagsmith.hasFeature("dark_mode")}
10      designV2={flagsmith.hasFeature("design_v2")}
11    >
12      {flagsmith.hasFeature("chat") && <ChatWidget>}
13    </Layout> 
14)
15 
Features
Chat
Design 2.0
Dark mode

Trusted by top development teams

citi logo
Financial Times logo
Starbucks logo
Cognizant logo
Capita logo
Nike logo
Aer Lingus logo
{customername}

Nick Quaranto, RubyGems creator
Wistia

Feature rollouts before Flagsmith: Chaotic, messy, sometimes dangerous! After Flagsmith: A lot less stressful, more calm, and orderly. Can't recommend it enough for the product scope and responsive team behind the scenes!

{customername}

Romano Roth
Zuehlke

Flagsmith enables us to continuously deploy to production and release on demand.

{customername}

Jared Baribea
Smartex

Transitioning from our in-house tool to Flagsmith added capabilities that almost immediately helped us level up our software & product development

Feature flags

Flagsmith provides an all-in-one platform for developing, implementing, and managing your feature flags. Whether you are moving off an in-house solution or using toggles for the first time, you will be amazed by the power and efficiency gained by using Flagsmith.

Learn More

Manage Flags across multiple platforms

Flagsmith makes it easy to create and manage feature toggles across web, mobile, and server-side applications. Just wrap a section of code with a flag, and then use Flagsmith to manage that feature.

Powerful Segmenting rules

Manage feature flags by development environment, and for individual users, a segment of users, or a percentage. This means quickly implementing practices like canary deployments.

Drive A/B and Multivariate Tests

Multivariate flags allow you to use a percentage split across two or more variations for precise A/B/n testing and experimentation.

You can configure features for individual Segments, Users, and development Environments.

Remote config

Flagsmith combines the value of feature toggles with the flexibility of remote config, making it easier than ever to test and deploy new features. That’s because all flags in Flagsmith are capable of being configured for remote config. What does that mean for you? As well as toggling a flag, with remote config you can customize values for your features, allowing you to deploy functional and visual changes to your users without changing any code or pushing out any updates.

Learn More

Remote application management

Remote config lets you alter an application in real-time, without having to wait for a deployment or app store approval.

Test changes without deployments

Configure different elements of your features–like checkout payment options of the color of a button–directly through Flagsmith and release the changes to users in just a few clicks.

Drive powerful A/B tests

Develop user segments based on traits or behaviors, then alter the application experience for subsections of your user base quickly and easily.

Release with Confidence

User traits

Flagsmith makes it easy to store traits associated with your users without modifying your back-end or worrying about transferring data. Do you know who your early adopters are? What about your most active users? Understanding your user base lets you roll out updates strategically.

User segments

Want your power users to be the first to test new features? Create detailed user segments based on stored traits, then roll out features based on those segments. As a feature is released, segments can be added or removed without requiring an update or any code changes. Test in production by making internal users or specific teams a segment and only exposing it to these internal segments. Nothing gives a release more confidence than having already been tested in production.

Staged feature rollouts

If you’re not sure how a new feature will perform, why roll it out to your entire user base right away? Our platform lets you deploy features to a percentage of your user base. It’s easy to roll out to more users, and eventually to everyone if features perform well; or roll back updates that don’t perform as expected. Flagsmith integrates with popular customer data platforms and analytics products, so you can utilize the tools you already use to analyze the results of tests and fine-tune your application.

Track changes

The only thing worse than rolling out a feature with bugs is not being able to revert back. Tracking changes to your application lets you pinpoint what edits were made when the error arose so you can undo the offending update. Flagsmith logs all changes for auditing and to make rolling back any features painless. Since the feature was launched with a feature flag, that rollback will be as simple as switching a toggle.

Available in many languages

We currently support these popular languages and frameworks

Learn More
  • Rest
  • React / React Native
  • NextJS
  • Node
  • Android / Kotlin
  • IOS
  • Flutter
  • Python
  • Ruby
  • .NET
  • PHP
  • Go
  • Rust
1$ curl 'https://api.flagsmith.com/api/v1/flags/' 
2-H 'X-Environment-Key: TijpMX6ajA7REC4bf5suYg' | jq
3
4[
5  {
6    "id": 131,
7    "feature": {
8      "id": 56,
9      "name": "kyc_button",
10      "created_date": "2018-06-28T13:30:09.983174Z",
11      "description": null,
12      "initial_value": null,
13      "default_enabled": true,
14      "type": "FLAG"
15    },
16    "feature_state_value": null,
17    "enabled": true,
18    "environment": 12,
19    "identity": null,
20    "feature_segment": null
21  }
22]
1import flagsmith from 'flagsmith';
2// import flagsmith from 'react-native-flagsmith'; - Use this instead for React Native
3
4import { useFlags, FlagsmithProvider } from 'flagsmith/react';
5
6const App = () => (
7    <FlagsmithProvider options={{ environmentID: "QjgYur4LQTwe5HpvbvhpzK"}} flagsmith={flagsmith}>
8        <HomePage/>
9    </FlagsmithProvider>
10)
11
12const HomePage = () => {
13 const flags = useFlags(['chat_widget']); 
14  return (
15      <>{flags.chat_widget.enabled && <ChatWidget>}</>
16  );
17}
1import flagsmith from 'flagsmith/isomorphic';
2import { useFlags, FlagsmithProvider } from 'flagsmith/react';
3
4const App = ({ Component, pageProps, flagsmithState }) => (
5    <FlagsmithProvider serverState={flagsmithState} flagsmith={flagsmith}>
6        <Component {...pageProps} />
7    </FlagsmithProvider>
8)
9
10App.getInitialProps = async () => {
11  await flagsmith.init({ environmentID: "QjgYur4LQTwe5HpvbvhpzK"});
12  return { flagsmithState: flagsmith.getState() }
13}
14
15const HomePage = () => {
16 const flags = useFlags(['chat_widget']); 
17 return <>{flags.chat_widget.enabled && <ChatWidget>}</>
18}
1const Flagsmith = require('flagsmith-nodejs');
2
3const flagsmith = new Flagsmith({
4 environmentKey: 'TijpMX6ajA7REC4bf5suYg',
5});
6const identifier = 'delboy@trotterstraders.co.uk';
7const traitList = { car_type: 'robin_reliant' };
8
9const flags = await flagsmith.getIdentityFlags(identifier, traitList);
10var showButton = flags.isFeatureEnabled('secret_button');
11var buttonData = flags.getFeatureValue('secret_button');
1implementation 'com.github.Flagsmith:flagsmith-kotlin-android-client:1.0.1'
2
3lateinit var flagsmith : Flagsmith
4
5override fun onCreate(savedInstanceState: Bundle?) {
6    initFlagsmith();
7}
8
9private fun initFlagsmith() {
10    flagsmith = Flagsmith(environmentKey = FlagsmithConfigHelper.environmentDevelopmentKey, context = context)
11}
12
13flagsmith.getFeatureFlags { result ->
14    result.fold(
15        onSuccess = { flagList ->
16            Log.i("Flagsmith", "Current flags:")
17            flagList.forEach { Log.i("Flagsmith", "- ${it.feature.name} - enabled: ${it.enabled} value: ${it.featureStateValue ?: "not set"}") }
18        },
19        onFailure = { err ->
20            Log.e("Flagsmith", "Error getting feature flags", err)
21        })
22}
23
1pod 'FlagsmithClient', '~> 1.0'
2
3import FlagsmithClient
4
5func application(_ application: UIApplication, 
6  didFinishLaunchingWithOptions launchOptions: 
7  [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
8Flagsmith.shared.apiKey = "QjgYur4LQTwe5HpvbvhpzK"
9
10Flagsmith.shared.getFeatureFlags() { (result) in
11    switch result {
12    case .success(let flags):
13        for flag in flags {
14            let name = flag.feature.name
15            let value = flag.value
16            let enabled = flag.enabled
17            print(name, "= enabled:", enabled, "value:", value ?? "nil")
18        }
19}
1dependencies:
2  flagsmith:
3
4var flagsmith = 
5  FlagsmithClient(apiKey: 'TijpMX6ajA7REC4bf5suYg')
6
7bool featureEnabled = 
8  await flagsmith.hasFeatureFlag("chat_widget");
9if (featureEnabled) {
10    // run the code to execute enabled feature
11}
12
13var user = FeatureUser(identifier: 'flagsmith_sample_user');
14bool featureEnabled = a
15  wait flagsmith.hasFeatureFlag('chat_widget', user: user);
16if (featureEnabled) {
17    // run the code to execute enabled feature for given user
18}
1$ pip install flagsmith
2
3from flagsmith import Flagsmith;
4
5flagsmith = Flagsmith(
6    environment_key = "TijpMX6ajA7REC4bf5suYg"
7)
8
9identifier = "delboy@trotterstraders.co.uk"
10traits = {"car_type": "robin_reliant"}
11
12# The method below triggers a network request
13identity_flags = flagsmith.get_identity_flags(identifier=identifier, traits=traits)
14show_button = identity_flags.is_feature_enabled("secret_button")
15button_data = json.loads(identity_flags.get_feature_value("secret_button"))
1$ gem install flagsmith
2
3require "flagsmith"
4
5$flagsmith = Flagsmith::Client.new(
6  environment_key: 'TijpMX6ajA7REC4bf5suYg'
7)
8
9$identifier = 'delboy@trotterstraders.co.uk'
10$traits = {'car_type': 'robin_reliant'}
11
12$flags = $flagsmith.get_identity_flags($identifier, **$traits)
13$show_button = $flags.is_feature_enabled('secret_button')
14$button_data = $flags.get_feature_value('secret_button')
1$ dotnet add package Flagsmith --version 4.0.0
2
3using Flagsmith;
4
5FlagsmithClient _flagsmithClient;
6
7_flagsmithClient = new("TijpMX6ajA7REC4bf5suYg");
8
9var identifier = "delboy@trotterstraders.co.uk";
10var traitKey = "car_type";
11var traitValue = "robin_reliant";
12var traitList = new List<Trait> { new Trait(traitKey, traitValue) };
13
14request
15var flags = _flagsmithClient.GetIdentityFlags(identifier, traitList).Result;
16var showButton = flags.IsFeatureEnabled("secret_button").Result;
1composer require flagsmith/flagsmith-php-client
2
3use Flagsmith\Flagsmith;
4
5$flagsmith = new Flagsmith('TijpMX6ajA7REC4bf5suYg');
6
7$identifier = 'delboy@trotterstraders.co.uk';
8$traits = (object) [ 'car_type' => 'robin_reliant' ];
9
10$flags = $flagsmith->getIdentityFlags($identifier, $traits);
11$showButton = $flags->isFeatureEnabled('secret_button');
12$buttonData = $flags->getFeatureValue('secret_button');
1go get github.com/Flagsmith/flagsmith-go-client/v2
2
3import (
4  flagsmith "github.com/Flagsmith/flagsmith-go-client"
5)
6
7// Initialise the Flagsmith client
8client := flagsmith.NewClient('TijpMX6ajA7REC4bf5suYg', flagsmith.WithContext(ctx),)
9
10trait := flagsmith.Trait{TraitKey: "trait", TraitValue: "trait_value"}
11traits = []*flagsmith.Trait{&trait}
12
13flags, _ := client.GetIdentityFlags(identifier, traits)
14
15showButton, _ := flags.IsFeatureEnabled("secret_button")
16buttonData, _ := flags.GetFeatureValue("secret_button")
17
1# Cargo.toml
2flagsmith = "~1"
3
4let options = FlagsmithOptions {..Default::default()};
5let flagsmith = Flagsmith::new(
6        env::var("TijpMX6ajA7REC4bf5suYg").expect("Key not found"), options,);
7
8use flagsmith_flag_engine::identities::Trait;
9use flagsmith_flag_engine::types::{FlagsmithValue, FlagsmithValueType};
10
11let identifier = "delboy@trotterstraders.co.uk";
12
13let traits = vec![Trait {
14            trait_key: "car_type".to_string(),
15            trait_value: FlagsmithValue {
16                value: "robin_reliant".to_string(),
17                value_type: FlagsmithValueType::String,
18            },
19        }];
20
21// The method below triggers a network request
22let identity_flags = flagsmith.get_identity_flags(identifier, Some(traits)).unwrap();
23
24let show_button = identity_flags.is_feature_enabled("secret_button").unwrap();
25let button_data = identity_flags.get_feature_value_as_string("secret_button").unwrap();

Flexible deployment options

Cloud

  • Try our enterprise-grade cloud offering hosted by Flagsmith
  • Flagsmith cloud gets you get up and running instantly
  • Optimized over eight regions across the world to minimize latency
Learn More

Private Cloud

  • Fully managed private deployments
  • Have us host in your own private instance in any region you choose
  • Protect yourself with increased security
Learn More

On-Prem

  • Self host on-premises or in your own cloud
  • On-prem feature flags are ideal for privacy-conscious organizations
  • Includes premium support from the Flagsmith team
  • Easily deploy with familiar tools like Helm for Kubernetes and our OpenShift Operator
Learn More

Get started

Enhance customer experience by bringing feature flags to your projects

Start Free Trial