Feature flags
Server-controlled boolean and variant flags with attached JSON payload. One fetch per session, hooks for React.
Feature flags let you ship code dark and turn it on without a deploy. Today each flag has a global on/off and a global default variant — every user who fetches the flag set sees the same answer. Per-user targeting (segment-scoped flags, sticky A/B variants) is on the roadmap; the SDK contract is already shaped for it so client code won't need to change when it lands.
Two flag types:
- Boolean flags — global on / off. Read with
useFlag(name)orflags.fetch().then(...). - Variant flags — return a string (e.g.
'control'/'short'/'long'). Today the variant is the same for every user, so use these for kill-switched rollouts and config-as-flag, not as A/B traffic splitters yet.
Each flag can also carry a payload JSON value — useful for config-driven feature gates ({ "max_items": 25 }).
Coming next: per-user targeting
Segment-scoped flags and sticky A/B variants are tracked work. Until they ship, treat flags as global kill-switches plus attached config — not as A/B traffic splitters. If you ship a multi-variant flag today, every user gets the same arm.
Quick start
Operations
fetch()
Returns the full flag set for this project. Each entry has the shape:
The SDK caches the response for the lifetime of the session — subsequent fetch() calls within ~60 seconds return the cache. Force a refresh by signing the user out and back in (e.g. after a flag-config change).
Today every signed-in user receives the same flag set. When per-user targeting ships, the response shape stays the same — the values just start varying by user, and the SDK cache will key on the user.
React hooks
useFlag(name) returns a boolean. useVariant(name) returns the variant string (or null if unset / not loaded).
Both hooks default to safe values (false / null) while the initial fetch is in flight — render without an explicit loading guard.
Patterns
Gate render at module scope
For flags that gate large slabs of the UI, prefer fetching once at app start and stashing the result:
Config-driven gates
For A/B tests with parameterized behavior, attach a payload to the variant in the console and read it on the client:
Server-side parity
Server functions can read the same flag set via ctx.flags.fetch() (or amba.flags.fetch() from a Node server). Useful for gating server logic on the same answer as the UI:
Limits
- Flag count: up to 100 flags per project visible to a single fetch.
- Variant count: up to 8 variants per multi-variant flag (
control+ 7 treatments is a common ceiling). - Payload size: up to 8 KB JSON per flag.
- Cache TTL: ~60 seconds per session, then a server round-trip on next
fetch(). To deliberately re-fetch (e.g. after toggling a flag), sign the user out and back in.
Reference
- Client API — flags — endpoint reference.
- Auth feature — prerequisite.
- Config feature — for non-flag remote config bundles.
- Per-platform quickstarts: Web, Node, iOS, Android, Flutter, Unity.