
Flagsmith - Open Source Feature Flag Service
Ship Faster and Control Releases with Feature Flag Management
Change the way your team releases software. Roll out, segment, and optimise—with granular control. Stay secure with on-premise and private cloud hosting.
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 {flagsmith.hasFeature("chat") && <ChatWidget>}
12 </Layout>
13)
14
Trusted by top development teams
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!
Flagsmith enables us to continuously deploy to production and release on demand.
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 feature flag tool for developing, implementing, and managing your feature flags. Whether you are moving off an in-house solution or using feature toggles for the first time, you will be amazed by the power and efficiency gained by using Flagsmith.
Learn More
Manage feature flags across multiple platforms
Easily 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, granular 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. Integrate with your existing stack and send flag data to your analytics platform.
You can configure features for Individual Segments, Users, and Development environments.
Remote config
Combine the value of feature toggles with the flexibility of remote config to test and deploy new features with confidence. All feature flags in Flagsmith are capable of being configured for remote config.
What does that mean for you? As well as toggling a feature flag, with remote config you can customize values for your features, letting you deploy functional and visual changes to users without changing any code or pushing 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 or 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.
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}
18
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}
19
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}
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 { 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")
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();
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's feature flag software 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.