@vercel/flags/next

APIs for working with feature flags in Next.js.

flag

Description: Declares a feature flag

A feature flag declared this way will automatically respect overrides set by the Flags Explorer and integrate with Runtime Logs, Web Analytics, and more.

ParameterTypeDescription
keystringKey of the feature flag.
decidefunctionResolves the value of the feature flag.
defaultValue (Optional)anyFallback value in case the decide function returns undefined or throws an error.
description (Optional)stringDescription of the feature flag.
origin (Optional)stringThe URL where this feature flag can be managed.
options (Optional){ label?: string, value: any }[]Possible values a feature flag can resolve to, which are displayed in the Flags Explorer.
adapter (Optional)AdapterSupply an adapter which will implement the decide and origin functions.
identify (Optional)AdapterProvide an evaluation context which will be passed to decide.

The key, description, origin, and options appear in the Flags Explorer.

flags.ts
import { flag as flag } from '@vercel/flags/next';
export const showSummerSale = flag<boolean>({
key: 'summer-sale',
async decide() {
return false;
},
origin: 'https://example.com/flags/summer-sale/',
description: 'Show Summer Holiday Sale Banner, 20% off',
defaultValue: false,
options: [
// options are not necessary for boolean flags, but we customize their labels here
{ value: false, label: 'Hide' },
{ value: true, label: 'Show' },
],
});

getProviderData

Description: Turns flags declared using flag into Vercel Toolbar compatible definitions.

ParameterTypeDescription
flagsRecord<string, Flag>A record where the values are feature flags. The keys are not used.

Use getProviderData to surface the feature flags defined in code to the Flags Explorer using the Flags Explorer API endpoint.

app/.well-known/vercel/flags/route.ts
import { verifyAccess, type ApiData } from '@vercel/flags';
import { getProviderData } from '@vercel/flagas';
import { NextResponse, type NextRequest } from 'next/server';
import * as flags from '../../../../flags'; // your feature flags file(s)
export async function GET(request: NextRequest) {
const access = await verifyAccess(request.headers.get('Authorization'));
if (!access) return NextResponse.json(null, { status: 401 });
const providerData = getProviderData(flags);
return NextResponse.json<ApiData>(providerData);
}

Precomputation

These APIs are relevant for precomputing feature flags.

precompute

Description: Evaluates multiple feature flags. Returns their values encoded to a single signed string.

This call is a shorthand for calling evaluate and serialize manually.

ParameterTypeDescription
flagsfunction[]Flags
codestringPrecomputation code generated by the original precompute call.

evaluate

Description: Evaluates multiple feature flags and returns their values.

ParameterTypeDescription
flagsfunction[]An array of flags declared using flag.
import { evaluate as evaluate } from '@vercel/flags/next';
const values = await evaluate(precomputeFlags);

serialize

Description: Turns evaluated feature flags into their serialized representation.

ParameterTypeDescription
flagsfunction[]Feature Flags to be serialized.
valuesunknown[]The value each flag declared in flags resolved to.
secret (Optional)stringThe secret used to sign the returned representation.
import {
precompute as precompute,
serialize as serialize,
} from '@vercel/flags/next';
const values = await precompute(precomputeFlags, context);
const code = await serialize(precomputeFlags, values);

Note that serialize compresses to a tiny format, with only two bytes per feature flag and a few bytes overhead for JWS signature.

The underlying algorithm basically has special values for boolean values and null. If your feature flag can return non-boolean values, it's advised to declare them in options when declaring the flag using flag. That way this serialization can store the index of the matched option instead of its values, which further shortens the emitted.

getPrecomputed

Description: Retrieves the value of one or multiple feature flags from the precomputation and returns them as an array.

ParameterTypeDescription
flagfunction | function[]A flag or an array of flags declared using flag whose values should be extracted from the precomputation .
precomputeFlagsfunction[]Flags used when precompute was called and created the precomputation code.
codestringPrecomputation code generated by the original precompute call.
import {
getPrecomputed as getPrecomputed,
precompute as precompute,
} from '@vercel/flags/next';
const precomputeFlags = [
showSummerBannerFlag,
showFreeDeliveryBannerFlag,
countryFlag,
];
const code = await precompute(precomputeFlags);
const [showSummerBanner, showFreeDeliveryBanner] = await getPrecomputed(
[showSummerBannerFlag, showFreeDeliveryBannerFlag],
precomputeFlags,
code,
);

It is recommended to call the feature flag directly, for example:

flags.ts
import {
flag as flag,
precompute as precompute,
} from '@vercel/flags/next';
const showSummerSale = flag({
key: 'summer-sale',
decide: () => false,
});
const precomputeFlags = [
showSummerSale,
/*...*/
];
const code = await precompute(precomputeFlags);
// This will not actually invoke `showSummerSale`'s `decide` function, it will just read the result.
const sale = await showSummerSale(code, precomputeFlags);

deserialize

Description: Retrieves the value of all feature flags and returns them as a record. Keys will be the key passed to when declaring flags using flag. Returns Record<string, unknown>.

ParameterTypeDescription
flagsfunction[]Flags
codestringPrecomputation code generated by the original precompute call.

generatePermutations

Description: Calculates all precomputations of the options of the provided flags.

ParameterTypeDescription
flagsfunction[]Flags
filter (Optional)functionThis function is called with every possible precomputation of the flag's options. Return true to keep the option.
secret (Optional)stringThe secret used to sign the generated code. Defaults to process.env.FLAGS_SECRET

Example usage in generateStaticParams:

import { generatePermutations as generatePermutations } from '@vercel/flags/next';
export async function generateStaticParams() {
const codes = await generatePermutations(precomputeFlags);
return codes.map((code) => ({ code }));
}