Flags SDK

Frameworks & Libraries

A free, open-source library for using feature flags in Next.js and SvelteKit.

Latest 4.3.0 · by VercelWebsitevercel/flags

Release activity

Release activity — 12 releases across 11 days in the last year. Each cell is one day; darker means more releases that day. Older weeks are hidden at this screen width.
MayJunJulAug
SundayNo releases on Apr 26, 2026No releases on May 3, 2026No releases on May 10, 2026No releases on May 17, 2026No releases on May 24, 2026No releases on May 31, 2026No releases on Jun 7, 2026No releases on Jun 14, 2026No releases on Jun 21, 2026No releases on Jun 28, 2026No releases on Jul 5, 2026No releases on Jul 12, 2026No releases on Jul 19, 2026No releases on Jul 26, 2026No releases on Aug 2, 2026No releases on Aug 9, 2026
MondayNo releases on Apr 27, 2026No releases on May 4, 2026No releases on May 11, 2026No releases on May 18, 2026No releases on May 25, 2026No releases on Jun 1, 2026No releases on Jun 8, 2026No releases on Jun 15, 2026No releases on Jun 22, 2026No releases on Jun 29, 2026No releases on Jul 6, 2026No releases on Jul 13, 20261 release on Jul 20, 2026No releases on Jul 27, 2026No releases on Aug 3, 2026No releases on Aug 10, 2026
TuesdayNo releases on Apr 28, 2026No releases on May 5, 2026No releases on May 12, 2026No releases on May 19, 2026No releases on May 26, 2026No releases on Jun 2, 2026No releases on Jun 9, 20261 release on Jun 16, 2026No releases on Jun 23, 2026No releases on Jun 30, 2026No releases on Jul 7, 2026No releases on Jul 14, 2026No releases on Jul 21, 2026No releases on Jul 28, 20261 release on Aug 4, 2026No releases on Aug 11, 2026
WednesdayNo releases on Apr 29, 2026No releases on May 6, 2026No releases on May 13, 2026No releases on May 20, 2026No releases on May 27, 2026No releases on Jun 3, 2026No releases on Jun 10, 2026No releases on Jun 17, 2026No releases on Jun 24, 2026No releases on Jul 1, 2026No releases on Jul 8, 2026No releases on Jul 15, 2026No releases on Jul 22, 20261 release on Jul 29, 2026No releases on Aug 5, 2026No releases on Aug 12, 2026
ThursdayNo releases on Apr 30, 2026No releases on May 7, 2026No releases on May 14, 2026No releases on May 21, 2026No releases on May 28, 2026No releases on Jun 4, 2026No releases on Jun 11, 2026No releases on Jun 18, 2026No releases on Jun 25, 2026No releases on Jul 2, 2026No releases on Jul 9, 2026No releases on Jul 16, 2026No releases on Jul 23, 2026No releases on Jul 30, 2026No releases on Aug 6, 2026
FridayNo releases on May 1, 2026No releases on May 8, 2026No releases on May 15, 2026No releases on May 22, 2026No releases on May 29, 20261 release on Jun 5, 2026No releases on Jun 12, 2026No releases on Jun 19, 2026No releases on Jun 26, 2026No releases on Jul 3, 2026No releases on Jul 10, 2026No releases on Jul 17, 20262 releases on Jul 24, 2026No releases on Jul 31, 2026No releases on Aug 7, 2026
SaturdayNo releases on May 2, 2026No releases on May 9, 2026No releases on May 16, 2026No releases on May 23, 2026No releases on May 30, 2026No releases on Jun 6, 2026No releases on Jun 13, 2026No releases on Jun 20, 2026No releases on Jun 27, 2026No releases on Jul 4, 2026No releases on Jul 11, 2026No releases on Jul 18, 2026No releases on Jul 25, 2026No releases on Aug 1, 2026No releases on Aug 8, 2026

12 releases in the last year, busiest day 2

Changelog

4.3.0

Changed 3
  • Replace @vercel/edge-config with @vercel/global-config
  • Rename the Edge Config adapter package to @flags-sdk/global-config
  • Rename repository-owned Edge Config files, exports, types, options, variables, and environment variables to Global Config
Deprecated 1
  • Previous Edge Config names remain available as deprecated aliases
Minor Changes
  • #452 58e1f5b Thanks @luismeyer! - Replace @vercel/edge-config with @vercel/global-config.

    Rename the Edge Config adapter package to @flags-sdk/global-config and rename repository-owned Edge Config files, exports, types, options, variables, and environment variables to Global Config.

    The previous Edge Config names remain available as deprecated aliases, and the previous environment variables are still honored as fallbacks, so existing code keeps working without changes.

View originalPermalink
How 4.3.0 went

4.2.4

Changed 1
  • Return cache-control: no-store from flags discovery endpoint
Patch Changes
View originalPermalink
How 4.2.4 went

4.2.3

Fixed 1
  • Remove @sveltejs/kit from peer dependencies to prevent ERESOLVE errors in non-SvelteKit projects using Vite 7
Patch Changes
  • #442 622d56e Thanks @dferber90! - Remove @sveltejs/kit from peer dependencies. It was declared as an optional peer with a "*" range, which caused npm to auto-install the newest @sveltejs/kit and drag in its transitive @sveltejs/vite-plugin-sveltevite peer chain. In non-SvelteKit projects already on Vite 7 (via Vitest, Storybook, etc.) this produced a hard ERESOLVE error requiring npm install --force. SvelteKit consumers always have @sveltejs/kit installed as the framework, so the flags/sveltekit entrypoint continues to resolve it from their own tree.
View originalPermalink
How 4.2.3 went

4.2.2

Fixed 1
  • Tracing no longer records Next.js control-flow errors as span errors, instead reporting flag evaluation spans as successful when redirects, notFound, or rejected hanging promises of aborted prerenders are re-thrown for the framework to handle
Patch Changes
  • #438 d23d9d2 Thanks @eps1lon! - Tracing no longer records Next.js control-flow errors as span errors. Redirects, notFound, and the rejected hanging promises of aborted prerenders (HANGING_PROMISE_REJECTION) are re-thrown for the framework to handle, but the flag evaluation span previously reported them via span.setStatus({ code: 2, message }), polluting traces with errors like "During prerendering, connection() rejects when the prerender is complete" on every aborted runtime prefetch. These spans are now reported as successful (status Ok), since the traced function completed as intended and the error is framework control flow, while genuine evaluation failures keep marking spans as errored.
View originalPermalink
How 4.2.2 went

4.2.1

Fixed 1
  • Allow passing a NextRequest or Web Request directly to flag(req) and evaluate(flags, req) outside App Router, fixing empty headers when NextRequest was passed to a flag
Patch Changes
  • #434 4d6eb10 Thanks @dferber90! - Allow passing a NextRequest / Web Request directly to flag(req) and evaluate(flags, req) outside App Router (e.g. in routing middleware).

    Previously only a Pages Router IncomingMessage, or a manually-flattened headers object, worked when calling a flag directly — passing a NextRequest produced empty headers because it wasn't recognized as already having a Headers instance.

View originalPermalink
How 4.2.1 went

4.1.1

Fixed 1
  • Recognize hanging promise rejection as internal Next.js error
Patch Changes
View originalPermalink
How 4.1.1 went

4.1.0

Added 1
  • Support bulk evaluation of multiple flags at once through a new `bulkDecide` method in adapters, improving performance by up to 20x when evaluating 100 flags
Changed 2
  • The `evaluate()` and `precompute()` functions now defer bulk evaluation to adapters that support it, falling back to individual flag evaluation otherwise
  • Tracing now emits an `evaluate` span with a `flagCount` attribute, and uses `batch` spans for bulk-evaluated flag groups instead of individual per-flag `run` spans
Minor Changes
  • #385 201f9d5 Thanks @dferber90! - When applications call evaluate() or precompute() function from flags/next it now defers bulk evaluation to the underlying adapters in case those support it, or otherwise falls back to evaluating each flag individually.

    This speeds up evaluation for applications that need to evaluate multiple flags at once, as the runtime needs to handle fewer promises and more work is reused. In testing we have seen a 20x improvement when called with 100 flags.

    import { evaluate } from "flags/next";
    import { flagA, flagB } from "../flags";
    
    // pass a list of flags
    const [valueA, valueB] = await evaluate([flagA, flagB]);
    
    // pass an object
    const { a, b } = await evaluate({ a: flagA, b: flagB });
    

    Adapters can opt into bulk evaluation by implementing a bulkDecide method and setting a stable adapterId. When both are present, flag evaluation groups flags that share the same adapterId and identify source and invokes bulkDecide once per group instead of calling decide per flag. Flags without a bulk-capable adapter still resolve through the normal per-flag path inside evaluate() and still benefit from now reusing the shared per-request headers, cookies, and overrides reads.

    Tracing reflects this grouping. evaluate() (and therefore precompute()) now emits an evaluate span carrying a flagCount attribute. Within it, bulk-evaluated flags no longer emit an individual per-flag run span; instead each adapter group emits a single batch span (carrying the adapterId, the keys evaluated in the batch, and cachedCount/overrideCount/decidedCount attributes summarizing how the batch resolved) so per-flag instrumentation overhead is not reintroduced. Flags that fall back to the per-flag path continue to emit their own flag span as before.

View originalPermalink
How 4.1.0 went

4.0.6

Changed 2
  • Improve performance by caching next/headers imports to avoid unnecessary event loop iterations in Next.js App Router
  • Reduce microtask queue overhead in flag evaluation by replacing async IIFE around decide() with direct call and Promise.resolve()
Patch Changes
  • c08f3e5: Improve performance by caching next/headers imports.

    Previously every flag evaluation in Next.js App Router would run await import("next/headers"). The imported module is cached by the runtime, but we would still go through the event loop unnecessarily.

    Now we cache the resolved module in a local variable so only the first call awaits the dynamic import; subsequent calls skip the microtask entirely.

  • c08f3e5: Reduce microtask queue overhead in flag evaluation by replacing the async IIFE around decide() with a direct call and Promise.resolve().

View originalPermalink
How 4.0.6 went

4.0.5

Fixed 1
  • Guard internal flag hooks when Vercel does not expose the expected runtime helpers during evaluation
Patch Changes
  • dd1396e: Guard internal flag hooks when Vercel does not expose the expected runtime helpers during evaluation.
View originalPermalink
How 4.0.5 went

4.0.4

Fixed 1
  • Handle when an app goes from precomputing one or more flags to precomputing none by using __no_flags__ as the serialized value so the app will still rewrite and prerender the page
Patch Changes
  • 77727aa: The Flags SDK now handles when an app goes from precomputing one or more flags to precomputing none.

    In this case we use __no_flags__ as the serialized value so the app will still rewrite and prerender the page.

    precompute, generatePermutations, serialize and deserialize were adjusted to generate and parse __no_flags__ correctly.

View originalPermalink
How 4.0.4 went

4.0.3

Changed 1
  • Throw an error at declaration time if a feature flag is declared without a decide function or with an adapter that is missing a decide function
Patch Changes
  • 795dfd4: Throw on declaration if flag is missing decide function.

    When a feature flag is declared without a decide function, or with an adapter that is missing a decide function we will now throw an error at declaration time.

View originalPermalink
How 4.0.3 went

4.0.2

Patch Changes
  • 5f3757a: drop tsconfig dependency
View originalPermalink
How 4.0.2 went

4.0.1

Added 1
  • expose clearDedupeCacheForCurrentRequest to allow clearing the cache of a deduped function for the current request
Patch Changes
  • d4108c8: - expose clearDedupeCacheForCurrentRequest to allow clearing the cache of a deduped function for the current request
View originalPermalink
How 4.0.1 went
View all

Discussion