RORK LABJP
FUNDING — Rork raises $15M, drawing fresh attention to its mobile-first no-code AI positioningMAX-NATIVE — Rork Max reaches native territory React Native can't: AR/LiDAR, Metal 3D, widgets, Dynamic Island, Live Activities, HealthKit, and on-device Core MLMOBILE-FIRST — While Bolt and Lovable focus on web apps, Rork builds mobile apps — production-ready from a plain-language descriptionWWDC — WWDC26 wraps with AI becoming a core OS capability; the iOS 27 generation raises the value of widgets and Live ActivitiesPRICING — Free to start, paid plans from $25/mo, Rork Max at $200/mo — ship fast on Expo, then go native with Max where it pays offALL-APPLE — Rork Max generates pure Swift covering iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessageFUNDING — Rork raises $15M, drawing fresh attention to its mobile-first no-code AI positioningMAX-NATIVE — Rork Max reaches native territory React Native can't: AR/LiDAR, Metal 3D, widgets, Dynamic Island, Live Activities, HealthKit, and on-device Core MLMOBILE-FIRST — While Bolt and Lovable focus on web apps, Rork builds mobile apps — production-ready from a plain-language descriptionWWDC — WWDC26 wraps with AI becoming a core OS capability; the iOS 27 generation raises the value of widgets and Live ActivitiesPRICING — Free to start, paid plans from $25/mo, Rork Max at $200/mo — ship fast on Expo, then go native with Max where it pays offALL-APPLE — Rork Max generates pure Swift covering iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and iMessage
Articles/Dev Tools
Dev Tools/2026-06-13Advanced

Before Your Feature Flags Turn Into a Junkyard — Governing Naming, Staged Rollout, and Kill Switches Across Six Apps

Keep adding remote-config flags and within six months you have keys nobody remembers the meaning of. Here is a governance system — naming conventions, safe defaults, staged rollout, kill switches, and monthly cleanup — with the implementation from running six apps in parallel.

feature flagsremote configoperations6Firebase9governance

Premium Article

I remember the day I added the first flag to remote config. It was a key called new_onboarding for showing a new onboarding screen to a slice of users. It was convenient. So convenient that six months later nearly thirty flags sat there, including ones like test2 and enable_v3_real whose meaning nobody could explain anymore.

Feature flags themselves are powerful. The problem is an asymmetry: adding one is easy, removing one is tedious. When the same thing happens across six apps at once, the config screen quickly turns into a wasteland. Here is the governance system I settled on to avoid that, along with the actual naming convention and the rollout and kill-switch implementation.

A naming convention your future self can read

The first thing I decided was the naming convention. A flag name should tell you which app, what it controls, and how long it is meant to live.

<scope>.<domain>.<name>.<kind>

examples:
  wallpaper.onboarding.skip_tutorial.release   # all apps, permanent
  fortune.paywall.intro_offer_v2.experiment    # fortune apps only, experiment
  all.admob.interstitial_enabled.ops           # all apps, operational switch

The trailing kind is the crux. It sorts flags into three lifespans. A release flag is temporary, used to roll a new feature out in stages; an experiment flag is for A/B tests and dies when the test ends; an ops flag is a permanent operational switch like a kill switch. With this classification, the monthly cleanup below becomes a mechanical "is this safe to delete?" decision.

I made scope able to target a group of apps because settings I wanted to apply only to the three fortune apps came up constantly. all means every app; anything else filters by an app group ID.

Defaults must fail to the safe side

The biggest trap in remote config is behavior on a failed fetch. Right after launch or while offline, the flag value has not arrived yet. If you treat "value not fetched = feature ON," an unverified feature leaks to every user.

As a rule, when a flag cannot be fetched, behavior falls back to the previous safe state. For a new-feature flag the default is OFF; for an operational kill switch the default is ON (do not stop).

import remoteConfig from '@react-native-firebase/remote-config';
 
// State the fallback per flag explicitly
const DEFAULTS = {
  'wallpaper.onboarding.skip_tutorial.release': false, // new feature -> default OFF
  'all.admob.interstitial_enabled.ops': true,          // ops -> default do-not-stop
} as const;
 
export async function initFlags(): Promise<void> {
  await remoteConfig().setDefaults(DEFAULTS);
  await remoteConfig().setConfigSettings({
    minimumFetchIntervalMillis: 60 * 60 * 1000, // 1-hour cache normally
  });
  // DEFAULTS still apply on failure, so do not swallow it — just record it
  try {
    await remoteConfig().fetchAndActivate();
  } catch (e) {
    logFlagFetchError(e);
  }
}
 
export function flag(key: keyof typeof DEFAULTS): boolean {
  return remoteConfig().getValue(key).asBoolean();
}

Declaring every flag's safe value in setDefaults is the point. With it, even a device that has never reached the server gets defined, safe behavior. I treat this list of defaults as the single source of truth in code, and I keep a strict order: add the default here first, then create the flag on the server side.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
A naming convention you can still read six months later, plus a rule that sorts flags into three lifespans
A default design that always fails to the safe side, and a staged rollout you can run in 5% increments
A kill switch that stops a feature in production within 30 seconds, and a monthly routine to retire dead flags
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Dev Tools2026-06-03
Guarding Analytics Events With Types Across Six Rork Apps — A Shared Event Layer
After event names drifted across six apps and quietly broke my dashboards, I built a typed event registry and a thin wrapper to centralize tracking, plus a CI check that catches schema drift. Here is the design, with the code I actually use.
Dev Tools2026-05-19
Rolling Out Firebase App Check in Rork Without Breaking AdMob or Crashlytics
A practical, staged rollout for Firebase App Check in Rork apps that keeps Crashlytics reporting, Realtime Database listeners, and AdMob payouts intact — written from 50M+ downloads of indie experience.
Dev Tools2026-05-16
Rork Max SwiftUI App Crash Logs Are Unreadable: The dSYM Upload Pitfall
Fix Unsymbolicated crash reports in Firebase Crashlytics for Rork Max SwiftUI apps. Learn the correct dSYM upload configuration with real examples from indie app development.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →