<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[My journey in the dev world]]></title><description><![CDATA[My journey in the dev world]]></description><link>https://blog.mfrachet.com</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 08:17:54 GMT</lastBuildDate><atom:link href="https://blog.mfrachet.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why Progressively? Decoupling
your features & your code releases]]></title><description><![CDATA[It's been around 10 years that I'm building applications, and I used to get frustrated by not being able to move as fast as I wanted regarding deploying code that I write daily.
Having worked using old-school workflows like Gitflow or feature branche...]]></description><link>https://blog.mfrachet.com/why-progressively-decoupling-your-features-your-code-releases</link><guid isPermaLink="true">https://blog.mfrachet.com/why-progressively-decoupling-your-features-your-code-releases</guid><category><![CDATA[  feature flags]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[React]]></category><category><![CDATA[Feature Management]]></category><dc:creator><![CDATA[Marvin Frachet]]></dc:creator><pubDate>Wed, 16 Aug 2023 15:12:39 GMT</pubDate><content:encoded><![CDATA[<p>It's been around 10 years that I'm building applications, and I used to get frustrated by not being able to move as fast as I wanted regarding deploying code that I write daily.</p>
<p>Having worked using old-school workflows like Gitflow or feature branches, it happened that sometimes, the code I wrote was finally visible to the end user months after the fact.</p>
<p>At some points, the following questions started to haunt me:</p>
<ul>
<li><p>"How long does it take to see your code changes in production"?</p>
</li>
<li><p>"How fast can you get feedback from the users"?</p>
</li>
<li><p>"How fast can you revert changes when a critical bug occurs"?<br />  And the list goes on.</p>
</li>
</ul>
<p>So what could I do to improve the situation and not feel frustrated continuously?</p>
<p>The answer was: shifting workflow and using the right tool for the right job. By shifting from a "feature-based" approach to a more "code-based" approach, it became possible to deploy code multiple times a day. And this is the beauty: it's okay to deploy small pieces of code even if the associated feature is not finished yet.</p>
<p>We deploy code, but we release features. The idea is to deploy code many times until it finally creates a whole running feature.</p>
<blockquote>
<p>"But wait, how do you accept showing unfinished features to your users?!"</p>
</blockquote>
<p>You don't, you guard your unfinished feature with feature flags.</p>
<p>Using feature flags in a codebase is as simple as adding a conditional statement. For context, people have been using environment variables for this use case for years.</p>
<p>Let's think of it for a second: using environment variables means that when you want to deploy your feature, you need to rebuild it with the new environment variable value and to re-deploy it. Depending on your application it may take time.</p>
<p>What if instead, the value of the condition came from a remote service at runtime? It means that its value could change over time without the need for a whole build and deployment of the application.</p>
<p>Let's push this even further: since the condition is on a value that can change over time without re-deploying, it opens the door for a lot of great features:</p>
<ul>
<li><p>Rollout / Rollback at any moment</p>
</li>
<li><p>Time-based rollout (activate the feature at a given date)</p>
</li>
<li><p>Progressive rollout (only a % of the audience has access to the feature)</p>
</li>
<li><p>Field-based rollout (using email, id, etc..., practical to create Canary &amp; Beta user groups)</p>
</li>
<li><p>A/B testing (a feature flag can have multiple values and so)</p>
</li>
<li><p>A huge range of analytics and AI application for understanding the audience activity</p>
</li>
</ul>
<p>This is why <a target="_blank" href="https://progressively.app">Progressively</a> exists. Make sure to give it a try and give feedbacks :)</p>
]]></content:encoded></item><item><title><![CDATA[How to effectively setup E2E tests?]]></title><description><![CDATA[From my experience, people tend to think that E2E testing is hard, but in reality, the hardest thing is to make sure to have good foundations to effectively write tests and make them part of your continuous integration pipelines.
Whether you have an ...]]></description><link>https://blog.mfrachet.com/how-to-effectively-setup-e2e-tests</link><guid isPermaLink="true">https://blog.mfrachet.com/how-to-effectively-setup-e2e-tests</guid><category><![CDATA[Automated Testing]]></category><category><![CDATA[Testing]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Marvin Frachet]]></dc:creator><pubDate>Thu, 03 Aug 2023 13:11:41 GMT</pubDate><content:encoded><![CDATA[<p>From my experience, people tend to think that E2E testing is hard, but in reality, the hardest thing is to make sure to have good foundations to effectively write tests and make them part of your continuous integration pipelines.</p>
<p>Whether you have an already running application or you're about to start one, there is a bunch of things to accomplish before being fully operational.</p>
<p><em>This blog post will deal with databases and backend that you may not have if you run on static websites. However, most of the content will be applicable in your case anyways.</em></p>
<h2 id="heading-establish-good-foundations">Establish good foundations</h2>
<h3 id="heading-define-what-is-e2e-testing-as-a-team">Define what is E2E testing as a team</h3>
<p>Depending on your overall ecosystem, your team or your project, make sure that everybody has the same definition of E2E testing. I'm saying this because I've seen many people with their definitions of testing automation, but from one person to another, they differ drastically. Make sure everybody is on the same page before starting.</p>
<h3 id="heading-define-a-static-dataset">Define a static dataset</h3>
<p>This is probably the most important thing to keep in mind: for your tests to be deterministic, you will need to have a predefined set of data on which you can make expectations that will guarantee the same result.</p>
<p>You don't need an entire dataset, with all the relationships taken into account, nor try to create an exhaustive one for an app running on top of 2k SQL tables.</p>
<p>You don't need everything to be ready from the ground, start small, write your first meaningful tests and iterate from there.</p>
<p>If you have a complex application with multiple personas or different access rights, make sure to have predefined accounts for each of them.</p>
<h3 id="heading-create-shortcuts-for-seeding-andamp-resetting-the-databases">Create shortcuts for seeding &amp; resetting the database(s)</h3>
<p>Since you have a dataset that is ready to be used, make sure to create functions or custom commands that will put the dataset into the database, and also a command to erase the data from the database.</p>
<p>This will be practical to ensure a coherent state between your test runs.</p>
<p>One positive effect of these functions/commands is that if you have a newcomer in your team, they have a predefined set of users to play with.</p>
<h3 id="heading-create-shortcuts-for-authenticating-your-users">Create shortcuts for authenticating your users</h3>
<p>You are about to test your applications, and chances are that you will need to be authenticated to perform some actions.</p>
<p>I would highly recommend creating a dedicated function for this specific purpose: make sure it can accept a login, a password or whatever is required to authenticate your user.</p>
<p>Also, be aware that E2E tests take time since they require your whole stack to be started: if you can skip browsing the login page with your E2E test tool and directly get a token from your API with a fetch call, do it, it will speed up your tests run by a significant amount.</p>
<h2 id="heading-writing-meaningful-tests">Writing meaningful tests</h2>
<h3 id="heading-test-like-a-real-user-effectively">Test <s>like a real user </s> effectively</h3>
<p>People tend to think that E2E tests should test a whole functionality: I agree and disagree. It depends on the size and number of actions you have to make to perform a specific action, and also on the way you deal with the state of your application in your frontend (state by URL vs in-memory a-la <a target="_blank" href="https://redux.js.org/">Redux</a>, <a target="_blank" href="https://zustand-demo.pmnd.rs/">Zustand</a> and friends...).</p>
<p>I find E2E tests to shine when I focus on a given page instead of focusing on a whole feature itself for the following reasons:</p>
<ul>
<li><p>Easier file system organisation: 1 test file, 1 route</p>
</li>
<li><p>You don't test browser APIs (link navigating between pages with &lt;a&gt; tags for instance)</p>
</li>
<li><p>Less cognitive load, focus on the current page, the scope is clear</p>
</li>
<li><p>Easy to shoot accessibility tests per page</p>
</li>
</ul>
<p>It's opinionated, but this is the way I have most enjoyed these last 10 years.</p>
<h3 id="heading-test-everything-in-isolation">Test everything in isolation</h3>
<p>Make sure that you are in a consistent state between the different test runs. Be sure that your database has good data in good shape to make a meaningful assertion. If you don't pay too much attention, you might enter situations where your tests will be flaky and your expectations may fail sometimes, but pass other times.</p>
<p>One good rule of thumb is to seed and reset your database between tests.</p>
<p>At some point, you will face the problem that we all have had when writing E2E tests: they are slow. And you will feel the urge to not seed and reset your database on every test run. If this is the case, make sure that you test behaviours that can't collide.</p>
<h3 id="heading-keep-tests-simple">Keep tests simple</h3>
<p>The easier it is to read, the easier it is to debug. If a new person joins your team, they should be able to jump on the train without friction.</p>
<p>Keep in mind that for many people, E2E tests are hard. Don't over-abstract, or create unnecessary function indirections for the sake of smartness, keep things simple and scalable. Duplicating code is fine, your colleagues will thank you.</p>
<h3 id="heading-query-your-elements-by-their-role">Query your elements by their role</h3>
<p>When writing E2E tests, you make DOM queries to select specific elements and you make assertions on them. For example, you can verify that the title is well set, that when you press that specific button the counter increments etc.</p>
<p>There are debates on how you should query elements on which you want to perform actions or assertions (query by id, by text etc...): my go-to would be to query the element by its <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles">role</a> + its content. The positive effect of that is that even if you don't have experience with accessibility, you are already one foot in by making sure you are clicking on a "button" and not a "div" (please, stop putting click events on divs).</p>
<h2 id="heading-make-them-part-of-your-workflow">Make them part of your workflow</h2>
<h3 id="heading-setup-your-ci">Setup your CI</h3>
<p>Remember that an E2E test is about spawning your whole application, from one end to the other. You have to start the database(s), the frontend(s) and the backend(s).</p>
<p><em>If you use Github Actions, I have an example for</em> <a target="_blank" href="https://progressively.app"><em>https://progressively.app</em></a> <em>in</em> <a target="_blank" href="https://github.com/progressively-crew/progressively/blob/master/.github/workflows/e2e.yml#L24"><em>this file</em></a><em>.</em></p>
<p>Once everything is setup, you can effectively start your E2E tool and play the tests in headless mode.</p>
<h3 id="heading-dealing-with-speed-issues">Dealing with speed issues</h3>
<p>You will face speed issues when running E2E tests in your CI. The first reason is the setup part: you need everything to be up and running and it takes time.</p>
<p>The second reason is that you need <strong>your tests to run sequentially on a given machine.</strong> You can't parallelize E2E tests on one machine: if you do that, you will encounter an inconsistent state because your data stored in the databases will not be what you were expecting. What if one test tries to assert while the other is currently resetting the database? The test can't pass.</p>
<p>One way to solve this is to run your E2E tests on multiple machines. Group your tests by running speed (don't put two long-running suites in the same group) and spawn your whole environment multiple times on multiple machines. For instance, instead of running only against 1 database, you can now run against 4, seed and reset them independently.</p>
<p><em>If using Github actions, you can tweak</em> <a target="_blank" href="https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs"><em>the `matrix` option</em></a> <em>to achieve this.</em></p>
]]></content:encoded></item><item><title><![CDATA[A/B testing with the JAMstack]]></title><description><![CDATA[The JAMstack has been talked about in recent years as a way to create static websites that scale very well in many different ways. Since it becomes more and more mainstream, it made sense to people to think about how to apply older patterns that we l...]]></description><link>https://blog.mfrachet.com/ab-testing-with-the-jamstack</link><guid isPermaLink="true">https://blog.mfrachet.com/ab-testing-with-the-jamstack</guid><category><![CDATA[JAMstack]]></category><category><![CDATA[React]]></category><category><![CDATA[ab testing]]></category><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Marvin Frachet]]></dc:creator><pubDate>Tue, 01 Aug 2023 14:58:37 GMT</pubDate><content:encoded><![CDATA[<p>The JAMstack has been talked about in recent years as a way to create static websites that scale very well in many different ways. Since it becomes more and more mainstream, it made sense to people to think about how to apply older patterns that we like in this quite particular context.</p>
<p>In this post, I will share with you <strong>my vision</strong> of A/B testing (or feature flagging, everything written below may apply to both) using the JAMstack.</p>
<h2 id="heading-but-first-why-do-we-use-the-jamstack">But first, why do we use the JAMstack?</h2>
<p>According to <a target="_blank" href="http://jamstack.org">jamstack.org</a>, we use it because:</p>
<ul>
<li><p>it's about building <strong>simple static pages</strong> (HTML files)</p>
</li>
<li><p>most of the job is made at build-time, no potential leak at runtime, it's more <strong>secure</strong></p>
</li>
<li><p>static pages are HTML files and thus <strong>load very fast</strong></p>
</li>
<li><p>we benefit from <strong>cheap hosting</strong> (putting files on a server and there we go)</p>
</li>
<li><p>it's <strong>highly scalable</strong>, just put the files on another machine and scaling is done</p>
</li>
<li><p>it already exists great tools to create amazing sites (<a target="_blank" href="https://www.gatsbyjs.com/">Gatsbyjs</a>, <a target="_blank" href="https://nextjs.org/">Nextjs</a>, <a target="_blank" href="https://www.11ty.dev/">11ty</a>, <a target="_blank" href="https://jamstack.org/generators/">etc...</a>)</p>
</li>
</ul>
<h2 id="heading-why-do-we-use-ab-testing">Why do we use A/B testing?</h2>
<p>People use A/B testing to measure which variant of a website is more appreciated by their users. The idea is simply to provide different visual representations of some data and check which one attracts more people.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1690901653681/9f2af99d-5297-4891-8a83-9239012e8b17.png" alt="Visual representation of two different variants of an A/B tests" class="image--center mx-auto" /></p>
<p>If the visitors of variant A come more often than the visitors of variant B, then we can assume that variant A is a more viable solution to represent the data on the page.</p>
<h2 id="heading-how-do-we-use-ab-testing-in-non-jamstack-applications">How do we use A/B testing in non-JAMstack applications?</h2>
<p>In applications that are not built on top of the JAMstack, the idea is quite straightforward.</p>
<p>When opening the application, it will request a remote server to get the different available variants. Then, based on some conditions in the codebase, we can display the good variant to the good user.</p>
<p>The following is an example of a client-side A/B test written with <a target="_blank" href="https://reactjs.org/">Reactjs</a>:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">const</span> { variant, isLoading } = useABVariant();

  <span class="hljs-keyword">if</span> (isLoading) {
    <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Preparing the application...<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span></span>;
  }

  <span class="hljs-keyword">if</span> (variant === <span class="hljs-string">"A"</span>) {
    <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>Here's the A variant!<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>;
  }

  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>Here's the B variant!<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>;
};
</code></pre>
<p>As we see in the snippet, the code is executed in the user's browser. Also, notice <strong>the loading information while the request is pending</strong> before being able to display the variant content.</p>
<p>The following is a tiny sandbox allowing to switch on and off a feature flag to display a new variant of a homepage. When using services like <a target="_blank" href="https://launchdarkly.com/">LaunchDarkly</a>, this is exactly the kind of actions you're provided with.</p>
<h2 id="heading-why-ab-testing-on-the-jamstack-is-different">Why A/B testing on the JAMstack is different?</h2>
<p>Remember one of the main arguments for building on top of the JAMstack is <strong>fast page loading</strong> (performance).</p>
<p>When dealing with A/B tests the "standard way", <strong>we need to make an HTTP request to get the different variants</strong>. Making an HTTP request means that <strong>there is a delay</strong> between the moment we ask for the variants and the moment we get them back from the server.</p>
<p>The problem is that <strong>making the HTTP request is so critical</strong> that we can't show anything else than loading information to the user before resolving the variants and being able to show them the good content.</p>
<p><strong>In a static environment, we are waiting for dynamic information to display meaningful information.</strong></p>
<p>When A/B testing the "standard way", using runtime information will <strong>make the application performance worse by increasing the time for displaying the first meaningful content</strong>. Loading static pages should be "instant" but relying on an HTTP request and an intermediate loading state before displaying the content will take extra time and decrease the experience.</p>
<p>In some scenarios, <a target="_blank" href="https://developers.google.com/web/tools/lighthouse">Lighthouse</a> performance score can drop by around <code>25</code> points (up to you to determine if it's significant or not).</p>
<p>Also note that some tools helping build applications using the JAMstack <strong>don't even run JavaScript at all</strong>, meaning that it's not possible to rely on HTTP requests to access remote data at runtime.</p>
<h2 id="heading-how-to-make-ab-testing-in-a-jamstack-fashion">How to make A/B testing in a JAMstack fashion?</h2>
<p>The JAMstack is about <strong>building static pages</strong>. Taking this notion to the extreme, we can imagine creating a dedicated set of static pages for different variants and host them in different places, like for example, different machines.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1690901748480/ec95be32-5cae-4395-8698-cc57a001a20f.png" alt="Visual representation of two machines hosting two different variants of an A/B test" class="image--center mx-auto" /></p>
<p><strong>Machine 1</strong> owns all the statically generated HTML pages impacted by the variant A and <strong>machine 2</strong> owns all of the statically generated HTML pages of the variant B.</p>
<p>Since pages are statically generated at build time, we can rely on environment variables to display the good variant content:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> AB_EXPERIMENT_VARIANT = process.env.AB_EXPERIMENT_VARIANTS;

<span class="hljs-keyword">const</span> App = <span class="hljs-function">() =&gt;</span> {
  <span class="hljs-keyword">if</span> (AB_EXPERIMENT_VARIANT === <span class="hljs-string">"A"</span>) {
    <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>Here's the A variant!<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>;
  }

  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span>&gt;</span>Here's the B variant!<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></span>;
};
</code></pre>
<p>The next step is to rely on some kind of proxy to route the different users to one of the two variants and make sure they always see that variant.</p>
<p>Remember, <strong>we can't rely on runtime information to store the variant</strong>, like an authenticated user id for example. We need to rely on something else. Hopefully, <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies">HTTP Cookies</a> exist that allow for a client-server kind of data sharing. We can benefit from them to store the actual variant requested by the user and make sure that they will always get routed to that variant.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1690901792765/285977ba-7d15-4d05-8c48-5bf68d9614b9.png" alt="Visual representation of a proxy routing an HTTP request to the good machine for an A/B test" class="image--center mx-auto" /></p>
<h2 id="heading-observations-on-this-approach">Observations on this approach</h2>
<p>The first observation to push upfront is that <strong>we have kept the page loading performances provided by default by the JAMstack</strong>. We don't have to wait for runtime computations to display content on the page.</p>
<p>The second observation is about the tradeoffs we decided to make: we shifted the A/B testing responsibility <strong>closer to the infrastructure layer</strong>. The proxy has an important role to play in this scenario.</p>
<p>Also note that we need more "places" to put the different variants: 1 variant corresponds to 1 website that corresponds to 1 set of static pages that should entirely be hosted. <strong>The more we have variants, the more we may pay for hosting</strong>:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1690901837067/3d6bb516-f89b-4258-822a-6dd5eb73547e.png" alt="A visual representation of a project having 4 different variants" class="image--center mx-auto" /></p>
<p>There's also one side effect that I find positive (but it can feel negative) is that it can be hard to combine multiple A/B experiments.</p>
<p>Let's say that we have 2 pages and that we want to run an experiment on both pages:</p>
<ul>
<li><p>What can be a visual representation of these scenarios at the hosting level?</p>
</li>
<li><p>Should we create 4 different websites, one for each variant?</p>
</li>
<li><p>Should we create N different websites with combinations of variants?</p>
</li>
</ul>
<p>My expectations are that there will be solutions allowing to make A/B testing at the file level itself, and not at that site level.</p>
<h2 id="heading-references">References</h2>
<p>If you're using Netlify for hosting your websites, they have a feature called <a target="_blank" href="https://docs.netlify.com/site-deploys/split-testing/">Split-testing</a> that allows for this kind of testing using a branch-based approach.</p>
<p>If you have any other references in mind concerning A/B testing or Split Testing on top of the JAMstack, feel free to drop them on <a target="_blank" href="https://twitter.com/mfrachet">Twitter</a>.</p>
]]></content:encoded></item><item><title><![CDATA[10 things about feature flags that will speed-up your workflow]]></title><description><![CDATA[I used to work painfully with Gitflow and feature branches until I realised that what I needed was Trunk based Development and feature flags.
Don't forget that the goal of a developer is to ship value and Gitflow/feature branches were slowing me down...]]></description><link>https://blog.mfrachet.com/10-things-about-feature-flags-that-will-speed-up-your-workflow</link><guid isPermaLink="true">https://blog.mfrachet.com/10-things-about-feature-flags-that-will-speed-up-your-workflow</guid><category><![CDATA[Open Source]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[React]]></category><category><![CDATA[  feature flags]]></category><category><![CDATA[Feature Management]]></category><dc:creator><![CDATA[Marvin Frachet]]></dc:creator><pubDate>Tue, 01 Aug 2023 14:41:30 GMT</pubDate><content:encoded><![CDATA[<p>I used to work painfully with <a target="_blank" href="https://progressively.app/blog/is-gitflow-really-needed">Gitflow and feature branches</a> until I realised that what I needed was <a target="_blank" href="https://trunkbaseddevelopment.com/">Trunk based Development</a> and <strong>feature flags</strong>.</p>
<p>Don't forget that the goal of a developer is to ship value and Gitflow/feature branches were slowing me down in this regard.</p>
<p>With trunk-based development, I create very small branches that live for a few hours, and each time I merge one in the main branch, the code is deployed to production. To protect users from accessing unfinished features, I use feature flags: each time I want to activate a feature, I just press a button.</p>
<p>How fast is that?</p>
<p><strong>Here are 10 things about feature flags that will speed up your workflow.</strong></p>
<h2 id="heading-1-separate-code-deployment-from-feature-releases">1. Separate code deployment from feature releases</h2>
<p>You can deploy code 20 times a day, and all this code may not act as a fully polished feature. And it's okay because with feature flags, activating a feature to the audience is not tightly bound to your code deployment process: it's just a toggle button that you click in a dashboard to make the feature available to the users.</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">if</span> (flags.newFeature) {
  <span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">NewFeature</span> /&gt;</span></span>
}

<span class="hljs-keyword">return</span> <span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">OldFeature</span> /&gt;</span></span>
</code></pre>
<h2 id="heading-2-rollbacks-are-easy">2. Rollbacks are easy</h2>
<p>Almost the same point as above: since the code deployed and the feature are not strictly bound, you can deactivate the feature with just one click and not go through your whole CI/CD pipelines to get back to a valid and running state.</p>
<h2 id="heading-3-test-directly-in-production">3. Test directly in production</h2>
<p>In most of the feature flags tools available in the market, you can decide which users can see the new feature and which users can't. It means that you can activate the feature only for your QA team and they will be able to play directly in production.</p>
<p><em>Side effect: no discrepancies between environments anymore, it's always the same server configurations.</em></p>
<h2 id="heading-4-unlock-canary-and-beta-releases">4. Unlock Canary and Beta releases</h2>
<p>Using the same targeting tooling as previously explained, you can create a Canary users group and a Beta users group and activate the feature very early for them.</p>
<h2 id="heading-5-gradual-rollout">5. Gradual rollout</h2>
<p>Let's say you've built a brand new feature, and you don't feel very confident about what you've created. With feature flagging tools, you can increasingly roll out your feature to 1%, 2%, 3%...100% of your audience.</p>
<p>The funny thing is that you can correlate the percentage of rollout with your error tracking tool (such as Sentry) and check if your new feature has increased your error rates.</p>
<h2 id="heading-6-the-ab-testing-side-effect">6. The A/B testing side effect</h2>
<p>Feature flags are generally used with "true" and "false" values: is the feature activated or not?</p>
<p>By pushing the concept one step further, we can give feature flags multiple values "A", "B", "C" (or whatever) and display different UI/UX of a given feature to a percentage of the audience. You can then measure the number of actions taken on each of these different views and see which one converts the most.</p>
<h2 id="heading-7-time-based-rollout">7. Time-based rollout</h2>
<p>Do you have something to deploy on Monday at 9 am? With feature flagging tools, you can automate that. Since, again, the feature and the code are not tightly bound, the code already exists in production: all you need to do is to create a rule in the dashboard of your tool and at 9 am Monday, you'll see your new feature live.</p>
<h2 id="heading-8-no-impact-on-web-performance-with-progressivelyhttpsprogressivelyapp">8. No impact on web performance with <a target="_blank" href="https://progressively.app/">Progressively</a></h2>
<p>Progressively is a feature flagging tool and in contrary to other solutions, the client-side SDK, which works in real-time, is only 1.3kB.</p>
<p>Stop fearing the slow page loading because of third-party tools anymore.</p>
<h2 id="heading-9-progressivelyhttpsprogressivelyapp-with-ssr-and-edge-runtimes">9. <a target="_blank" href="https://progressively.app/">Progressively</a> with SSR and Edge Runtimes</h2>
<p>The tool works with SSR frameworks such as Svelte, Qwik, Astro, Nextjs, Remix etc... You don't need to wait for the client side of your app to load and the page to flicker to benefit from a great experience with feature flags.</p>
<p>And if you want to work at an even bigger scale, try to use Progressively inside an Edge Middleware in Vercel ;).</p>
<h2 id="heading-10-progressivelyhttpsprogressivelyapp-is-free">10. <a target="_blank" href="https://progressively.app/">Progressively</a> is FREE</h2>
<p>It's open source, and you can self-host it on your servers. Go to <a target="_blank" href="https://github.com/progressively-crew/progressively">https://github.com/progressively-crew/progressively</a>, follow the instruction and spawn your instance on your machine, for free.</p>
<p>And if you're not so much on self-hosting, there is a SaaS solution that you can pay to play with.</p>
]]></content:encoded></item></channel></rss>