FEATUREFLOW V2AI-native · MCP-enabled ·Only 5 spots left at 50% off:NEXT50claim →
Remote config

Change settings without a deploy or an app store review

A rate limit, a timeout, the copy on the paywall, which model your AI feature calls. They sit in a constant somewhere — so changing one costs a release, and on mobile a release plus a review queue.

Featureflow feature settings — details, release pipeline and variants, editable without a deploy

The config file problem

Most teams start with environment variables, graduate to a config file per environment, and end up with a small distributed systems problem nobody signed up for.

Constants and config files

  • The values live in three places
  • Changing one in production means a deploy, an SSH session, or a Terraform run and a restart
  • Nobody can tell you what the value was last Tuesday
  • These values change more often than the code does

Config on a variant

  • One place, changed from a browser
  • Targeted per environment, segment, percentage or customer
  • Approval before a production change applies
  • An audit record of who changed which value and when

A limit tuned during an incident. A timeout raised because a third party got slower. A paywall message rewritten because it read badly. All one-line changes gated behind a full release cycle.

One object

Variant key plus payload

Rather than a separate remote config product, every variant of a flag carries a JSON value next to its key. The key answers which; the payload answers with what settings.
search.ts
type SearchTuning = {
  pageSize: number;
  fuzziness: number;
  reranker: string;
};

const evaluation = featureflow.evaluate('search-tuning');

evaluation.value();  // 'aggressive' — the variant key

const tuning = evaluation.jsonValue<SearchTuning>();

const results = await search(query, {
  pageSize: tuning?.pageSize ?? 20,
  fuzziness: tuning?.fuzziness ?? 0.2,
  reranker: tuning?.reranker ?? 'default',
});
jsonValue() returns undefined when the variant carries no payload. Keep defaults in code and treat the remote value as an override.

Config that is targeted, not global

Because the payload rides on the variant, everything you can already do with targeting applies to configuration.

Per environment

Staging points at the sandbox endpoint and a generous timeout; production does not.

Per segment

Enterprise accounts get higher limits, defined once as a reusable segment rather than a hard-coded list of IDs.

Per rollout percentage

Tune a parameter for 5% of users, watch what happens, then widen the band.

Per customer, temporarily

Raise one account's limit while you investigate — instead of a hotfix that ships a special case to production.

Config changes are flag changes, so they inherit approvals and the audit trail.

Delivery

Why the client never sees your rules

Ship the rules to the client and you have leaked your segment definitions, customer lists and rollout plans to anyone with developer tools open. Featureflow evaluates on the server and sends a pre-evaluated result.
  • Rules stay behind the API

    Browsers and devices get answers, not logic.

  • Cached at the edge

    The payload is identical for everyone in the same targeting position, so it is served through a CDN and does not hit the origin on every evaluation.

  • Two deliberate exceptions

    featureflow.date and featureflow.hourofday resolve on the client clock — otherwise every response would be unique to the second and nothing could be cached.

split evaluation — how a flag reaches a device
Your rulesevaluated server-sidesegments · rollout plansCDN edgecached payload{ pre-evaluated }identical for everyoneBrowseranswers, not logicMobile appanswers, not logicdate + hourofday evaluate on the device — the payload stays cacheable

Mobile

Old versions of your app stay in the wild for a long time

On mobile the gap between deciding to change a value and that value reaching users is measured in review queues and upgrade rates. Every constant you move into remote config is one you can fix in an app that already shipped.
See mobile releases

Frequently asked questions

How is remote config different from a feature flag?

A flag answers a yes/no or which-variant question. Remote config carries a value — a limit, a URL, a copy string, a settings object. In Featureflow they are the same object: every variant can carry a JSON payload alongside its key.

How large can a config payload be?

Up to 32KB per variant, serialized. Comfortably enough for structured settings, feature parameters, copy or a small ruleset — and small enough to keep evaluation fast and payloads cheap to cache at the edge.

How do I read the config value in code?

Call jsonValue() on the evaluation result. value() gives you the variant key as a string; jsonValue() gives you the parsed JSON payload, typed if you supply a type parameter. It returns undefined when the resolved variant has no payload, so a missing value is something you handle rather than a crash.

Does this work for mobile apps waiting on app store review?

That is one of the strongest cases for it. Anything you move from a compiled constant into remote config becomes changeable without submitting a build. React Native is supported by the client SDKs, and config is served through a CDN and cached at the edge.

Are my targeting rules visible to the client?

No. Client-side SDKs receive pre-evaluated results rather than your rule set. Two conditions are the deliberate exception — featureflow.date and featureflow.hourofday are evaluated on the client against its own clock, which keeps the rest of the response identical for everyone and therefore cacheable.

Do config changes get the same approvals and audit trail?

Yes — config changes are flag changes, so they inherit approval before a production change applies and an audit record of who changed which value and when. That is more governance than most teams have over the config file it replaces.

Move your first constant out of the build

Free forever tier, every SDK included, no credit card. Pick the value you have most often wished you could change from a browser.