vuejs/pinia

๐Ÿ Intuitive, type safe, light and flexible Store for Vue using the composition api with DevTools support

14,717

stars

2,268

commits

TypeScript

primary language

Sep 6, 2026

updated

pinia.vuejs.org
composition-api
ssr
store
vue
vuex
Browse cluster: Vue.js state management and SSR โ†’

README

Pinia logo


npm package build status


Pinia

Intuitive, type safe and flexible Store for Vue

  • ๐Ÿ’ก Intuitive
  • ๐Ÿ”‘ Type Safe
  • โš™๏ธ Devtools support
  • ๐Ÿ”Œ Extensible
  • ๐Ÿ— Modular by design
  • ๐Ÿ“ฆ Extremely light
  • โ›ฐ๏ธ Nuxt Module

The latest version of pinia works with Vue 3. See the branch v2 for a version that works with Vue 2.

Pinia is the most similar English pronunciation of the word pineapple in Spanish: piรฑa. A pineapple is in reality a group of individual flowers that join together to create a multiple fruit. Similar to stores, each one is born individually, but they are all connected at the end. It's also a delicious tropical fruit indigenous to South America.

๐Ÿ‘‰ Demo with Vue 3 on StackBlitz

๐Ÿ‘‰ Demo with Nuxt 3 on StackBlitz

Help me keep working on this project ๐Ÿ’š

Gold Sponsors

CodeRabbit

Silver Sponsors

VueMastery Controla SendCloud

Bronze Sponsors

RTVision Storyblok


FAQ

A few notes about the project and possible questions:

Q: Is Pinia the successor of Vuex?

A: Yes

Q: What about dynamic modules?

A: Dynamic modules are not type safe, so instead we allow creating different stores that can be imported anywhere

Installation

# or pnpm or yarn
npm install pinia @vue/devtools-api

Usage

Install the plugin

Create a pinia (the root store) and pass it to app:

// Vue 3
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const pinia = createPinia()
const app = createApp(App)

app.use(pinia)
app.mount('#app')

For more detailed instructions, including Nuxt configuration, check the Documentation.

Create a Store

You can create as many stores as you want, and they should each exist in different files:

import { defineStore } from 'pinia'

// main is the name of the store. It is unique across your application
// and will appear in devtools
export const useMainStore = defineStore('main', {
  // a function that returns a fresh state
  state: () => ({
    counter: 0,
    name: 'Eduardo',
  }),
  // optional getters
  getters: {
    // getters receive the state as first parameter
    doubleCounter: (state) => state.counter * 2,
    // use getters in other getters
    doubleCounterPlusOne(): number {
      return this.doubleCounter + 1
    },
  },
  // optional actions
  actions: {
    reset() {
      // `this` is the store instance
      this.counter = 0
    },
  },
})

defineStore returns a function that has to be called to get access to the store:

import { useMainStore } from '@/stores/main'
import { storeToRefs } from 'pinia'

export default defineComponent({
  setup() {
    const main = useMainStore()

    // extract specific store properties
    const { counter, doubleCounter } = storeToRefs(main)

    return {
      // gives access to the whole store in the template
      main,
      // gives access only to specific state or getter
      counter,
      doubleCounter,
    }
  },
})

Documentation

To learn more about Pinia, check its documentation.

License

MIT

Contributors

(top 30 of 297)

posva

1,552 commits

dependabot[bot]

213 commits

renovate-bot

27 commits

vuejs/pinia

๐Ÿ Intuitive, type safe, light and flexible Store for Vue using the composition api with DevTools support

14,717

stars

2,268

commits

TypeScript

primary language

Sep 6, 2026

updated

pinia.vuejs.org
composition-api
ssr
store
vue
vuex
Browse cluster: Vue.js state management and SSR โ†’

README

Pinia logo


npm package build status


Pinia

Intuitive, type safe and flexible Store for Vue

  • ๐Ÿ’ก Intuitive
  • ๐Ÿ”‘ Type Safe
  • โš™๏ธ Devtools support
  • ๐Ÿ”Œ Extensible
  • ๐Ÿ— Modular by design
  • ๐Ÿ“ฆ Extremely light
  • โ›ฐ๏ธ Nuxt Module

The latest version of pinia works with Vue 3. See the branch v2 for a version that works with Vue 2.

Pinia is the most similar English pronunciation of the word pineapple in Spanish: piรฑa. A pineapple is in reality a group of individual flowers that join together to create a multiple fruit. Similar to stores, each one is born individually, but they are all connected at the end. It's also a delicious tropical fruit indigenous to South America.

๐Ÿ‘‰ Demo with Vue 3 on StackBlitz

๐Ÿ‘‰ Demo with Nuxt 3 on StackBlitz

Help me keep working on this project ๐Ÿ’š

Gold Sponsors

CodeRabbit

Silver Sponsors

VueMastery Controla SendCloud

Bronze Sponsors

RTVision Storyblok


FAQ

A few notes about the project and possible questions:

Q: Is Pinia the successor of Vuex?

A: Yes

Q: What about dynamic modules?

A: Dynamic modules are not type safe, so instead we allow creating different stores that can be imported anywhere

Installation

# or pnpm or yarn
npm install pinia @vue/devtools-api

Usage

Install the plugin

Create a pinia (the root store) and pass it to app:

// Vue 3
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const pinia = createPinia()
const app = createApp(App)

app.use(pinia)
app.mount('#app')

For more detailed instructions, including Nuxt configuration, check the Documentation.

Create a Store

You can create as many stores as you want, and they should each exist in different files:

import { defineStore } from 'pinia'

// main is the name of the store. It is unique across your application
// and will appear in devtools
export const useMainStore = defineStore('main', {
  // a function that returns a fresh state
  state: () => ({
    counter: 0,
    name: 'Eduardo',
  }),
  // optional getters
  getters: {
    // getters receive the state as first parameter
    doubleCounter: (state) => state.counter * 2,
    // use getters in other getters
    doubleCounterPlusOne(): number {
      return this.doubleCounter + 1
    },
  },
  // optional actions
  actions: {
    reset() {
      // `this` is the store instance
      this.counter = 0
    },
  },
})

defineStore returns a function that has to be called to get access to the store:

import { useMainStore } from '@/stores/main'
import { storeToRefs } from 'pinia'

export default defineComponent({
  setup() {
    const main = useMainStore()

    // extract specific store properties
    const { counter, doubleCounter } = storeToRefs(main)

    return {
      // gives access to the whole store in the template
      main,
      // gives access only to specific state or getter
      counter,
      doubleCounter,
    }
  },
})

Documentation

To learn more about Pinia, check its documentation.

License

MIT

Contributors

(top 30 of 297)

posva

1,552 commits

dependabot[bot]

213 commits

renovate-bot

27 commits

Languages

TypeScript

76.9%

Vue

18.7%

JavaScript

2.0%

CSS

1.8%