<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Charlie Macnamara</title>
    <description>The latest articles on Forem by Charlie Macnamara (@wardenscotland).</description>
    <link>https://forem.com/wardenscotland</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F380700%2F74e7202d-0352-4bac-a42e-8586a4169885.png</url>
      <title>Forem: Charlie Macnamara</title>
      <link>https://forem.com/wardenscotland</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/wardenscotland"/>
    <language>en</language>
    <item>
      <title>Analysis of alternative Feature Flag software</title>
      <dc:creator>Charlie Macnamara</dc:creator>
      <pubDate>Tue, 26 May 2020 14:03:16 +0000</pubDate>
      <link>https://forem.com/wardenscotland/analysis-of-alternative-feature-flag-software-bpb</link>
      <guid>https://forem.com/wardenscotland/analysis-of-alternative-feature-flag-software-bpb</guid>
      <description>&lt;p&gt;With such a fast-moving software industry, competing companies aiming to provide solutions to our development needs are popping up at a faster pace, with more impressive solutions than ever before. Too often, however, we may fall victim to using the most widely adopted software instead of looking at what alternative companies have to offer where we might find something rather special.&lt;/p&gt;

&lt;p&gt;In this article, we are going to look at alternative Feature Flag services to use instead of the market leader Feature Flag service, LaunchDarkly. Since its launch in 2013, LaunchDarkly has gained definite market control over the SaaS Feature Flag industry. While there is no doubt that LaunchDarkly is a great service, there is a plethora of alternative software from companies aiming to deliver high-quality Feature Flags, with additional advantages over LaunchDarkly, such as price, functionality, and ease of use. So With that said this article has in no means been made to bring a negative light to the service, it is more to shed light on the other services that you could use. And hey, if none of these services are for you, you can always use LaunchDarkly.&lt;/p&gt;

&lt;p&gt;So with that, all said let's start taking a look at other alternative companies and see what they bring to the table by discussing a bit about what the company offers, their pricing, as well as a small code example of showing how to use their software. All the necessities to get you caught up. And just to make it clear, these companies are not ordered by personal preference, I'm just a fan of alphabetical ordering. :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Appknobs
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w64YpoOf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bny35ol2amtohh49xh9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w64YpoOf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bny35ol2amtohh49xh9s.png" alt="Appknobs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Appknobs have set themselves apart from the rest of the Feature Flag market by building a front-end, declarative feature-flag management solution that makes Appknobs the one-stop-shop for React-based developers or anyone who has the itch to flesh out their front-end projects. It's easy and intuitive for front end developers to use, and because Appknobs is declarative, they have a pretty neat flag auto-discovery tool that lets devs easily add feature tags, parse their code, and display flags in the admin panel all in a matter of seconds. However, where Appknobs falls short is by having a lack of external integrations and analytics, but this is a feature they are planning to add in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Appknobs offer three package types for your ideal use case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A free plan that allows one application and one flag feature to be created. &lt;/li&gt;
&lt;li&gt;  A Startup plan which includes unlimited flags on one application for the price of £6.00/month&lt;/li&gt;
&lt;li&gt;  Finally, they offer a Premium plan that you can try for free for 30 days. This is the ideal package they offer for agencies or larger projects at a monthly rate of £29.00 per month.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the example below, inserting Appknobs is really simple and will fit into your programs without any problems while providing a great way to use Featuring Flags.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import * as React from 'react'

import {render} from 'react-dom'

import {Appknobs, Feature} from '@appknobs/react'

import {newBrowserClient} from '@appknobs/client'

const App = ({client, stage}) =&amp;gt; (

  &amp;lt;Appknobs client={client} payload={{stage}}&amp;gt;

      &amp;lt;Feature name='first-feature'&amp;gt;

        &amp;lt;p&amp;gt;This feature is hidden behind a toggle!&amp;lt;/p&amp;gt;

      &amp;lt;/Feature&amp;gt;

  &amp;lt;/Appknobs&amp;gt;

)

const client = newBrowserClient({apiKey: 'YOUR_API_KEY', appId: 'YOUR_APP_ID'})

render(&amp;lt;App client={client} stage={'dev'} /&amp;gt;, document.querySelector('#root'))

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Available SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  React&lt;/li&gt;
&lt;li&gt;  React Native&lt;/li&gt;
&lt;li&gt;  Angular&lt;/li&gt;
&lt;li&gt;  Electron&lt;/li&gt;
&lt;li&gt;  Node.js (server-side)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Apptimize
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cVQd08P9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lr55yhyve0tjqr5ud18k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cVQd08P9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/lr55yhyve0tjqr5ud18k.png" alt="Apptimize"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What makes Apptimize stand out is its outstanding mobile first-class solution for quick and easy testing. They are the most widely used mobile A/B testing and release management solution, so if mobile is your preferred platform, this is most likely your service. Apptimize enables more stakeholders to test across the company using their visual editor for mobile devices and using "dynamic variables." Apptimize also enables goal-based results so that you can automatically pull events from third parties and see the direct business impact of your tests. They also offer a wealth of integration from &lt;a href="%5Bhttps://apptimize.com/docs/third-party-integrations.html"&gt;third party applications&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apptimize works their pricing in a very fairway. Instead of paying for a certain amount of features that you may not actually make full use of, you are billed from each of your monthly devices. All customers have full access to Feature Flags, A/B Experiments, and Instant Updates with no limitations on metrics, experiments, events, or seats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementation of Apptimize is as easy as it can be. All you need is a simple property value and installed library, then you're good to go!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (Apptimize.isFeatureFlagOn("risky_new_feature")){

 // ON

 [show risky new feature]

} else {

 // OFF

 [hide risky new feature]

}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Available SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  iOS&lt;/li&gt;
&lt;li&gt;  Android&lt;/li&gt;
&lt;li&gt;  React Native (mobile)&lt;/li&gt;
&lt;li&gt;  JavaScript&lt;/li&gt;
&lt;li&gt;  Roku&lt;/li&gt;
&lt;li&gt;  Java (server)&lt;/li&gt;
&lt;li&gt;  Node.js (Server)&lt;/li&gt;
&lt;li&gt;  PHP (Server)&lt;/li&gt;
&lt;li&gt;  Python (Server)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Bullet Train
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1edZ0pqH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ipynvaoc6isuhe4vmve4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1edZ0pqH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/ipynvaoc6isuhe4vmve4.png" alt="Bullet Train"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bullet Train has built its product by combining the concepts of feature toggles with the flexibility of remote configuration, all of which are integrated into a single stellar package. They offer a great deal of flexibility by enabling management across web, mobile, and server-side applications, and if that wasn't enough, they are completely open-source, allowing you to host all of their infrastructures on your own. Since Bullet Train is open-source, this also brings extra security benefits as you can inspect the code yourself to make sure there are no back doors. I have to commend Bullet Train, as I'm a sucker for anything open source, and it's great to see that they haven't decided to focus on the extra bells and whistles of Feature Flags that some users may not use (such as A/B testing analytics) and instead put all their effort into the key features of the Feature Flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While Bullet Train is completely open-source, meaning you don’t have to give them a penny if you don’t want to, they do offer some priced plans with additional benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Free: Up to 20k API calls per month, 1 Team Member&lt;/li&gt;
&lt;li&gt;  $29/month: Up to 250k API calls per month, 3 Team Members&lt;/li&gt;
&lt;li&gt;  $99/month: Up to 2M API calls per month, 10 Team Members&lt;/li&gt;
&lt;li&gt;  They also offer a negotiable custom plan which you can enquire about by calling them which offers Over 2M API calls or 10 team members&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code below is a great example of the flexibility you have with BulletTrain. BulletTrain allows you to code your Feature Flags to your ideal use case with almost unlimited customization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var bulletTrain = require("bullet-train-nodejs");

bulletTrain.init({

    environmentID: "&amp;lt;YOUR_ENVIRONMENT_KEY&amp;gt;"

});

bulletTrain.hasFeature("header", '&amp;lt;My User Id&amp;gt;')

    .then((featureEnabled) =&amp;gt; {

        if (featureEnabled) {

            //Show my awesome cool new feature to this one user

        }

    });

bulletTrain.hasFeature("header")

    .then((featureEnabled) =&amp;gt; {

        if (featureEnabled) {

            //Show my awesome cool new feature to the world

        }

    });

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;available SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Javascript/React/React Native&lt;/li&gt;
&lt;li&gt;  Node&lt;/li&gt;
&lt;li&gt;  Android&lt;/li&gt;
&lt;li&gt;  iOS&lt;/li&gt;
&lt;li&gt;  Java&lt;/li&gt;
&lt;li&gt;  Python&lt;/li&gt;
&lt;li&gt;  Ruby&lt;/li&gt;
&lt;li&gt;  .Net&lt;/li&gt;
&lt;li&gt;  REST&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ConfigCat
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cNpXUTgg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l3a5ntwlsd8ulxi8sxzt.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cNpXUTgg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/l3a5ntwlsd8ulxi8sxzt.jpeg" alt="ConfigCat"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ConfigCat was built with the idea of being the ideal Feature Flag service for teams. They've created a stress-free Feature Flag solution, in which they 've streamlined the process of using Feature Flags for their users so you don't have to mess around with unnecessary decisions while making sure their product is as intuitive as it's easy to set up and get started. If you choose ConfigCat as your flag feature service, you'll be up and running in 10 minutes, and if you have any issues, they have a Slack community channel that the teams devs almost immediately respond to, as well they offer a whole bunch of &lt;a href="https://configcat.com/#integrations"&gt;integration options&lt;/a&gt;. And if you weren't won over, they're also planting a tree for every subscription (10 trees for Unlimited Accounts!) and hey, we can't skip the fact that they have a lovely cat as their logo. Serious extra points for that in my eyes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ConfigCat offers an expansive, forever-free plan that includes all of the flag features that you may want to use such as segmentation, targeting, multi-factor authentication or support for SSO and more, but they do offer some very useful benefits if you decide to upgrade your flag feature game by purchasing a paid account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Free plan: includes up to 10 Feature Flags, 1 product, and 2 environments&lt;/li&gt;
&lt;li&gt;  Professional plan: up to 100 Feature Flags, 3 products, 3 environments, and 1 tree planted all for the rate of €49/month.&lt;/li&gt;
&lt;li&gt;  Unlimited Plan: Well, this is as simple as it can be, everything they offer is unlimited! (Well, besides the trees, they plant 10 per month) at a rate of €199/month. &lt;/li&gt;
&lt;li&gt;  Dedicated plan: This gives you the same benefits as the unlimited plan, as well as the dedicated infrastructure and domain name at a rate of €1499 per month.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the 10 minute startup guide found on ConfigCat 's homepage didn't win you over with how seamless integration is, I hope the example below will work. ConfigCat delivers a secure and easy Feature Flag implementation that you won't be disappointed with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i configcat-node

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const configcat = require("configcat-node");

let configCatClient = configcat.createClient("&amp;lt;SDK-KEY&amp;gt;");

const isDebugModeOn = await configCatClient.getValueAsync("isDebugModeOn", false);

console.log("Value of the Feature Flag called \"isDebugModeOn\": " + isDebugModeOn);

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Available SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  .NET&lt;/li&gt;
&lt;li&gt;  Java&lt;/li&gt;
&lt;li&gt;  Server Side Javascript, such as NodeJS or Nuxt&lt;/li&gt;
&lt;li&gt;  Front-end JavaScript, such as Vanilla, Angular or React&lt;/li&gt;
&lt;li&gt;  React-Native&lt;/li&gt;
&lt;li&gt;  Android,&lt;/li&gt;
&lt;li&gt;  iOS&lt;/li&gt;
&lt;li&gt;  PHP, the plain-old one and frameworks like Laravel too&lt;/li&gt;
&lt;li&gt;  Python&lt;/li&gt;
&lt;li&gt;  Go&lt;/li&gt;
&lt;li&gt;  Ruby&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Flipt
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xL67t1Fb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3gxeah1006g09d4pxysg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xL67t1Fb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/3gxeah1006g09d4pxysg.png" alt="Flipt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have already gushed a bit about my love for open-source, so it shouldn't come as a surprise that I'm a fan of Flipt. Flipt is the only service in this article that doesn't offer any pricing plans, but that doesn't mean that they don't offer a great piece of technology. Their software comes with all the flagship services you would want, such as on/off toggles, rolling out features to a percentage of customers, and advanced segmentation. While there are advantages that the service is open source, such as greater security for the reasons mentioned earlier in this article, and that anyone can contribute, there are some caveats. Support is not as fast and reliable, there are no audit logs and there is currently no support for multiple environments and user management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Flipt's setup is simplicity at its finest, Flipt is a single binary with no external dependencies by default.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import flipt "github.com/markphelps/flipt-grpc-go"

client := flipt.NewFliptClient(conn)

flag, err := client.GetFlag(context.Background(), &amp;amp;flipt.GetFlagRequest{

                    Key: ‘show_coupon’,

            })

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;available SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Any language supported by GRPC can be used by &lt;a href="https://flipt.io/docs/integration/#generate"&gt;generating a Flipt client&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  GO&lt;/li&gt;
&lt;li&gt;  Ruby&lt;/li&gt;
&lt;li&gt;  Pythib&lt;/li&gt;
&lt;li&gt;  IOS&lt;/li&gt;
&lt;li&gt;  React&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Togglz
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--E3EDuyrk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/387t3mi1zc1gnfgizk4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--E3EDuyrk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/387t3mi1zc1gnfgizk4h.png" alt="Togglz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Togglz has designed a Feature Flag service for businesses, such as start-ups and medium-sized organizations. The cool thing about Togglz is that they are language, framework, and platform agnostic. Another advantage of using Togglz is how seamless it is to set up since you don't need to install any libraries. Simply call the endpoint and digest the response, then you can store the result locally if you want to, or call the endpoint. Super simple right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Togglz has gone with a very simple way to set their prices that could leave something to be desired. On the one hand, I like the two simple options, but I also wish they had a middle ground.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Free: This includes 10 feature toggles, 2 environments, and 10,000 API requests per month&lt;/li&gt;
&lt;li&gt;  Pro: This comes with the added benefit of allowing more traffic, more environments and unlimited feature toggles, environments, and API requests &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As discussed at the beginning of the Togglz section, we don't need any external libraries to get Togglz up and running. This makes integration seamless without fiddling around, which I'm sure you can appreciate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const res = await fetch('&amp;lt;Togglz-API&amp;gt;');

const features = await res.json();

if (features.myNewThing) {

  // ...new feature code

}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;available SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since Togglz is an agnostic platform, this means that Togglz does not have any SDKs out of the box, meaning that Togglz users need to write all that HTTP request logic (including caching, error handling, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Unleashed-hosted
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3fkoO0La--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9teqyqwn58qusc7j9p3d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3fkoO0La--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/9teqyqwn58qusc7j9p3d.png" alt="Unleashed-hosted"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This brings us to the last Feature Flag service that we'll be looking at, but it's by no means the least favorable. Unleash-hosted is probably the most unique Feature Flag service I have discussed in this article. They offer two versions of their service, an open-source version, and a paid enterprise version. In a way, this combines the best of both worlds. If you want, you can self-host the entire service for free, or you can purchase an &lt;a href="https://www.unleash-hosted.com/open-source"&gt;enterprise version&lt;/a&gt; bringing extra benefits such as premium support, and security/access benefits. They offer a vast range of Activation strategies from the get-go allowing you to enable or disable your features in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unleash-hosted offers a free trial for their type of paid account, starting at $50 a month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Similar to the example I've shown for Apptimize, Unleashed-hosted is just as easy to integrate. It's a simple library and property then you're in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (unleash.isEnabled("AwesomeFeature")){

 // some new magic

} else {

 // old boring stuff

}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Available SDKs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Java&lt;/li&gt;
&lt;li&gt;  Node.js&lt;/li&gt;
&lt;li&gt;  SinglePage JS&lt;/li&gt;
&lt;li&gt;  Go&lt;/li&gt;
&lt;li&gt;  Eliixir&lt;/li&gt;
&lt;li&gt;  .net&lt;/li&gt;
&lt;li&gt;  Ruby&lt;/li&gt;
&lt;li&gt;  Python&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And with that, this brings us to the end of our look at the alternative Feature Flag software. As you can see, all of them share some similar traits. There's not one piece of software that I would criticize for the integration process, but it's the little things that count and will inevitably lead to your decision on which piece of software to use. I hope this article has drawn some attention to the alternative Feature Flag software that you can use and has given you some valuable information regarding each company I have discussed. They're all great on their own merits, and you're not going to be disappointed by whatever choice you choose.&lt;/p&gt;

</description>
      <category>featureflags</category>
      <category>saas</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Comparing integration of Feature Flags: ConfigCat and LaunchDarkly</title>
      <dc:creator>Charlie Macnamara</dc:creator>
      <pubDate>Wed, 06 May 2020 14:41:02 +0000</pubDate>
      <link>https://forem.com/wardenscotland/comparing-integration-of-feature-flags-between-configcat-and-launchdarkly-2mie</link>
      <guid>https://forem.com/wardenscotland/comparing-integration-of-feature-flags-between-configcat-and-launchdarkly-2mie</guid>
      <description>&lt;p&gt;Feature flags are great. They give you a controlled way to introduce features and capabilities. It's as simple as turning on and off your change. This has undeniably saved many software engineers some heartbreak.&lt;/p&gt;

&lt;p&gt;My name is Charlie. I'm new to feature flags and thought I would share my first-hand experience setting them up. If you are unfamiliar with using feature flags, just as I am, or are just looking for the right service, you are in the right place. Today, we are going to compare the integration process between &lt;a href="https://configcat.com/" rel="noopener noreferrer"&gt;ConfigCat&lt;/a&gt; and &lt;a href="https://launchdarkly.com/" rel="noopener noreferrer"&gt;LaunchDarkly&lt;/a&gt; using a simple Python program. &lt;/p&gt;

&lt;p&gt;If you want to follow along but Python isn't your language of choice, don't worry! Both companies offer many SDKs.&lt;/p&gt;

&lt;p&gt;Let's talk about what we are going to build. For those who are familiar with ConfigCat and their &lt;a href="https://configcat.com/featureflags" rel="noopener noreferrer"&gt;feature flags&lt;/a&gt; section of their website, chances are you saw the &lt;code&gt;isCoolCatEnabled&lt;/code&gt; toggle and thought "wow, if only I create something as neat", well if so, you are in luck! That's precisely what we are going to be demonstrating today. Well, sort of. We are creating a program that will import an image and invert the color when our flag is on, saving the result to a new file. And when the flag is off, our program will delete the file.&lt;/p&gt;

&lt;p&gt;Now that you know what you're in for, let's look at integrating it on the ConfigCat side. To get started, sign in to your ConfigCat account and select Add Feature Flag, create a name (in my case I have gone with "catinvert"), then click Add Feature Flag. Yes really, it's that simple.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb7fvioe95r4w2gcrpf64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb7fvioe95r4w2gcrpf64.png" alt="ConfigCat add feature flag" width="800" height="853"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We need to install the &lt;code&gt;ConfigCat&lt;/code&gt; library from here, so open your terminal and enter it. &lt;/p&gt;

&lt;p&gt;"bash&lt;br&gt;
pip install configcat-client&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If you're following along with this post, you'll need another library too, so go ahead and install the `Pillow` library with:

""ash
pip install Pillow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that everything is installed, we can get into the fun stuff. Open your favorite IDE, create a new .py file, add an image to the same folder(I decided to go with the ConfigCat logo in the spirit of this post), and then we can get started! To implement ConfigCat, simply enter the following lines. Again, if you're following along, I import some more libraries, but this will be reflected as you read on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fup6igiq3eh3yqr1an44l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fup6igiq3eh3yqr1an44l.jpg" alt="ConfigCat imported image" width="360" height="360"&gt;&lt;/a&gt;&lt;br&gt; My imported image 
  &lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;  &lt;span class="n"&gt;configcatclient&lt;/span&gt;
&lt;span class="n"&gt;configcat_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;configcatclient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_client_with_auto_poll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;YOUR_SDK_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;poll_interval_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;YOUR_FEATURE_FLAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;configcat_client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Y&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="n"&gt;UR_FEATURE_FLAG&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our top-line imports the library we need. Our second line determines how often ConfigCat will download and store the values from your program. There are four options you can select for how ConfigCat does this, but we have gone with the poll_interval option. The final line allows you to access your feature flags and settings.&lt;/p&gt;

&lt;p&gt;Bulb: Your SDK key and feature flag name will automatically be added. For security, please never share your SDK key. Sorry; we deleted our Feature Flag after we finished this post.&lt;/p&gt;

&lt;p&gt;Now that we have that out of the way, let's look at the final program.&lt;/p&gt;

&lt;p&gt;"`"thonPythont configcatclient&lt;br&gt;
from PIL import Image, ImageOps&lt;br&gt;
import time&lt;br&gt;
import os&lt;/p&gt;

&lt;p&gt;configcat_client = configcatclient.create_client_with_auto_poll(&lt;br&gt;
    '1uXXCAAgHzREa0_HhlhMIw/qLn4CgPtwEuTGys-Ropbmg', poll_interval_seconds=1); # &amp;lt;-- This is the actual SDK Key for your Production environment&lt;/p&gt;

&lt;p&gt;while True:&lt;br&gt;
    catinvert = configcat_client.get_value('ca'invert', 'alse)&lt;br&gt;
    if catinvert:&lt;br&gt;
        im = Image.open('logo.jpg') # imports file&lt;br&gt;
        im_invert = ImageOps.invert(im) # inverts image&lt;br&gt;
        im_invert.save('inverted-logo.jpg', quality=95) # saves new file&lt;br&gt;
    else:&lt;br&gt;
        try:&lt;br&gt;
            os.remove('inverted-logo.jpg') # deletes created file&lt;br&gt;
        except os.error:&lt;br&gt;
            pass&lt;br&gt;&lt;br&gt;
    time.sleep(1)&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
With everything in place, let's run the program and return to our feature flag. Turn the flag on, click save changes, and watch the magic unfold! &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8lhnslaqz76j0vj7tndw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8lhnslaqz76j0vj7tndw.png" alt="ConfigCat  feature flag" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The program does exactly as we intended. When the flag is on, the imported image gets inverted, and the image gets deleted when off.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F08ygqgg7nqzieylt4w09.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F08ygqgg7nqzieylt4w09.jpg" alt="ConfigCat inverted image" width="360" height="360"&gt;&lt;/a&gt;&lt;br&gt; My result image 
  &lt;/p&gt;

&lt;p&gt;Let's go to LaunchDaily and implement the same program. Everything starts off similarly: select Create Flag, select a name (I went with "darkly invert"), and then create a folder and a .py file.&lt;/p&gt;

&lt;p&gt;For LaunchDarkly to function, we need to install their SDK library, open up a terminal, and enter:&lt;br&gt;
&lt;code&gt;`&lt;br&gt;
echo "launchdarkly-server-sdk==6.13.0" &amp;gt;&amp;gt; requirements.txt &amp;amp;&amp;amp; pip install -r requirements.txt&lt;br&gt;
`&lt;/code&gt;&lt;br&gt;
Now let's look at what lines of code we need to implement.&lt;/p&gt;

&lt;p&gt;"`p" hon&lt;br&gt;
iPythonldclient&lt;br&gt;
if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;":&lt;br&gt;
  ldclient.set_sdk_key("YOUR_SDK_KEY")&lt;br&gt;
user = {&lt;br&gt;
  "key": ""NI" UE IDENTIFIER",&lt;br&gt;
 "fir"tName": ""ob",&lt;br&gt;
 ""lastName": "Loblaw",&lt;br&gt;
  "cus"om": {"    "gro"ps": ""et"_testers"&lt;br&gt;
  "&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;show_feature = ldclient.get().variation("YOUR_FEATURE_FLAG", user, False)&lt;br&gt;
ldclient.get().close()&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
The top line imports the LaunchDarkly library. Our second line sets our SDK key. Next, our user information is sent in; let's stick to the default. Following that show_feature allows you to access our feature flags and settings.&lt;/p&gt;

&lt;p&gt;💡 Your SDK key and Feature Flag are automatically added.&lt;/p&gt;

&lt;p&gt;Once we have done all this, we can save and test. LaunchDarkly will show you in real time if they have received an event for your flag before moving on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0cfy8gpibb7gnlefjvy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fb0cfy8gpibb7gnlefjvy.png" width="800" height="197"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, let's alter our program. Add an image to the same folder so LaunchDarkly can get to work. Let's change our image to LaunchDarkly's logo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff1f8jfh7cq97hbjcjfjm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ff1f8jfh7cq97hbjcjfjm.jpg" alt="LaunchDarkly imported image" width="800" height="452"&gt;&lt;/a&gt;&lt;br&gt; My imported image 
  &lt;/p&gt;

&lt;p&gt;"`py" on&lt;br&gt;
impPythonclient&lt;br&gt;
from PIL import Image, ImageOps&lt;br&gt;
import time&lt;br&gt;
import os&lt;/p&gt;

&lt;p&gt;if &lt;strong&gt;name&lt;/strong&gt; == "&lt;strong&gt;main&lt;/strong&gt;":&lt;br&gt;
  ldclient.set_sdk_key("sdk-17e098af-f9df-417b-b846-a29d65144779")&lt;/p&gt;

&lt;p&gt;user = {&lt;br&gt;
  "key"" "U"IQ"E IDENTIFIER",&lt;br&gt;
  "firs" Name": "B"b""&lt;br&gt;
  "lastName": "Loblaw",&lt;br&gt;
  "cust"m": {&lt;br&gt;
"   "grou"s": "b" ta"testers"&lt;br&gt;
  }"}&lt;/p&gt;

&lt;p&gt;while True:&lt;br&gt;
    show_feature = ldclient.get().variation("dark"yinvert", us"r, False)&lt;br&gt;
    if show_feature:&lt;br&gt;
        im = Image.open('logo.jpg') # imports file&lt;br&gt;
        im_invert = ImageOps.invert(im) # inverts image&lt;br&gt;
        im_invert.save('inverted-logo.jpg', quality=95) # saves new file&lt;br&gt;
    else:&lt;br&gt;
        try:&lt;br&gt;
            os.remove('inverted-logo.jpg') # deletes created file&lt;br&gt;
        except os.error:&lt;br&gt;
            pass&lt;br&gt;&lt;br&gt;
    time.sleep(1)&lt;/p&gt;

&lt;p&gt;ldclient.get().close()&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

As you can see, little has changed. The apparent difference is the user information LaunchDarkly needs. Let's start our program, head over to our new feature flag, and turn it on.
&amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/i/7dpvfbmes7b33ahs8v3z.png" alt="LaunchDarkly flag on"/ width="500" height="500"&amp;gt;

The main difference between doing this on LaunchDarkly and ConfigCat is that you must enter the name of your production environment and a comment to turn on your flag.
&amp;lt;figure&amp;gt;
  &amp;lt;img src="https://dev-to-uploads.s3.amazonaws.com/i/43fx2fcl260gra529ph1.jpg" alt="LaunchDarkly inverted image"/ width="270" height="270"&amp;gt;
  &amp;lt;figcaption&amp;gt; My result image &amp;lt;/figcaption&amp;gt;
&amp;lt;/figure&amp;gt;


As expected, everything worked as intended. Now we have looked into integration on both ends, let's look at the key differences:
- ConfigCat offers four different ways off the bat to download your values, LaunchDarkly has options for this, but you'll have to delve into their [customization documentation]
(https://docs.launchdarkly.com/sdk/server-side/python#customizing-your-client) to set up some extra stuff with their parameters
- LaunchDarkly tests your connection in the startup process, prompting you to try again if the connection has failed. ConfigCat displays if your initial request was successful by displaying the 'last accessed datetime below your feature flag
- LaunchDarkly needs extra user information for your program. ConfigCat does not require this step
- Switching your flag on with ConfigCat is as simple as on-off, LaunchDarkly requires you to input some extra information

Both software ultimately aim to provide the same result when implementing feature flags—there are clear pros and cons to either. LaunchDarkly is the market leader, offering more support options and the security of using a long-standing product.

However, since you can only use your account on a trial basis, this may not be ideal for students or people just looking to try out feature flags. ConfigCat, on the other hand, has a free account type that you can use forever, with the base account type being cheaper than LaunchDarkly. And hey, a cute cat is the logo. That's me sold. Just kidding, both pieces of software are excellent in their merit.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>featureflags</category>
      <category>python</category>
      <category>testing</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
