Skip to content
Oeiuwq Faith Blog OpenSource Porfolio

vuejs/pinia

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

vuejs/pinia.json
{
"createdAt": "2019-11-18T21:05:01Z",
"defaultBranch": "v3",
"description": "🍍 Intuitive, type safe, light and flexible Store for Vue using the composition api with DevTools support",
"fullName": "vuejs/pinia",
"homepage": "https://pinia.vuejs.org",
"language": "TypeScript",
"name": "pinia",
"pushedAt": "2025-11-17T13:01:04Z",
"stargazersCount": 14331,
"topics": [
"composition-api",
"ssr",
"store",
"vue",
"vuex"
],
"updatedAt": "2025-11-25T21:10:24Z",
"url": "https://github.com/vuejs/pinia"
}

Pinia logo


npm package build status


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.

Gold Sponsors

CodeRabbit

Silver Sponsors

Controla VueMastery SendCloud Route Optimizer and Route Planner Software

Bronze Sponsors

Storyblok Stanislas Ormières


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

Terminal window
# or pnpm or yarn
npm install pinia

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.

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,
}
},
})

To learn more about Pinia, check its documentation.

MIT