diff --git a/README.md b/README.md
index b99f6bc2..ea6d596a 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,12 @@ Client side React SDK
[Read the docs](packages/react-sdk/README.md)
+## Vue SDK (beta)
+
+Client side Vue SDK
+
+[Read the docs](packages/vue-sdk/README.md)
+
## Browser SDK
Browser SDK for use in non-React web applications
diff --git a/packages/eslint-config/base.js b/packages/eslint-config/base.js
index 107ee2ac..af741e34 100644
--- a/packages/eslint-config/base.js
+++ b/packages/eslint-config/base.js
@@ -7,6 +7,7 @@ const globals = require("globals");
const tsPlugin = require("@typescript-eslint/eslint-plugin");
const tsParser = require("@typescript-eslint/parser");
const prettierConfig = require("eslint-config-prettier");
+const vuePlugin = require("eslint-plugin-vue");
module.exports = [
{
@@ -22,6 +23,7 @@ module.exports = [
"**/*.jsx",
"**/*.ts",
"**/*.tsx",
+ "**/*.vue",
],
plugins: {
import: importsPlugin,
@@ -104,6 +106,7 @@ module.exports = [
files: ["**/*.ts", "**/*.tsx"],
plugins: {
"@typescript-eslint": tsPlugin,
+ vue: vuePlugin,
},
languageOptions: {
parser: tsParser,
@@ -154,6 +157,7 @@ module.exports = [
"**/*.jsx",
"**/*.ts",
"**/*.tsx",
+ "**/*.vue",
],
rules: {
...prettierConfig.rules,
diff --git a/packages/vue-sdk/.prettierignore b/packages/vue-sdk/.prettierignore
new file mode 100644
index 00000000..5a0ae0bb
--- /dev/null
+++ b/packages/vue-sdk/.prettierignore
@@ -0,0 +1,3 @@
+dist
+eslint-report.json
+dev
diff --git a/packages/vue-sdk/README.md b/packages/vue-sdk/README.md
new file mode 100644
index 00000000..4bdb409f
--- /dev/null
+++ b/packages/vue-sdk/README.md
@@ -0,0 +1,395 @@
+# Bucket Vue SDK (beta)
+
+Vue client side library for [Bucket.co](https://bucket.co)
+
+Bucket supports feature toggling, tracking feature usage, requesting feedback on features and remotely configuring features.
+
+The Bucket Vue SDK comes with the same built-in toolbar as the browser SDK which appears on `localhost` by default.
+
+## Install
+
+Install via npm:
+
+```shell
+npm i @bucketco/vue-sdk
+```
+
+## Get started
+
+### 1. Wrap your application with the `BucketProvider`
+
+```vue
+
+
+
+
+
+```
+
+### 2. Use `useFeature(key)` to get feature status
+
+```vue
+
+
+
+
+
+
+
+
+```
+
+## Setting `user` and `company`
+
+Bucket determines which features are active for a given `user`, `company`, or `otherContext`.
+You pass these to the `BucketProvider` as props.
+
+If you supply `user` or `company` objects, they must include at least the `id` property otherwise they will be ignored in their entirety.
+In addition to the `id`, you must also supply anything additional that you want to be able to evaluate feature targeting rules against.
+Attributes which are not properties of the `user` or `company` can be supplied using the `otherContext` prop.
+
+Attributes cannot be nested (multiple levels) and must be either strings, numbers or booleans.
+A number of special attributes exist:
+
+- `name` -- display name for `user`/`company`,
+- `email` -- the email of the user,
+- `avatar` -- the URL for `user`/`company` avatar image.
+
+```vue
+
+```
+
+To retrieve features along with their targeting information, use `useFeature(key: string)` hook (described in a section below).
+
+Note that accessing `isEnabled` on the object returned by `useFeature()` automatically
+generates a `check` event.
+
+## Remote config
+
+Remote config is a dynamic and flexible approach to configuring feature behavior outside of your app – without needing to re-deploy it.
+
+Similar to `isEnabled`, each feature accessed using the `useFeature()` hook, has a `config` property. This configuration is managed from within Bucket. It is managed similar to the way access to features is managed, but instead of the
+binary `isEnabled` you can have multiple configuration values which are given to different user/companies.
+
+### Get started with Remote config
+
+```ts
+const {
+ isEnabled,
+ config: { key, payload },
+} = useFeature("huddles");
+
+// isEnabled: true,
+// key: "gpt-3.5",
+// payload: { maxTokens: 10000, model: "gpt-3.5-beta1" }
+```
+
+`key` is mandatory for a config, but if a feature has no config or no config value was matched against the context, the `key` will be `undefined`. Make sure to check against this case when trying to use the configuration in your application. `payload` is an optional JSON value for arbitrary configuration needs.
+
+Note that, similar to `isEnabled`, accessing `config` on the object returned by `useFeature()` automatically
+generates a `check` event.
+
+## `` component
+
+The `` initializes the Bucket SDK, fetches features and starts listening for automated feedback survey events. The component can be configured using a number of props:
+
+- `publishableKey` is used to connect the provider to an _environment_ on Bucket. Find your `publishableKey` under [environment settings](https://app.bucket.co/envs/current/settings/app-environments) in Bucket,
+- `company`, `user` and `otherContext` make up the _context_ that is used to determine if a feature is enabled or not. `company` and `user` contexts are automatically transmitted to Bucket servers so the Bucket app can show you which companies have access to which features etc.
+ > [!Note]
+ > If you specify `company` and/or `user` they must have at least the `id` property, otherwise they will be ignored in their entirety. You should also supply anything additional you want to be able to evaluate feature targeting against,
+- `fallbackFeatures`: A list of strings which specify which features to consider enabled if the SDK is unable to fetch features. Can be provided in two formats:
+
+ ```ts
+ // Simple array of feature keys
+ fallbackFeatures={["feature1", "feature2"]}
+
+ // Or with configuration overrides
+ fallbackFeatures: {
+ "feature1": true, // just enable the feature
+ "feature2": { // enable with configuration
+ key: "variant-a",
+ payload: {
+ limit: 100,
+ mode: "test"
+ }
+ }
+ }
+ ```
+
+- `timeoutMs`: Timeout in milliseconds when fetching features from the server,
+- `staleWhileRevalidate`: If set to `true`, stale features will be returned while refetching features in the background,
+- `expireTimeMs`: If set, features will be cached between page loads for this duration (in milliseconds),
+- `staleTimeMs`: Maximum time (in milliseconds) that stale features will be returned if `staleWhileRevalidate` is true and new features cannot be fetched.
+
+- `enableTracking`: Set to `false` to stop sending tracking events and user/company updates to Bucket. Useful when you're impersonating a user (defaults to `true`),
+- `apiBaseUrl`: Optional base URL for the Bucket API. Use this to override the default API endpoint,
+- `appBaseUrl`: Optional base URL for the Bucket application. Use this to override the default app URL,
+- `sseBaseUrl`: Optional base URL for Server-Sent Events. Use this to override the default SSE endpoint,
+- `debug`: Set to `true` to enable debug logging to the console,
+- `toolbar`: Optional [configuration](https://docs.bucket.co/supported-languages/browser-sdk/globals#toolbaroptions) for the Bucket toolbar,
+- `feedback`: Optional configuration for feedback collection
+
+### Loading states
+
+BucketProvider lets you define a template to be shown while BucketProvider is inititalizing:
+
+```vue
+
+
+ Loading...
+
+
+
+```
+
+If you want more control over loading screens, `useIsLoading()` returns a Ref which you can use to customize the loading experience.
+
+## Hooks
+
+### `useFeature()`
+
+Returns the state of a given feature for the current context. The composable provides type-safe access to feature flags and their configurations.
+
+```vue
+
+
+
+
Loading...
+
Feature not available
+
+
+
+
+
+```
+
+### `useTrack()`
+
+`useTrack()` lets you send custom events to Bucket. Use this whenever a user _uses_ a feature.
+
+```vue
+
+
+
+
+
+
+
+```
+
+### `useRequestFeedback()`
+
+Returns a function that lets you open up a dialog to ask for feedback on a specific feature. This is useful for collecting targeted feedback about specific features.
+
+See [Automated Feedback Surveys](https://docs.bucket.co/product-handbook/live-satisfaction) for how to do this automatically, without code.
+
+When using the `useRequestFeedback` you must pass the feature key to `requestFeedback`.
+The example below shows how to use `position` to ensure the popover appears next to the "Give feedback!" button.
+
+```vue
+
+
+
+
+
+```
+
+See the [Feedback Documentation](https://github.com/bucketco/bucket-javascript-sdk/blob/main/packages/browser-sdk/FEEDBACK.md#manual-feedback-collection) for more information on `requestFeedback` options.
+
+### `useSendFeedback()`
+
+Returns a function that lets you send feedback to Bucket. This is useful if you've manually collected feedback through your own UI and want to send it to Bucket.
+
+```vue
+
+
+
+
+
+```
+
+### `useUpdateUser()`, `useUpdateCompany()` and `useUpdateOtherContext()`
+
+These composables return functions that let you update the attributes for the currently set user, company, or other context. Updates to user/company are stored remotely and affect feature targeting, while "other" context updates only affect the current session.
+
+```vue
+
+
+
+
+
+
+
+
+
+```
+
+Note: To change the `user.id` or `company.id`, you need to update the props passed to `BucketProvider` instead of using these composables.
+
+### `useClient()`
+
+Returns the `BucketClient` used by the `BucketProvider`. The client offers more functionality that
+is not directly accessible through the other composables.
+
+```vue
+
+
+
+
+
+```
+
+### `useIsLoading()`
+
+Returns a `Ref` to indicate if Bucket has finished loading.
+
+## Content Security Policy (CSP)
+
+See [CSP](https://github.com/bucketco/bucket-javascript-sdk/blob/main/packages/browser-sdk/README.md#content-security-policy-csp) for info on using Bucket React SDK with CSP
+
+## License
+
+MIT License
+
+Copyright (c) 2025 Bucket ApS
diff --git a/packages/vue-sdk/dev/plain/App.vue b/packages/vue-sdk/dev/plain/App.vue
new file mode 100644
index 00000000..5210efad
--- /dev/null
+++ b/packages/vue-sdk/dev/plain/App.vue
@@ -0,0 +1,37 @@
+
+
+
+