{"id":1444,"date":"2026-10-25T18:00:00","date_gmt":"2026-10-25T18:00:00","guid":{"rendered":"https:\/\/wade.one\/blog\/?p=1444"},"modified":"2026-10-25T18:00:00","modified_gmt":"2026-10-25T18:00:00","slug":"feature-flags-need-a-removal-plan","status":"publish","type":"post","link":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/","title":{"rendered":"Feature Flags Need a Removal Plan"},"content":{"rendered":"<p>A temporary feature flag is very good at becoming a permanent piece of the application. It starts as a way to control a release, then hangs around because removing it feels less urgent than the next change. Eventually nobody is quite sure which branch still matters or whether the old behaviour is safe to delete.<\/p>\n<p>Pete Hodgson&#8217;s <a href=\"https:\/\/martinfowler.com\/articles\/feature-toggles.html\">feature-toggle guide<\/a> makes a useful distinction between different kinds of flags and their expected lifetimes. A release flag and a long-lived permission decision solve different problems. I would avoid treating them as interchangeable just because both happen to be a boolean in the code.<\/p>\n<p>If a release needs a flag, give it an owner and a removal condition when it is introduced. Decide what evidence will make the new path the normal path, then include the cleanup in the work. Also check what happens when the flag&#8217;s configuration is unavailable. A control intended to make a release safer should not leave the application with an unexplained default.<\/p>\n<p>Some features need staged exposure or a quick operational switch. Others can be released through the ordinary deployment process. Choose the control for a concrete reason, then retire it when that reason disappears. Leaving every alternative available forever is a fairly expensive way to avoid making a final decision.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A temporary feature flag is very good at becoming a permanent piece of the application.<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[25],"tags":[279,114,280],"class_list":["post-1444","post","type-post","status-publish","format-standard","hentry","category-software-engineer","tag-feature-flags","tag-maintenance","tag-releases"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Feature Flags Need a Removal Plan - wade.one<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Feature Flags Need a Removal Plan - wade.one\" \/>\n<meta property=\"og:description\" content=\"A temporary feature flag is very good at becoming a permanent piece of the application.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/\" \/>\n<meta property=\"og:site_name\" content=\"wade.one\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T18:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1518\" \/>\n\t<meta property=\"og:image:height\" content=\"1506\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:site\" content=\"@wadewomersley\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Feature Flags Need a Removal Plan\",\"datePublished\":\"2026-10-25T18:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/\"},\"wordCount\":221,\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"keywords\":[\"feature-flags\",\"maintenance\",\"releases\"],\"articleSection\":[\"Software Engineer\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/\",\"name\":\"Feature Flags Need a Removal Plan - wade.one\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\"},\"datePublished\":\"2026-10-25T18:00:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/2026\\\/10\\\/25\\\/feature-flags-need-a-removal-plan\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/wade.one\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature Flags Need a Removal Plan\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/\",\"name\":\"wade.one\",\"description\":\"wade womersley - york based software engineer\",\"publisher\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/wade.one\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/#\\\/schema\\\/person\\\/8b4739f8f8bb2cff5d792d4b8779fcc3\",\"name\":\"Wade Womersley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"url\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"contentUrl\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\",\"width\":202,\"height\":200,\"caption\":\"Wade Womersley\"},\"logo\":{\"@id\":\"https:\\\/\\\/wade.one\\\/blog\\\/wp-content\\\/uploads\\\/2015\\\/02\\\/200px.png\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Feature Flags Need a Removal Plan - wade.one","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/","og_locale":"en_GB","og_type":"article","og_title":"Feature Flags Need a Removal Plan - wade.one","og_description":"A temporary feature flag is very good at becoming a permanent piece of the application.","og_url":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/","og_site_name":"wade.one","article_published_time":"2026-10-25T18:00:00+00:00","og_image":[{"width":1518,"height":1506,"url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/Wade-Logo-cropped.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_creator":"@wadewomersley","twitter_site":"@wadewomersley","twitter_misc":{"Estimated reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/#article","isPartOf":{"@id":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/"},"author":{"name":"","@id":""},"headline":"Feature Flags Need a Removal Plan","datePublished":"2026-10-25T18:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/"},"wordCount":221,"publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"keywords":["feature-flags","maintenance","releases"],"articleSection":["Software Engineer"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/","url":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/","name":"Feature Flags Need a Removal Plan - wade.one","isPartOf":{"@id":"https:\/\/wade.one\/blog\/#website"},"datePublished":"2026-10-25T18:00:00+00:00","breadcrumb":{"@id":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/wade.one\/blog\/2026\/10\/25\/feature-flags-need-a-removal-plan\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/wade.one\/blog\/"},{"@type":"ListItem","position":2,"name":"Feature Flags Need a Removal Plan"}]},{"@type":"WebSite","@id":"https:\/\/wade.one\/blog\/#website","url":"https:\/\/wade.one\/blog\/","name":"wade.one","description":"wade womersley - york based software engineer","publisher":{"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/wade.one\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":["Person","Organization"],"@id":"https:\/\/wade.one\/blog\/#\/schema\/person\/8b4739f8f8bb2cff5d792d4b8779fcc3","name":"Wade Womersley","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","url":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","contentUrl":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png","width":202,"height":200,"caption":"Wade Womersley"},"logo":{"@id":"https:\/\/wade.one\/blog\/wp-content\/uploads\/2015\/02\/200px.png"}}]}},"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":1181,"url":"https:\/\/wade.one\/blog\/2026\/04\/13\/what-i-check-before-i-trust-a-mobile-release\/","url_meta":{"origin":1444,"position":0},"title":"What I Check Before I Trust a Mobile Release","author":"","date":"April 13, 2026","format":false,"excerpt":"A mobile release can look fine in the app store and still be a bad idea. I usually trust it only after I have checked crash risk, permissions, API compatibility, startup behavior, rollout safety, and what happens after the update lands.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":112,"url":"https:\/\/wade.one\/blog\/2009\/09\/17\/chandelier-penis-chandelier\/","url_meta":{"origin":1444,"position":1},"title":"Chandelier, Penis Chandelier","author":"Wade","date":"September 17, 2009","format":false,"excerpt":"If I still lived in my old house I'd have this - a penis chandelier. Made by a Dutch company called Rock and Royal, it would undoubtedly be a talking point for any guests. The company actually does a lot of weird chandeliers so this isn't that strange, taking a\u2026","rel":"","context":"In &quot;Random Stuff&quot;","block_context":{"text":"Random Stuff","link":"https:\/\/wade.one\/blog\/category\/random-stuff\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1154,"url":"https:\/\/wade.one\/blog\/2026\/03\/25\/typescript-7-0-looks-like-the-bigger-story\/","url_meta":{"origin":1444,"position":2},"title":"TypeScript 7.0 Looks Like the Bigger Story","author":"Wade","date":"March 25, 2026","format":false,"excerpt":"TypeScript 6.0 matters, but TypeScript 7.0 looks like the real shift. The native compiler work is the part I think most teams should actually care about.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1401,"url":"https:\/\/wade.one\/blog\/2026\/08\/22\/dotnets-mcp-c-sharp-sdk-2-0-makes-web-deployment-less-weird\/","url_meta":{"origin":1444,"position":3},"title":".NET&#8217;s MCP C# SDK 2.0 Makes Web Deployment Less Weird","author":"Wade","date":"August 22, 2026","format":false,"excerpt":"The official MCP C# SDK 2.0 adopts stateless HTTP while keeping older clients and servers working during migration.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1178,"url":"https:\/\/wade.one\/blog\/2026\/04\/10\/what-actually-slows-software-delivery-down\/","url_meta":{"origin":1444,"position":4},"title":"What Actually Slows Software Delivery Down","author":"","date":"April 10, 2026","format":false,"excerpt":"Software delivery usually slows down because of decisions, handoffs, fear, and bad environments, not because developers are typing too slowly.","rel":"","context":"In &quot;Software Engineer&quot;","block_context":{"text":"Software Engineer","link":"https:\/\/wade.one\/blog\/category\/software-engineer\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1173,"url":"https:\/\/wade.one\/blog\/2026\/04\/06\/most-mobile-app-complexity-is-not-in-the-ui\/","url_meta":{"origin":1444,"position":5},"title":"Most Mobile App Complexity Is Not in the UI","author":"","date":"April 6, 2026","format":false,"excerpt":"The hard part of a mobile app is usually not the screen layout. It is sync, auth, state, permissions, offline behavior, and the release problems that show up after the UI already looks finished.","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/wade.one\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/comments?post=1444"}],"version-history":[{"count":1,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1444\/revisions"}],"predecessor-version":[{"id":1467,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/posts\/1444\/revisions\/1467"}],"wp:attachment":[{"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/media?parent=1444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/categories?post=1444"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wade.one\/blog\/wp-json\/wp\/v2\/tags?post=1444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}