<?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>DEV Community: ConfigCat</title>
    <description>The latest articles on DEV Community by ConfigCat (@configcat).</description>
    <link>https://dev.to/configcat</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%2Forganization%2Fprofile_image%2F1168%2F1fcec573-3378-4a2c-aae9-996b64b75c7a.png</url>
      <title>DEV Community: ConfigCat</title>
      <link>https://dev.to/configcat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/configcat"/>
    <language>en</language>
    <item>
      <title>What can European SaaS companies do after EU-US Privacy Shield invalidation?</title>
      <dc:creator>sige</dc:creator>
      <pubDate>Thu, 24 Dec 2020 14:05:15 +0000</pubDate>
      <link>https://dev.to/configcat/what-can-european-saas-companies-do-after-eu-us-privacy-shield-invalidation-mo1</link>
      <guid>https://dev.to/configcat/what-can-european-saas-companies-do-after-eu-us-privacy-shield-invalidation-mo1</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc7shtl04p8f1buxazl4l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fc7shtl04p8f1buxazl4l.jpg" alt="Privacy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is not much hype around this topic however, I believe it is very important for EU businesses today.&lt;/p&gt;

&lt;p&gt;The European Court of Justice declared the &lt;a href="https://dev.toEU%20Court%20of%20Justice%20official%20press%20release%20on%20the%20Schrems%20II%20ruling"&gt;EU-US Privacy Shield to be ineffective&lt;/a&gt; due to the FISA 702 regulations in the United States. This basically means that US authorities can execute targeted surveillance on non-US citizens and companies. They can collect, keep, and use this data for investigation. This regulation does not affect US citizens and businesses.&lt;/p&gt;

&lt;p&gt;Our company &lt;a href="//configcat.com"&gt;ConfigCat.com&lt;/a&gt; serves feature flags and is the sub-contractor of other companies as part of the supplier chain. Some of our European customers started to worry about if their data is safe with their sub-contractors and how does this affect GDPR.&lt;/p&gt;

&lt;p&gt;Being a Europen SaaS company with a global user base we looked into how we can handle this quickly with minimal user impact both technically and legally.&lt;/p&gt;

&lt;p&gt;If you are facing or faced similar issues, I'd like to hear your thoughts about it. Do you think we are going to face an increasing number of privacy issues in the future due?&lt;/p&gt;

&lt;p&gt;Here is what we did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Implemented a Data Governance feature in ConfigCat, so customers can decide if they want their data distributed globally or only in the EU based CDN nodes. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reviewed all our own sub-contractors swapping the US ones who fall under the FISA 702 regulations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm personally having a bit of anxiety about where this is going. Ideally, every entity should be able to use any service no matter where they are located without being worried about the safety of their data. Maybe I'm just too idealistic.&lt;/p&gt;

&lt;p&gt;Our blog post on the topic: &lt;a href="https://configcat.com/blog/2020/11/28/eu-us-privacy-shield" rel="noopener noreferrer"&gt;https://configcat.com/blog/2020/11/28/eu-us-privacy-shield&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>privacy</category>
      <category>gdpr</category>
      <category>politics</category>
    </item>
    <item>
      <title>Feature Toggling Tools for $100 or less</title>
      <dc:creator>Nichole</dc:creator>
      <pubDate>Tue, 07 Apr 2020 17:38:56 +0000</pubDate>
      <link>https://dev.to/configcat/feature-toggling-tools-for-100-or-less-5b3b</link>
      <guid>https://dev.to/configcat/feature-toggling-tools-for-100-or-less-5b3b</guid>
      <description>&lt;p&gt;When it comes to feature flags, there are several packages available for start-ups on a tight budget. Here's a comparison of cross-platform packages which all offer flag management, segment targeting and percentage-based targeting.&lt;/p&gt;

&lt;p&gt;It's worth pointing out that these services could be used for remote configuration, but they don't really compare to Firebase Remote Config. The latter is better suited to modifying content remotely. While none of these packages have out-the-box A/B testing analytics, APIs and integrations are available.&lt;/p&gt;

&lt;p&gt;Flag evaluations are implemented differently on each platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudbees Rollout and ConfigCat have opted to implement all evaluations on the client side, their servers only store flags and rules.&lt;/li&gt;
&lt;li&gt;LaunchDarkly and FeatureFlow have two types of SDK's. Server-side SDK's are comparable to those of ConfigCat and Rollout. In contrast, client-side SDK's allow flag evaluations to take place on the server-side.&lt;/li&gt;
&lt;li&gt;Bullet train does all feature flag evaluations on the server-side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Arguably, server-side evaluations are better suited for mobile apps and web front ends, whereas client-side evaluations are fast and secure.&lt;br&gt;
A differentiating factor is the functionality to schedule releases through the console, LaunchDarkly and FeatureFlow have incorporated this into their front end. Another front-end feature of interest is user segmentation management, which is available with LaunchDarkly, Rollout, and Bullet train subscriptions.&lt;/p&gt;

&lt;p&gt;Let's dive into the available options below.&lt;/p&gt;

&lt;h3&gt;
  
  
  LaunchDarkly
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Well established, boasting many SDKs, integrations and a functional web app.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The "Starter" package can be purchased for 75$ per month and allows for unlimited projects, environments, feature flags and rules. Reach, however, is capped at 1000 client-side monthly active users (MAUs); Server-side MAUs are uncapped. In addition, teams are limited to one developer / product owner.&lt;br&gt;
LaunchDarkly probably supports more languages than any competitor product on the market. They also support JSON flag types. As mentioned, both segments and scheduled releases can be managed through their web app as an additional convenience.&lt;/p&gt;

&lt;p&gt;SDKs: Android (Java and Kotlin), C/C++, Electron, Erlang, Go, Haskell, iOS (Objective and Swift), Java, JavaScript, Node.js, PHP, Python, React, React Native, Ruby .Net, Roku, Xamarin&lt;/p&gt;

&lt;p&gt;Integrations: Azure DevOps (formerly VSTS), Bitbucket Pipelines, Datadog, Dynatrace, Jira, Microsoft Teams, New Relic, OAuth, Slack, Splunk, Terraform, Visual Studio Code, Webhooks&lt;/p&gt;

&lt;p&gt;&lt;a href="https://launchdarkly.com/"&gt;launchdarkly.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ConfigCat
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Ideal for large teams with few applications and variable MAUs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ConfigCat's start-up package, "Pro" goes for 49$ per month if you sign a 12-month contract. There is no limit on the number of users who can be organised into 2 permission groups.&lt;br&gt;
There is also no limit on the number of MAUs, although, the service is capped at 25 million requests per month - that's about 10 requests per second. As per the SLA, they guarantee 99.8% uptime. Support is also available on slack and live chat over and above email.&lt;br&gt;
The package, however, only allows for 100 feature flags, 3 products and 3 environments. Each flag can have a maximum of 8 segment rules and 8 percentage-based rules.&lt;/p&gt;

&lt;p&gt;SDKs: Android (Kotlin), Angular, Go, iOS (Swift), Java, JavaScript, .NET Node.Js, PHP, Python, React, Ruby&lt;/p&gt;

&lt;p&gt;Integrations: CircleCI, DataDog, GitHub Action, Microsoft Teams, Slack, Trello Power-Up, Webhooks (3 per environment), Zapier&lt;/p&gt;

&lt;p&gt;&lt;a href="https://configcat.com/"&gt;configcat.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Cloudbees Rollout
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Perfect for small scale (streaming) apps and A/B testing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With an annual contract, the "Solo" package will set you back by 60$ per month. This package includes unlimited feature flags, projects, environments and rules. An obvious benefit is the ease with which you can dive into A/B testing analytics using Google Analytics.&lt;br&gt;
The service works with streaming applications and is compatible with Android TV, Fire TV, Roku, Chromecast, Apple TV and Tizen.&lt;br&gt;
MAUs are, however, capped at 2000 and as the package name suggests, only one user has access to the platform.&lt;/p&gt;

&lt;p&gt;SDKs: Android (Java), Go, iOS (Swift and Objective-C), Java, Javascript, .NET, Node.js, PHP, Python, React Native, Ruby, Typescript&lt;/p&gt;

&lt;p&gt;Integrations: DataDog, Google Analytics, Jira, Mixpanel, New Relic, Prometheus, Segment&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cloudbees.com/products/rollout/overview"&gt;cloudbees.com&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bullet Train
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Good for low traffic applications with potentially high MAUs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The "Scale-Up" package can be purchased for 99$ per month. It includes unlimited flags, projects, environments and rules. The service is capped at 2 million requests per month (1 request every 1.25 seconds) and a maximum of 10 team members have access to the platform. It comes with priority email support.&lt;br&gt;
There is also a more affordable "Start up" package for just 29$ per month. This package limits the number of requests to 250 thousand (1 request every 10 seconds) and 3 users. The priority email is also excluded.&lt;br&gt;
As the project is open source you could opt to host it free of charge.&lt;/p&gt;

&lt;p&gt;Client Libraries: Android (Java), iOS (Swift)), Java, Javascript, .NET, NodeJS, Python, React, React Native, Ruby&lt;/p&gt;

&lt;p&gt;Integrations: Webhooks&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bullet-train.io/"&gt;bullet-train.io&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  FeatureFlow
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Functionality without the bells and whistles.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Their "Medium" plan retails for $80 per month. On this plan, you receive unlimited feature flags, projects, environments and rules. It also comes with 'Basic' support which guarantees an uptime of 99.8%.&lt;br&gt;
This plan allows teams of up to five to use the service. Unlike competitor products, audit logs are not included. In addition, MAUs are limited to 10 000.&lt;br&gt;
FeatureFlow offers a lightweight "Playground" option for 1 user. This can be used for 1 project, with maximum 2 environments and 10 feature flags. MAUs are capped at 1000.&lt;br&gt;
Integration and language support are rather limited.&lt;/p&gt;

&lt;p&gt;SDKs: AngularJS, Go, Java, JavaScript, .NET, Node.Js, React, Ruby&lt;/p&gt;

&lt;p&gt;Integrations: Slack&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.featureflow.io/"&gt;featureflow.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The table below summarises the pros and cons of each package.&lt;/p&gt;

&lt;p&gt;In summary, LaunchDarkly's 'Starter Package' supports the most SDK's and their web interface is slightly more functional. ConfigCat's "Pro" package allows large teams to work together. Rollout's Solo package is the most convenient for A/B testing. Bullet Train's "Scale-Up" package is suitable for low traffic applications. FeatureFlow's 'Medium' package is ideal if you don't need added features such as audit logs and two factor authentication.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;LaunchDarkly: “Starter”&lt;/th&gt;
&lt;th&gt;ConfigCat: “Pro”&lt;/th&gt;
&lt;th&gt;Rollout: “Solo”&lt;/th&gt;
&lt;th&gt;Bullet Train: “Scale-Up”&lt;/th&gt;
&lt;th&gt;FeatureFlow: “Medium”&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cost ($)&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;49 (annual contract)&lt;/td&gt;
&lt;td&gt;60 (annual contract)&lt;/td&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of users&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Unlimited (2 permission groups)&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MAUs&lt;/td&gt;
&lt;td&gt;1000 client side, unlimited server side&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;2 000&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;10 000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of projects&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of environments&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of feature flags&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of rules per feature flag&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;16 per flag&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Requests per month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;25 million&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;2 million&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Impressions per month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;500 000&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Two Factor Authentication&lt;/td&gt;
&lt;td&gt;Two Factor Authentication and SSO&lt;/td&gt;
&lt;td&gt;Two Factor Authentication&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit logs&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature flag evaluations&lt;/td&gt;
&lt;td&gt;Server side and client side&lt;/td&gt;
&lt;td&gt;Client side&lt;/td&gt;
&lt;td&gt;Client Side&lt;/td&gt;
&lt;td&gt;Server Side&lt;/td&gt;
&lt;td&gt;Server side and client side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guaranteed Uptime as per SLA&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;99.8%&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;99.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>featureflags</category>
      <category>startup</category>
      <category>saas</category>
      <category>featuretoggles</category>
    </item>
    <item>
      <title>3 Ways to Use Feature Flag Management in DevOps </title>
      <dc:creator>CsillaOnTheRoad</dc:creator>
      <pubDate>Sat, 21 Dec 2019 08:49:10 +0000</pubDate>
      <link>https://dev.to/configcat/3-ways-to-use-feature-flag-management-in-devops-5c0i</link>
      <guid>https://dev.to/configcat/3-ways-to-use-feature-flag-management-in-devops-5c0i</guid>
      <description>&lt;p&gt;Theoretically speaking, DevOps is a methodology that aims to merge the operation of different technical teams during the systems development lifecycle. However, there are several practical methods that serve the DevOps philosophy. Feature flag management is one of the best tools you can implement to enhance collaboration and reduce development time. We'll discuss three ways how feature flags can be easily used in a DevOps-driven environment.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Breaking Down Silos Between Business Units&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Agile practitioners came up with the idea of the DevOps culture, their main purpose was to eliminate the boundaries between development and IT operations in order to best serve business needs. Larger tech companies have realized that &lt;strong&gt;involving non-tech teams in the development lifecycle&lt;/strong&gt; can highly boost productivity and shorten development time. With the help of feature flag management platforms,&lt;strong&gt; you don't need to be an avid coder to turn a new feature on or off.&lt;/strong&gt; For instance, the marketing team of your company decides to have a Black Friday promotion on the company website. The campaign manager asks the dev team to put three banners on the website a week before the campaign begins and remove them when it ends. Also, on Black Friday, the price of certain products must appear with 70% discount and go back to full price the next day. The dev team changes the code accordingly, implements feature flags through a management platform and grants the campaign manager with full access to the requested feature flags. This way, the campaign manager gets full visibility over the requested features. Plus, if the marketing team changes the start date, the campaign manager can turn on or off the implemented features when necessary. With such a collaboration, developers can concentrate on building and give control of releases over to other teams.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Deploy When You Want and Release When You Are Ready&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The pace of releasing new features has tremendously changed in the past few years. We all remember the days when software companies deployed feature releases on a monthly, quarterly or annual basis. With the arrival of DevOps mentality, however, the frequency of deploying updates and new features has reduced to weekly, daily or even hourly releases. Techniques like continuous integration (CI) and continuous delivery (CD) have started to sneak into the development pipeline &lt;strong&gt;enabling developers to constantly release their code.&lt;/strong&gt; CI means that members of a dev team integrate their code to a shared repository as frequently as possible and then the code is verified by an integration system before it gets delivered. Obviously, when processes speed up, mistakes happen. And that’s when feature flag management comes in handy. If it turns out that the integrated code is buggy, &lt;strong&gt;the developer can simply apply a feature flag, disable the broken code chunk without touching the master branch and fix the bug later.&lt;/strong&gt; Feature flagging can also be applied in the continuous delivery (CD) pipeline. CD is an extension of continuous integration in a sense that it ensures that you can release new features quickly and frequently in a sustainable way. &lt;strong&gt;If a change in the code is wrapped in a feature flag, you can easily turn it off if it cripples your application or website even after it got released.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Dark Launch – Now You See It, Now You Don’t&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2016, Facebook decided to introduce new reactions to posts and some new emojis were added to the Like Button. It’s always risky to modify something as popular as the Like Button so Facebook chose to release these new features to certain countries only to get some direct feedback before they roll them out globally. Based on the received feedbacks, the social networking company kept the new reactions and made them available to every Facebook user. This is a classic example of a dark launch, when only a certain percentage of users see the new feature and depending on their reactions, the feature is kept and gradually rolled out to everyone, modified or tossed away. The best way to &lt;strong&gt;coordinate and control such a release process is through a feature flag management platform.&lt;/strong&gt; In the management platform, you can wrap the new chunk of code in a feature flag, toggle the flag on for a small number of users and keep it off for the rest. From DevOps point of view, dark launching enhances the continuous delivery process because &lt;strong&gt;you can add a feature flag to every new feature to separate its rollout from code deployment.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wanna learn more about feature flags? Check out these two free feature flag services:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ConfigCat&lt;/strong&gt; - &lt;a href="https://configcat.com/"&gt;https://configcat.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unleash Hosted&lt;/strong&gt; - &lt;a href="https://www.unleash-hosted.com/"&gt;https://www.unleash-hosted.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>featureflags</category>
      <category>agile</category>
      <category>featuretoggles</category>
    </item>
    <item>
      <title>Targeting with ConfigCat: Releasing feature updates without risking your brand’s reputation </title>
      <dc:creator>Nichole</dc:creator>
      <pubDate>Thu, 12 Dec 2019 09:23:32 +0000</pubDate>
      <link>https://dev.to/configcat/targeting-with-configcat-releasing-feature-updates-without-risking-your-brand-s-reputation-46li</link>
      <guid>https://dev.to/configcat/targeting-with-configcat-releasing-feature-updates-without-risking-your-brand-s-reputation-46li</guid>
      <description>&lt;h3&gt;
  
  
  Don’t be a Snapchat, be an Instagram.
&lt;/h3&gt;

&lt;p&gt;Redesigns can be risky - just ask Snapchat. When their redesign went live in 2018, users were unimpressed. There will always be users averse to change and you cannot please everyone. Staged rollouts, however, can be used to manage and minimise backlash. &lt;/p&gt;

&lt;p&gt;ConfigCat streamlines feature flags, making user targeting and staged rollouts simpler. &lt;/p&gt;

&lt;p&gt;Suppose we have created a new direct message feature for our existing photo app. Using ConfigCat’s management console, we can create a flag to enable and disable this feature. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o5JZbQEF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/izzkrt3mubu8vzb86q3a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o5JZbQEF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/izzkrt3mubu8vzb86q3a.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can then create a ConfigCat client in our python application. Using the feature flag key generated above, we can get the boolean value and use it in a conditional statement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"__name__"&lt;/span&gt;&lt;span class="p"&gt;:&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="n"&gt;create_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'&amp;lt;API Key&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;direct_message_enabled&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="n"&gt;get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"directMessageEnabled"&lt;/span&gt;
        &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;direct_message_enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;PhotoApp&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;PreviousPhotoApp&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Let’s roll out the update internally, this can be done by filtering on email addresses. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--InkI91Kw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/o09oripwp992nhtp1u3u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--InkI91Kw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/o09oripwp992nhtp1u3u.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we’re happy, we can release the feature to beta testers. ConfigCat allows us to create custom attributes for users. We can define an attribute ‘user_type’ and set it equal to ‘beta’ to identify beta testers. &lt;/p&gt;

&lt;p&gt;The attribute ‘user_type’ should be included when user objects are instantiated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;example_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'&amp;lt;Some ID&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'user@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'Germany'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'user_type'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'beta'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;We can then filter in all beta testers. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SNRG2lWQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9hjgz3l95zumagt28ony.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SNRG2lWQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/9hjgz3l95zumagt28ony.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we are ready to go live, it may be a good idea to release the feature to the public in stages, on the off chance something goes wrong. Sensitive users have been identified as the most at risk, it’s probably best to leave them for last. Let’s exclude sensitive users and target a portion of the remaining user base.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WLvph2jw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lhv7afuyehymum852vy4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WLvph2jw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lhv7afuyehymum852vy4.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s include all the remaining users. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JsimNsYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lvdaski5i5n376f8xvfs.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JsimNsYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lvdaski5i5n376f8xvfs.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally, let’s enable the feature for sensitive users &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--X_6tTdQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8g68tkioyurf128of8nw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--X_6tTdQf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/8g68tkioyurf128of8nw.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s worth noting, ConfigCat also allows for more than just boolean type comparisons. Navigate &lt;a href="https://configcat.com/docs/getting-started.html"&gt;here&lt;/a&gt; for more information on the Python SDK and other documentation. &lt;/p&gt;

</description>
      <category>featureflags</category>
      <category>deployment</category>
      <category>targeting</category>
    </item>
    <item>
      <title>Switches for future - feature flags in product development</title>
      <dc:creator>zsuzsi-kun</dc:creator>
      <pubDate>Thu, 05 Dec 2019 12:04:12 +0000</pubDate>
      <link>https://dev.to/configcat/switches-for-future-feature-flags-in-product-development-4pcj</link>
      <guid>https://dev.to/configcat/switches-for-future-feature-flags-in-product-development-4pcj</guid>
      <description>&lt;p&gt;&lt;strong&gt;How using feature flags makes your product development successful and safe&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By the given example you can follow the process from idea to satisfied customers&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Software (or even hardware) development could be a real challenge. Not just because it needs all your attention and a lot of time to do but you cannot be sure (even if you made research on the market) that your customers would like the new feature or product.&lt;/p&gt;

&lt;p&gt;That is the reason why product development is not just a part of a job, but it is an independent work. It needs specialists, managers, tactics, and tools too. Having a good idea is far too little to give off the perfect software product - you are going to need the best people and the best tools for that.&lt;/p&gt;

&lt;p&gt;But what if you have a really good idea and all the needed people and tools to start? On the stage of development, you have only a short period of time and you do not have too many chances: we can say that you have only one. Thus, you are going to need not just the previously mentioned people, tools and methods but some sector-specific solutions are indispensable too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature flags for software development are like prototypes and tests for mechanical engineering.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This special toolset given by feature flags could guarantee a light and less risky process. To show you how it works and how can you implement it in your development process we give you an example. So have a cup of tea, let's enjoy the ride and get familiarized with the world of feature flags by using a smart interface developed by &lt;a href="https://configcat.com/" rel="noopener noreferrer"&gt;ConfigCat&lt;/a&gt;'s team!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What is a feature flag? How can it be used for targeting?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Feature flags are like small switches in your code. They can be used to start or switch off given functions - in this way they can be used to control which users are able to see or use a specific option, feature or program part. Using of feature flags can make much easier the testing process since you can choose your target audience by a switch - you do not need any complicated choosing methods or rewrite the code by each testing step.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From a problem to an idea and just one more step to the solution.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A feature for university student which makes the planning and applying on a course easier.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Neptun unified education system is a web-based administrative interface that can be used by not just the administrative body of a university, but it is open for tutors, teachers, and students too. The system is made for all the administrative tasks since the registration at the beginning of a semester to logging into any classes.&lt;/p&gt;

&lt;p&gt;A few years ago, a new feature appeared in the system: the schedule (or timetable) planner. This function enables the users to see the preferred classes in a table - as they have registered to these courses, but it is just a plan for the semester. This feature makes easier the process of applying for the selected courses too. Now we are going to see how we can manage the introduction of a new feature like this.&lt;/p&gt;

&lt;p&gt;In this article, we are presenting this process by using ConfigCat but this is not the only tool to use in a case like this, you can manage it with another feature flag tool too. For example, you can use the product of &lt;a href="https://www.unleash-hosted.com/" rel="noopener noreferrer"&gt;Unleash&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. step: Idea and development&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since this is a part of the software like any other function, the team must develop it. After writing the codes and finalize the first version, the testing process can be started.&lt;/p&gt;

&lt;p&gt;Get familiarized with feature flags at this point. Using ConfigCat you can easily create switches for specified groups. These groups could be your testers or the small circle you do not want to show the latest release of your function. It is up to you, but without feature flags, the testing and implementation is a way more complicated process. Connect ConfigCat to your written code and let's start the testing!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. step: Choosing the right audience for the first test&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As you can feel, this is not a change you can easily build in the code and let rock. Minor changes must be tested - so one bigger like the scheduler must be too. And this is the point where feature flags step on the stage.&lt;/p&gt;

&lt;p&gt;After you build the code in the program or a parallel test version of your program, you can implement some feature flags. First, let's chose the developer team - they can easily notice all the smaller issues at first sight.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzo51lnr4s7479f80gzal.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzo51lnr4s7479f80gzal.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Fig. 1: Feature flag for the first tester group: developers&lt;/p&gt;

&lt;p&gt;ConfigCat's intuitive interface lets you develop feature flags based on the role of the users or any other identification attributes like beta testers, age group - the borderline is given by the collected data from the users.&lt;/p&gt;

&lt;p&gt;Here I would like to mention that this is one of the good reasons why you should collect all the needed and important data from your registered users. There are some data you do not have to ask for (e.g. country, used platform, browser) since they are accessible by using cookies or simply log in to the app. But other parameters like age, sex, or program they are enrolled should be asked for.&lt;/p&gt;

&lt;p&gt;Well, now we have chosen the group of the developer teams. This targeting strategy works well if we did give attention to tagging the people using our software. (No, it is not a waste of time, as you can see!)&lt;/p&gt;

&lt;p&gt;After they accepted the changes and did not find any major issues, the testers' range could be widened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Giving access to more and more users&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can continue the testing process step-by-step. After giving access to your developers, you can find beta testers and your friendly users. (Friendly is a tag you can give to your user based on his or her activity and mindset.)&lt;/p&gt;

&lt;p&gt;In ConfigCat, you can manage these flags as you can see on Fig. 2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fu16p3s1gzfnncf25s7l2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fu16p3s1gzfnncf25s7l2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Fig. 2: Managing different feature flags in ConfigCat&lt;/p&gt;

&lt;p&gt;You can even merge some lines by using the same attribute but different identification:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fld1g2rlfliilfprtwtyv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fld1g2rlfliilfprtwtyv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Fig. 3: Merging identifications&lt;/p&gt;

&lt;p&gt;In case of the scheduler in Neptun we can say that the beta tester group can be selected from the volunteering testers or by random. The friendly ones are users who have given some feedback before. Since we need a lot of feedback now, it is not a negligible aspect and we can use their opinion later in the public release process for marketing purposes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Start the test process on a selected faculty&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Like Facebook does with countries, we can implement new features by faculty to faculty. In this example, we have chosen GPK (Faculty of Mechanical Engineering) and have made the new function available for students on this faculty.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftgor4fyw3opytsgq7jg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ftgor4fyw3opytsgq7jg3.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Fig. 4: Giving access to students of GPK in ConfigCat&lt;/p&gt;

&lt;p&gt;As you can see on Fig. 4. students of other faculties are not able to see this new feature. We can manage different testing periods by changing the accessibility and see which faculty is the most open for the new function.&lt;/p&gt;

&lt;p&gt;This method is like the technique used by bigger developer teams, like Facebook, etc. They usually test a new function in a selected country and after evaluating test results they make the decision if the new function could be implemented globally or should be eliminated from the codes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Start testing on the whole university&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After trying out the new function on a faculty we can start the 'global' tests. The function could be reachable for all university students.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6mt1jcoefrpur1pd5agt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6mt1jcoefrpur1pd5agt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Fig. 5: Giving access to all the faculties at the university&lt;/p&gt;

&lt;p&gt;In some cases, there could be a smaller group, the skeptics and you should be careful with them. They are the users are not open to new functions and features. Since they can be decision-makers you should evaluate the risks before you make the given feature available for them. They are sensitive to the changes and they notice all the minor problems too. Maybe you should make another global test before giving them the right to see the new development. You can lock them out by creating a category for them as you can see on Fig. 6.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpal29rcs7yf6xz2qz39l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpal29rcs7yf6xz2qz39l.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Fig. 6: Making unavailable a function for a specific group of users&lt;/p&gt;

&lt;p&gt;In case of Neptun we would lock out the 'older generation' as they are less open to the new features (in this case they are Ph.D. students and teachers).&lt;/p&gt;

&lt;p&gt;At the beginning of the testing process, we can choose only a few students from the university. In ConfigCat this can be done by making a target in %, as you can see on Fig. 7. The percentage of the users can be adjusted based on the feedback.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh44hiibiqj8j3642l237.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh44hiibiqj8j3642l237.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
Fig. 7: Selecting only 5% of the whole university and locking out the sensitive users&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Start the new feature as a built-in option and make it accessible to all users&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After made all the steps above you have finally arrived at the most exciting part of a development process: implementation. Now you can turn all your switches on - giving enough light to your work and its results.&lt;br&gt;
Now the sensitive decision-makers and the skeptics can try the new feature out. In case of Neptun we should finally make enabled the new features for the 'older generation' too.&lt;/p&gt;

&lt;p&gt;After giving green light to the new functions we would like to think that our work is done. But I can tell you, it is not true at all. In this century you must be eager to new development opportunities not just for getting on top of your sector but to remain competitive in it.&lt;/p&gt;

&lt;p&gt;ConfigCat can help you make your development process safe - but it cannot work instead of you. It is just a tool like feature flags are in the testing process. We are gladly helping you with not just our product but with our experience too.&lt;/p&gt;

&lt;p&gt;Try out ConfigCat on our website and please do not hesitate to contact us with any doubts of yours!&lt;/p&gt;

</description>
      <category>featureflags</category>
      <category>softwaretesting</category>
      <category>development</category>
      <category>casestudy</category>
    </item>
    <item>
      <title>Releasing new features to a small audience first using feature flags</title>
      <dc:creator>sige</dc:creator>
      <pubDate>Thu, 14 Nov 2019 14:10:12 +0000</pubDate>
      <link>https://dev.to/configcat/releasing-new-features-to-a-small-audience-first-using-feature-flags-4e5n</link>
      <guid>https://dev.to/configcat/releasing-new-features-to-a-small-audience-first-using-feature-flags-4e5n</guid>
      <description>&lt;p&gt;Do you have a product with a consistent user base and you are releasing &lt;strong&gt;new features&lt;/strong&gt;? Then you need to decide whether it’s enough to just test these features in- house. This decision is always tricky, because sometimes it really is useful to receive feedback from a wider audience without the risk of imposing the new feature on your more important or so-called “sensitive users” (major companies that were pleased with your facilities and services up to the present, and you cannot risk the collaboration with them).&lt;/p&gt;

&lt;p&gt;If you are facing this dilemma, &lt;a href="https://configcat.com" rel="noopener noreferrer"&gt;ConfigCat&lt;/a&gt;‘s feature flags for targeting might provide you with a solution.&lt;/p&gt;

&lt;p&gt;Let’s say you have a product like Instagram, and the company decided to add new poll-boxes, quiz types and options for embedding links in the stories while removing some of the older ones.&lt;/p&gt;

&lt;p&gt;Using feature flags you will have the opportunity to enable certain features to certain group of users. Let’s say you would like to enable a feature only for the users within your company or only to a small percentage of your users (maybe in one country only) before releasing it to the entire world. In addition, you might want to exclude big companies, like H&amp;amp;M or Victoria’s Secret until you have received the favourable feedback from your employees, “friendly users” and a small percentage of app-users or even users from a selected area (country).&lt;/p&gt;

&lt;p&gt;Even though in this article it’s exemplified with &lt;a href="https://configcat.com" rel="noopener noreferrer"&gt;ConfigCat&lt;/a&gt;, targeting works just fine with other feature flag tools as well — for example with &lt;a href="https://www.unleash-hosted.com" rel="noopener noreferrer"&gt;Unleash-hosted&lt;/a&gt;. The process of targeting special users goes down in the following way:&lt;/p&gt;

&lt;p&gt;First step: you need to enable the feature:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to access the Management Console&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Feature Flags &amp;amp; Settings&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;TARGET SPECIFIC USERS&lt;/strong&gt; after clicking the actions icon&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fafucpl8pnipkaje4gcis.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fafucpl8pnipkaje4gcis.jpeg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you turned on the feature flag, you will be able to target specific users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0iiulp7py57pif3o4crv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F0iiulp7py57pif3o4crv.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How does the targeting rule work?
&lt;/h3&gt;

&lt;p&gt;By adding a rule you can specify a group of your users whom a new feature will be enabled or a different value will be served. A rule consists of an &lt;strong&gt;Attribute&lt;/strong&gt; of a user in your application, a &lt;strong&gt;Comparison value&lt;/strong&gt; (e.g. a list of email addresses) and a &lt;strong&gt;Comparator&lt;/strong&gt;. &lt;a href="https://configcat.com" rel="noopener noreferrer"&gt;ConfigCat&lt;/a&gt; evaluates the targeting rule every time your application requires and decides what value to serve.&lt;/p&gt;

&lt;p&gt;A property of the user is considered as an &lt;strong&gt;attribute&lt;/strong&gt;, and it can vary between e-mail address, country, and identifier or custom (you can add highly specific attributes such as eye colour).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4lz7rmut2orl838vk2ec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F4lz7rmut2orl838vk2ec.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;comparison value&lt;/strong&gt; is any string, number or comma separated list to be compared with the selected attribute using the &lt;strong&gt;comparator&lt;/strong&gt;. It can be a list of e-mail addresses, companies or users in a specific country.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;comparator&lt;/strong&gt; has four different setting options and it marks the selection of the users with a specific attribute from the list (comparison value).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fp8cxa3yi5c6dyxka6tbs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fp8cxa3yi5c6dyxka6tbs.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzgeantwef41hztoj3gqi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fzgeantwef41hztoj3gqi.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The term &lt;strong&gt;‘served value’&lt;/strong&gt; mentioned before refers to the exact value that will be served to the users that fall into that fraction. Depending on the kind of your setting this could be:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F12s93x592fftfqkcoj9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F12s93x592fftfqkcoj9e.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In our example the On/Off Toggle is relevant because that is the usual state of a feature flag, but &lt;a href="https://configcat.com" rel="noopener noreferrer"&gt;ConfigCat&lt;/a&gt; offers a range of different setting kinds and types.&lt;/p&gt;

&lt;p&gt;You actually have multiple options in choosing the served value of the feature flag, for example, it can be the On/Off Toggle presented above (note: here the number of options must be 2), but if you decide to use Text and/or Number the maximum number of your options entirely depends on your subscription plan. You can add/remove options by clicking the Actions icon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkbjtctnv0sm08ztw4cp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkbjtctnv0sm08ztw4cp0.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’ve enabled your feature for the list of your employees for instance, you can add multiple targeting rules and ordering by clicking on the Actions icon; thus you can create more complex rule sets.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rule sets are evaluated one by one, &lt;strong&gt;from top to bottom direction&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Change the order of targeting rules by &lt;strong&gt;drag n’ drop&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Example&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Enable a feature only to users within your company except the PR team (Connor and Natasha) by adding two targeting rules:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxfj4jpeddcpy2g2nxxmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxfj4jpeddcpy2g2nxxmx.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To all other uses serve: OFF&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsawqu4lrbh2yiagfeopd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fsawqu4lrbh2yiagfeopd.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This value will be served as a fall-back if none of the above rules apply or a User Object was not passed to the &lt;a href="https://configcat.com/docs/sdk-reference/overview" rel="noopener noreferrer"&gt;ConfigCat&lt;/a&gt; correctly within your application.&lt;/p&gt;

&lt;p&gt;You can also target a &lt;strong&gt;percentage of users&lt;/strong&gt;. If you enable a new feature on a platform like Instagram, you might want to be granted public feedback by including a randomly selected fraction of your users whom a feature will be enabled, or a different value will be served. The sum of all % values must be equal to 100.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;TARGET % OF USERS&lt;/strong&gt; after clicking the actions icon.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffyr6ux9mlga2ux29swut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Ffyr6ux9mlga2ux29swut.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To sum up, targeting can prove to be great help in &lt;strong&gt;experimenting with new features&lt;/strong&gt; while offering you and your company a risk-free path to gather feedback from the targeted users. Feature flags provide you with &lt;strong&gt;a safe environment&lt;/strong&gt; with the option of changing your mind.&lt;/p&gt;

</description>
      <category>featureflags</category>
      <category>deployment</category>
      <category>targeting</category>
      <category>segmentation</category>
    </item>
    <item>
      <title>I am a happy SaaS developer. Here are my values, focus, and tools.</title>
      <dc:creator>david-zoltan</dc:creator>
      <pubDate>Thu, 10 Oct 2019 12:10:01 +0000</pubDate>
      <link>https://dev.to/configcat/i-am-a-happy-saas-developer-here-is-who-i-focus-on-what-i-value-and-what-i-use-on-a-daily-basis-2ob2</link>
      <guid>https://dev.to/configcat/i-am-a-happy-saas-developer-here-is-who-i-focus-on-what-i-value-and-what-i-use-on-a-daily-basis-2ob2</guid>
      <description>&lt;p&gt;There is this layer of abstraction where you create code. Above that is where you determine how to organize it. And above that, where you decide what real-world problems you want to solve.&lt;/p&gt;

&lt;p&gt;Often, we think we want to solve the problems of our users. But how often do you stop to think about who your users are? And here I don't mean "do you have user personas?" and things like that. I mean, who are your stakeholders? Who do you want to make happy? &lt;/p&gt;

&lt;h2&gt;
  
  
  The most important person is...
&lt;/h2&gt;

&lt;p&gt;Chances are high that your most important stakeholder is yourself. And any software you create should make you happy. You'll use the software that you created to make yourself happy in a way that's special to you. Maybe you take pride in creating cool stuff (I do). Or you want to be dirty rich (I do). Or you love the feeling of helping other people (well, it depends on who those people are, but mostly I do).&lt;/p&gt;

&lt;h2&gt;
  
  
  Pride, Money, and Helping others
&lt;/h2&gt;

&lt;p&gt;Can you make other people happy if your software crashes? Maybe. Can you take pride in software that crashes without you knowing about it? Hell, no!&lt;/p&gt;

&lt;p&gt;Can you help your users without knowing what they do? I doubt. Would you be proud to see thousands or millions of people using your software? Sure!&lt;/p&gt;

&lt;p&gt;Can you save face without the ability to hide bugs quickly? Do you feel safe without control over how your software works? I don't. Would you be proud if 99% of people would perceive your software as bugfree, stable, and easy to use? I would! And I would make a lot of money out of it!&lt;/p&gt;

&lt;h2&gt;
  
  
  3 key abilities every happy software business has
&lt;/h2&gt;

&lt;p&gt;You see the patterns here? It's hard to create software that will make you become rich, feel proud, and will help other people unless you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;are notified as soon problems or bugs pop up&lt;/li&gt;
&lt;li&gt;can observe how your users use your software&lt;/li&gt;
&lt;li&gt;can hide buggy features or roll back to previous stable versions quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the other hand, the whole thing gets easy after you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;see all remote errors right after they appear&lt;/li&gt;
&lt;li&gt;can see what your user see and where they click&lt;/li&gt;
&lt;li&gt;alter/reconfigure how your software works instantaneously &lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3 SaaSs that make me happier, secure my business, and help my users
&lt;/h2&gt;

&lt;p&gt;This section sounds like an advertisement, right? Well, this is a short list of services that provide me the key abilities of seeing bugs, understanding users, and remote controlling my software.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sentry.io
&lt;/h3&gt;

&lt;p&gt;This is the one that shows me bugs. (Disclaimer: I'm not working for Sentry. I use their service and love it.)&lt;/p&gt;

&lt;p&gt;Their service has helped two of my companies creating much better software. &lt;a href="https://sentry.io"&gt;Sentry&lt;/a&gt; collects all the exceptions and other errors from my software components and shows them in an organized, easy to oversee way. I can find not only the exceptions but the stack traces and other context data there. Sentry.io has helped me to kill 99% of my bugs in hours. And it takes only a few minutes to set it up. Their integrations (SDKs) have sensible default behavior and require almost zero configuration in my end.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smartlook.com
&lt;/h3&gt;

&lt;p&gt;This is the one that shows me what my users do. (Disclaimer: I'm not working for Smartlook. But again, I make great use of their service.)&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://smartlook.com"&gt;Smartlook&lt;/a&gt; guys allow me to watch what my website visitors do, just if I were looking directly at their screen. Smartlook creates recordings of users' actions and shows me those recordings. It does this in a GDPR compliant way, by masking out all sensitive data and storing the recordings for a short amount of time.&lt;/p&gt;

&lt;h3&gt;
  
  
  ConfigCat.com
&lt;/h3&gt;

&lt;p&gt;This is the one that helps me remotely control my other software products. (Disclaimer: I created this service. And I love it too.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://configcat.com"&gt;ConfigCat&lt;/a&gt; allows you to create visual dashboards (it's a webpage behind a unique URL, guarded by login/password, or SSO) where you can control and reconfigure how your software works - the software you build for your users and to make yourself happy.&lt;/p&gt;

&lt;p&gt;You can add feature flags, targeting rules, and traditional configuration settings to those dashboards. Then you can integrate that dashboard into your software through the &lt;a href="https://configcat.com/docs/sdk-reference/overview/"&gt;ConfigCat SDKs&lt;/a&gt; in a few minutes.&lt;/p&gt;

&lt;p&gt;What you get at the end of the day is a loosely coupled way to do canary releases, phased rollouts, sit on the feature flag hype train + the ability to change your software's configuration values through the ConfigCat dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus track about ❤️
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I guess she's got her reasons.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=CsrfovOPcjk"&gt;https://www.youtube.com/watch?v=CsrfovOPcjk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For those who lost the feeling of their own importance while they were creating software for others (me included). And for those left by their girlfriends while they were creating software for others (me and my ex included).&lt;/p&gt;

</description>
      <category>startup</category>
      <category>career</category>
      <category>productivity</category>
      <category>devlive</category>
    </item>
    <item>
      <title>How do you recruit for user tests?</title>
      <dc:creator>sige</dc:creator>
      <pubDate>Mon, 09 Sep 2019 10:22:50 +0000</pubDate>
      <link>https://dev.to/configcat/how-do-you-recruit-for-user-tests-mc6</link>
      <guid>https://dev.to/configcat/how-do-you-recruit-for-user-tests-mc6</guid>
      <description>&lt;p&gt;I feel I got lost in the maze of Google searches filled with advertisers and self marketing articles. Seems quite hard to find authentic information about user testing.&lt;/p&gt;

&lt;p&gt;Where do you guys usually recruit subjects for user tests?&lt;/p&gt;

&lt;p&gt;I'd like to test my service on 3-5 software developers with a few years of experience. I believe my needs aren't that extraordinary.&lt;/p&gt;

&lt;p&gt;Do you guys offer money or a subscription to your service in return?&lt;/p&gt;

&lt;p&gt;Thanks for the help. I'm a little clueless here.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>testing</category>
      <category>usertest</category>
      <category>startup</category>
    </item>
    <item>
      <title>Playing around on CodePen I have created a simple HTML page with dynamically updating content based on feature flags</title>
      <dc:creator>sige</dc:creator>
      <pubDate>Sun, 08 Sep 2019 23:51:17 +0000</pubDate>
      <link>https://dev.to/configcat/playing-around-on-codepen-i-have-created-a-simple-html-page-with-dynamically-updating-content-based-on-feature-flags-4596</link>
      <guid>https://dev.to/configcat/playing-around-on-codepen-i-have-created-a-simple-html-page-with-dynamically-updating-content-based-on-feature-flags-4596</guid>
      <description>&lt;p&gt;This Pen demonstrates how to update a page content dynamically using ConfigCat feature flags.&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/configcat/embed/pozaLLV?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>codepen</category>
    </item>
    <item>
      <title>Complete guide to build a Slack Chatbot in 7 minutes and host it for free</title>
      <dc:creator>sige</dc:creator>
      <pubDate>Fri, 06 Sep 2019 22:27:35 +0000</pubDate>
      <link>https://dev.to/configcat/complete-guide-to-build-a-slack-chatbot-in-7-minutes-and-host-it-for-free-1ef8</link>
      <guid>https://dev.to/configcat/complete-guide-to-build-a-slack-chatbot-in-7-minutes-and-host-it-for-free-1ef8</guid>
      <description>&lt;h4&gt;
  
  
  Based on GitHub's Hubot. Connected to Slack. Deployed to Heroku.
&lt;/h4&gt;

&lt;p&gt;I have a thing for robots and wanted to build a chatbot as an experiment that calls my service's (&lt;a href="https://configcat.com" rel="noopener noreferrer"&gt;ConfigCat.com&lt;/a&gt;) &lt;code&gt;\health&lt;/code&gt; endpoint and returns if everything is okay. It took me quite a long time to go trough the possible frameworks and docs, read all the outdated guides to find the quickest and cheapest way. I feel like it might worth sharing.&lt;/p&gt;

&lt;p&gt;The tools needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nodejs.org" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://slack.com" rel="noopener noreferrer"&gt;Slack&lt;/a&gt; workspace&lt;/li&gt;
&lt;li&gt;Free &lt;a href="https://www.heroku.com" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt; account&lt;/li&gt;
&lt;li&gt;Preferred code editor&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Adding Hubot integration to your Slack Workspace
&lt;/h1&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://configcat.slack.com/apps/A0F7XDU93-hubot" rel="noopener noreferrer"&gt;Find Hubot in Slack App Directory&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Connect to Workspace
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fr8exqwybhdhjp97o4tdd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fr8exqwybhdhjp97o4tdd.png" alt="connect"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh017kdh2gbilt2mdr7ce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh017kdh2gbilt2mdr7ce.png" alt="name"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Take a note of the API Token, you'll need it later
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnffhcil1vwn6y8kqxcw4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnffhcil1vwn6y8kqxcw4.png" alt="token"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Running Hubot on local machine
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Install &lt;a href="https://yeoman.io" rel="noopener noreferrer"&gt;Yeoman&lt;/a&gt; and Hubot generator
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; yo generator-hubot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Scaffold a Hubot project
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;catbot
&lt;span class="nb"&gt;cd &lt;/span&gt;catbot
yo hubot &lt;span class="nt"&gt;--adapter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;slack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Start Hubot using API Token
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;HUBOT_SLACK_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xoxb-271695489427-739714865891-Z5gPPiuTORKDFO4QvqKe1B9y ./bin/hubot &lt;span class="nt"&gt;--adapter&lt;/span&gt; slack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Open Slack and start a conversation
&lt;/h4&gt;

&lt;p&gt;The chatbot should be available under Apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fc2zaw1hll2e8oaktq0k7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fc2zaw1hll2e8oaktq0k7.png" alt="slack"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Test with &lt;code&gt;help&lt;/code&gt; command
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxkl1ynoanx7xm1ujt868.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxkl1ynoanx7xm1ujt868.png" alt="help"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Recognizing &lt;code&gt;health&lt;/code&gt; command
&lt;/h1&gt;

&lt;p&gt;And make a HTTP GET call to ConfigCat's &lt;code&gt;/health&lt;/code&gt; endpoint and reply back the results via Slack. &lt;/p&gt;

&lt;p&gt;I created a &lt;code&gt;configcat.coffee&lt;/code&gt; under &lt;code&gt;/scripts&lt;/code&gt; folder with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight coffeescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;robot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;robot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hear&lt;/span&gt; &lt;span class="sr"&gt;/health/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;robot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"https://api.configcat.com/api/v1/health"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://github.com/configcat/catbot-example" rel="noopener noreferrer"&gt;See the complete source code on GitHub.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used CoffeeScript because I like to experiment and it feels fancy. But you can use JavaScript as well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Test if the &lt;code&gt;health&lt;/code&gt; check works
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fds4y7wnsch93v4brictp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fds4y7wnsch93v4brictp.png" alt="health"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Deploying to Heroku
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Check Node.js version
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;package.json&lt;/code&gt; and check Node.js version. In my case the generated &lt;code&gt;package.json&lt;/code&gt; was &lt;code&gt;"node": "0.10.x"&lt;/code&gt; so I changed it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"engines"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.16"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Git commit
&lt;/h4&gt;

&lt;p&gt;Make sure you’ve created a git repository, and that your work is committed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Heroku CLI
&lt;/h4&gt;

&lt;p&gt;Install the &lt;a href="https://devcenter.heroku.com/articles/heroku-cli" rel="noopener noreferrer"&gt;Heroku CLI.&lt;/a&gt; then log in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;heroku create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set environment variable for API Token.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;heroku config:set &lt;span class="nv"&gt;HUBOT_SLACK_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;xoxb-271695489427-739714865891-Z5gPPiuTORKDFO4QvqKe1B9yt &lt;span class="nt"&gt;--app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;arcane-dusk-29327
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Git push
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push heroku master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Avoiding sleep mode
&lt;/h1&gt;

&lt;p&gt;Since I'm using Heroku's free plan, the app will eventually go to sleep mode. To avoid that add &lt;a href="https://www.npmjs.com/package/hubot-heroku-keepalive" rel="noopener noreferrer"&gt;hubot-eroku-keepalive&lt;/a&gt; script to your chatbot.&lt;/p&gt;

&lt;h1&gt;
  
  
  Reference docs
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hubot.github.com/docs/" rel="noopener noreferrer"&gt;Hubot Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.dev/hubot-slack/" rel="noopener noreferrer"&gt;Slack Developer Kit for Hubot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devcenter.heroku.com/categories/deployment" rel="noopener noreferrer"&gt;Heroku Deployment&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>chatbot</category>
      <category>devops</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Lazy man's guide: multiple GitHub HTTPS accounts on Windows</title>
      <dc:creator>david-zoltan</dc:creator>
      <pubDate>Sat, 10 Aug 2019 10:02:03 +0000</pubDate>
      <link>https://dev.to/configcat/lazy-man-s-guide-multiple-github-https-accounts-on-windows-2mad</link>
      <guid>https://dev.to/configcat/lazy-man-s-guide-multiple-github-https-accounts-on-windows-2mad</guid>
      <description>&lt;p&gt;Using multiple GitHub account's on Windows sucks by default. If you are tired of  Window's Credential Manager storing only one account's credential for git:&lt;a href="https://github.com" rel="noopener noreferrer"&gt;https://github.com&lt;/a&gt; then here is a 1-minute fix for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If you know what you're doing just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;delete your GitHub credentials from Windows Credential Manager&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;git config --global credential.github.com.useHttpPath true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;continue coding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need more detailed instructions and learn about the background just read on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full story
&lt;/h2&gt;

&lt;p&gt;I'm juggling with multiple GitHub repos on a daily basis. They all require different credentials. It's not only the repos of ConfigCat, my &lt;a href="https://configcat.com" rel="noopener noreferrer"&gt;feature flag service&lt;/a&gt; (a great LaunchDarkly alternative "by the way") but my other projects too. If you're a developer at heart, I'm sure you know what I'm talking about. I never really liked how the credential manager on Windows stores one single GitHub account for all my repos by default.&lt;/p&gt;

&lt;p&gt;Just came through &lt;a class="mentioned-user" href="https://dev.to/arnellebalane"&gt;@arnellebalane&lt;/a&gt;'s great post about &lt;a href="https://dev.to/arnellebalane/setting-up-multiple-github-accounts-the-nicer-way-1m5m"&gt;setting up multiple GitHub accounts the nice way&lt;/a&gt;. His solution is based on SSH keys and is pretty thorough.&lt;/p&gt;

&lt;p&gt;While I would never publicly admit that I'm lazy, I happen to know a quick and dirty solution here. I decided to share the "lazy man's guide" to set up multiple GitHub accounts on Windows. While &lt;a class="mentioned-user" href="https://dev.to/arnellebalane"&gt;@arnellebalane&lt;/a&gt;'s solution is really nice, you might be interested in a more basic approach...&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem
&lt;/h3&gt;

&lt;p&gt;If you're using Windows Credential Manager to store your username/password for your GitHub account, and you have to work with different GitHub accounts for different projects, then I'm sure you've already experienced&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fatal: Authentication failed for https://www.github.com/name/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usually, this happens when you try to push to &lt;em&gt;one&lt;/em&gt; of your repositories in the name of &lt;em&gt;another account&lt;/em&gt; that is for your &lt;em&gt;other&lt;/em&gt; project.&lt;/p&gt;

&lt;p&gt;The root problem is that Windows Credential stores the one same account for all your GitHub repositories.&lt;/p&gt;

&lt;h3&gt;
  
  
  The solution
&lt;/h3&gt;

&lt;p&gt;There is a simple, three steps solution that will help you store multiple different GitHub accounts, one for each of your GitHub repos.&lt;/p&gt;

&lt;p&gt;Simple 3 step solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;remove your current GitHub credentials from Windows Credential Manager&lt;/li&gt;
&lt;li&gt;tell Windows to store different accounts for each of your GitHub repos&lt;/li&gt;
&lt;li&gt;provide your username, password once again for each repo when you are prompted for your credentials - this is the last time you need to do that&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Removing current GitHub credentials from Windows Credential Manager
&lt;/h4&gt;

&lt;p&gt;Go to &lt;code&gt;Windows Credential Manager&lt;/code&gt;, open the &lt;code&gt;Windows Credentials&lt;/code&gt; tab, locate &lt;code&gt;git:https://github.com&lt;/code&gt;, open the entry, and click &lt;code&gt;Remove&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3xrbl69zb6tzlq9fdcvv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F3xrbl69zb6tzlq9fdcvv.png" alt="Windows Credential Manager"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will remove your GitHub credentials from the credential manager.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tell Windows to store different accounts for different repos
&lt;/h4&gt;

&lt;p&gt;Issue the following git command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git config --global credential.github.com.useHttpPath true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, Windows will store different logins for each of your GitHub repos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Reauthenticate
&lt;/h4&gt;

&lt;p&gt;Just work on your project. Whenever GitHub asks you for your credentials, just type your username and password. Windows will store them and you never ever have to provide them again for this repo.&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>https</category>
      <category>windows</category>
    </item>
  </channel>
</rss>
