Skip to main content
Vuetify0 v1.0 is here
Vuetify0 Logo
Theme
Mode
Palettes
Accessibility
Vuetify One
Sign in to Vuetify One

Access premium tools across the Vuetify ecosystem — Bin, Play, Studio, and more.

Not a subscriber? See what's included

useFeatures

Manage feature flags and variations across your application.

Edit this page
Report a Bug
Open issues
View on GitHub
Copy Markdown

PreviewIntermediateJun 29, 2026

Installation

Install the Features plugin in your app’s entry point:

main.ts
import { createApp } from 'vue'
import { createFeaturesPlugin } from '@vuetify/v0'
import App from './App.vue'

const app = createApp(App)

app.use(
  createFeaturesPlugin({
    features: {
      analytics: true,
      debug_mode: false,
      notifications: false,
      search: { $value: true, $variation: 'v2' },
    },
  })
)

app.mount('#app')

Usage

Once the plugin is installed, access feature flags and variations in any component:

UseFeatures
<script setup lang="ts">
  import { useFeatures } from '@vuetify/v0'

  const features = useFeatures()
</script>

<template>
  <div>
    <p>Analytics: {{ features.get('analytics') }}</p>
    <p>Debug Mode: {{ features.get('debug_mode') }}</p>
    <p>Notifications: {{ features.get('notifications') }}</p>
    <p>Search Variation: {{ features.variation('search', 'v1') }}</p>
  </div>
</template>

Optionally register features at runtime:

UseFeatures
<script setup lang="ts">
  import { useFeatures } from '@vuetify/v0'

  const features = useFeatures()

  // Register at runtime
  features.register({ id: 'beta', value: false })

  // Enable/disable via selection helpers
  features.select('beta')
  features.unselect('analytics')
</script>

Adapters

Adapters let you swap the underlying feature flag provider without changing your application code.

AdapterImportDescription
PostHogFeaturesAdapter@vuetify/v0/features/adapters/posthogPostHog↗︎ integration
FlagsmithFeaturesAdapter@vuetify/v0/features/adapters/flagsmithFlagsmith↗︎ integration
LaunchDarklyFeaturesAdapter@vuetify/v0/features/adapters/launchdarklyLaunchDarkly↗︎ integration

Flagsmith

Flagsmith↗︎ is an open-source feature flag platform. Requires the @flagsmith/flagsmith package.

bash
pnpm add @flagsmith/flagsmith
ts
import flagsmith from '@flagsmith/flagsmith'
import { FlagsmithFeaturesAdapter } from '@vuetify/v0/features/adapters/flagsmith'

app.use(createFeaturesPlugin({
  adapter: new FlagsmithFeaturesAdapter(flagsmith, {
    environmentID: '<YOUR_ENV_ID>',
    // ...other flagsmith options
  })
}))

LaunchDarkly

LaunchDarkly↗︎ is a feature management platform. Requires the launchdarkly-js-client-sdk package.

bash
pnpm add launchdarkly-js-client-sdk
ts
import * as LDClient from 'launchdarkly-js-client-sdk'
import { LaunchDarklyFeaturesAdapter } from '@vuetify/v0/features/adapters/launchdarkly'

const client = LDClient.initialize('<YOUR_CLIENT_SIDE_ID>', { key: 'user-key' })

await client.waitForInitialization()

app.use(createFeaturesPlugin({
  adapter: new LaunchDarklyFeaturesAdapter(client)
}))

PostHog

PostHog↗︎ is an open-source product analytics and feature flag platform. Requires the posthog-js package.

bash
pnpm add posthog-js
ts
import posthog from 'posthog-js'
import { PostHogFeaturesAdapter } from '@vuetify/v0/features/adapters/posthog'

posthog.init('<YOUR_PROJECT_API_KEY>', { api_host: 'https://app.posthog.com' })

app.use(createFeaturesPlugin({
  adapter: new PostHogFeaturesAdapter(posthog)
}))

Multiple Adapters

You can combine flags from multiple sources by passing an array of adapters. They are initialized in order, and flags are merged (last one wins for conflicting keys).

ts
import { FlagsmithFeaturesAdapter } from '@vuetify/v0/features/adapters/flagsmith'
import { PostHogFeaturesAdapter } from '@vuetify/v0/features/adapters/posthog'

app.use(createFeaturesPlugin({
  adapter: [
    new FlagsmithFeaturesAdapter(flagsmith, options),
    new PostHogFeaturesAdapter(posthog),
  ]
}))

Custom Adapters

Create custom adapters by extending FeaturesAdapter.

ts
import { FeaturesAdapter } from '@vuetify/v0'
import type { FeaturesAdapterFlags } from '@vuetify/v0'

class WindowFeaturesAdapter extends FeaturesAdapter {
  setup (onUpdate: (flags: FeaturesAdapterFlags) => void): FeaturesAdapterFlags {
    const update = (event: CustomEvent) => {
      onUpdate(event.detail)
    }

    window.addEventListener('v0:update-features', update as EventListener)

    this.disposeFn = () => {
      window.removeEventListener('v0:update-features', update as EventListener)
    }

    // Return initial state if available, or empty object
    return window.__INITIAL_FEATURES__ || {}
  }

  dispose () {
    this.disposeFn()
  }

  private disposeFn = () => {}
}

Adapter Base Class

The adapter pattern decouples feature flags from the underlying provider.

Adapter Data Flow

Use controls to zoom and pan. Click outside or press Escape to close.

Adapter Data Flow
ts
abstract class FeaturesAdapter {
  /**
   * Initialize the adapter and return initial flags.
   *
   * @param onUpdate Callback invoked when flags change.
   * @returns Initial feature flags.
   */
  abstract setup (onUpdate: (flags: FeaturesAdapterFlags) => void): FeaturesAdapterFlags

  /**
   * Cleanup adapter resources.
   */
  dispose? (): void
}

Architecture

useFeatures extends createGroup for multi-selection and createTokens for variations:

Features Hierarchy

Use controls to zoom and pan. Click outside or press Escape to close.

Features Hierarchy

Reactivity

Feature flags inherit reactivity from createGroup. Selection state is reactive, but lookup methods return static values.

PropertyReactiveNotes
selectedIdsSet of enabled feature IDs
selectedItemsComputed array of enabled features
ticket isSelectedtrue when this feature is enabled
variation(id, fallback?)Returns the $variation value for a feature, or fallback if unset

Examples

Feature flag admin panel

A provider/consumer demo where one features context drives two independent consumers: an admin panel that mutates flags and a storefront preview that reacts live. FeatureProvider calls createFeaturesContext with a scoped namespace and provides it through its default slot, so every descendant resolves the same flag registry without prop-drilling. Five flags are registered up front — three boolean and two carrying a $variation payload — and the variation flags auto-enable because their $value is true.

The panel reads useProxyRegistry to iterate tickets reactively, flips boolean flags with features.toggle(id), and changes a variation with features.sync({ [id]: { $value, $variation } }) — preserving the current enabled state by reading features.selectedIds.has(id). The preview consumes the same context but never mutates it: it derives a reactive map from ticket.isSelected and features.variation(id), then gates the beta banner, dark theme, checkout label, and grid-vs-list layout off that map. Because both consumers inject one registry, a toggle in the panel re-renders the preview on the next tick.

Reach for this split when flag-editing UI and flag-consuming UI live in different parts of the tree, or as a template for an adapter integration where remote flag state from usePermissions or a service like LaunchDarkly replaces the static config. See the Adapters section for swapping the built-in context for an external provider, and createTokens for how variation payloads are stored.

FileRole
context.tsShared namespace, flag metadata, and the config builder
FeatureProvider.vueCreates the features context and provides it via slot
FeaturePanel.vueAdmin consumer that toggles flags and picks variations
FeaturePreview.vueGated consumer that reacts to flags and variations live
feature-flags.vueEntry that wraps the provider around both consumers

Feature flags

3 / 5 on
  • Express checkout

    Single-page checkout with saved cards

  • Dark storefront

    Opt-in dark color scheme

  • Beta banner

    Promo ribbon shown to early-access users

  • Search engine

    Backend that powers product search

  • Product layout

    How the catalog grid is presented

Search productssemantic
Aurora Lamp$48
Mesa Planter$22
Drift Chair$210
Loom Throw$64

FAQ

Discord
Need help? Join our community for support and discussions ↗

API Reference

The following API details are for the useFeatures composable.
Was this page helpful?

© 2016-1970 Vuetify, LLC
Services
Ctrl+/