Learn Pinia (the official state management library for Vue) from the ground up to production-grade: pre-requisites & environment setup, history & background, core concepts & main architecture, installation setup & first store, options store vs setup store, state & reactivity, getters & derived state, actions & async logic, plugin system, persistence & state storage, devtools & debugging, SSR & nuxt integration, composing stores, performance & reactivity tuning, async server state & advanced integration, security & best practices, typescript deep dive, testing with @pinia/testing, custom plugins & advanced lifecycle, scaling store architecture, the latest stable v4 features, production-ready architecture, and finally alternative ecosystems & final reflections, across a total of 23 episodes.
Before touching Pinia, you need to master modern JavaScript, basic TypeScript, and the Vue 3 Composition API. In this episode you will also set up a Vue project with Vite, install pinia, and verify that the Pinia instance is correctly installed.

This episode traces Pinia's origins: from the Flux-based Vuex 3 and 4, to the birth of Pinia as an experiment by Eduardo San Martin Morote in 2019, to its adoption as the Vue team's official standard in 2022. You will also compare Pinia with Vuex, manual composables, and signal-based stores.

This episode dissects the anatomy of a Pinia store: state for reactive data, getters for derived state, and actions for mutations and side effects. You also understand how Pinia works behind the scenes, the createPinia and app.use installation, and the difference between Options stores and Setup stores.

In this episode you complete the Pinia installation and create the first store: a counter store with a count state and an increment action. You also use that store inside a component, including how to access state and call an action from the template and the script.

Pinia provides two equally capable styles of writing stores: the Options store with state, getters, and actions, and the Setup store based on the Composition API. This episode writes the same store in both styles, then discusses when to choose each one and the advantage of Setup stores in using composables.

This episode dissects how to manage Pinia state: direct access, multi-field updates with $patch, resetting with $reset, and reactive destructuring with storeToRefs. You also understand the difference between ordinary destructuring, which kills reactivity, and storeToRefs, which keeps it alive.

A getter is a store's computed property for derived state. This episode covers simple getters, getters that access another store's state, parameterized getters that return a function, and the memoization behavior that distinguishes getters without arguments from parameterized getters.

An action is where mutation logic and side effects live in Pinia. This episode covers basic actions, async actions that call APIs with loading and error status, and actions that call other stores. You also learn reusability patterns so an action can be called from any component.

Plugins are how Pinia extends all stores at once. This episode covers creating a plugin with pinia.use, adding global properties to stores, accepting plugin options through the options argument, and using $subscribe and $onAction for store-level observability.

Application state often needs to survive a browser refresh. This episode covers pinia-plugin-persistedstate for syncing to localStorage and sessionStorage, picking which fields to persist, using custom storage like IndexedDB, and handling rehydration safely.
