Feature flags & expériences

Des flags définis dans le code (façon Pennant) : une constante, un prédicat sur le contexte, ou un déploiement percentage() déterministe et collant — le même utilisateur obtient toujours la même réponse. Aucun serveur requis ; remote permet de retomber sur le moteur Rust pour les clés non définies localement.

Astuce
Entrez différents noms : « alice » et « bob » ont le bandeau bêta ; ~30 % des utilisateurs ont le nouveau checkout, ~50 % le support prioritaire — et c'est stable par utilisateur (rechargez, ça ne bouge pas). L'affectation de variante est elle aussi collante.

Entrez un identifiant pour évaluer ses flags.

src/app/examples/feature-flags/page.tsxTSX
import { defineFlags, percentage, forUsers } from "@bext-stack/framework/flags";

const flags = defineFlags({
  flags: {
    "new-checkout": percentage(30),        // sticky 30% rollout
    "beta-banner":  forUsers("alice", "bob"),
    "holiday":      (ctx) => ctx.attributes?.country === "FR",
  },
  remote: { appId: "my-site" },            // optional: fall through to the Rust engine
});

if (await flags.isEnabled("new-checkout", { userId: user.id })) { /* … */ }

// deterministic, sticky A/B/n assignment:
const arm = flags.variant("home-hero", ["control", "b", "c"], { userId: user.id });