vuejs/pinia
vuejs/pinia has 14,759 GitHub stars and 1,206 forks. GitHot measured -1 stars in 24 hours. Last checked 2026-11-06 13:52 UTC. Last push 2026-11-04.
🍍 Intuitive, type safe, light and flexible Store for Vue using the composition api with DevTools support
Measured star growth
- in 24h
- -1
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalPinia
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
Silver Sponsors
Bronze Sponsors
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
Explore related projects
codecrafters-io/build-your-own-x
Master programming by recreating your favorite technologies from scratch.
560,359 starspublic-apis/public-apis
A collective list of free APIs
496,646 starsmorluto/rea
Reverse engineer anything with agents, from app behavior down to native binaries.
437,152 starsopenclaw/openclaw
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
394,047 stars