packages/docs/src/pages/en/blog/announcing-vuetify0-rc.md
Vuetify0 has reached release candidate. The API freeze announced at beta held through six beta releases: nothing was renamed, nothing was removed, and the only additions were additive — a reduced-motion plugin and an accessibility helper on the locale system. From here to v1.0, the work is final testing and documentation. No new features.
🖊️ John Leider • 📅 July 2nd, 2026
<PromotedEntry />The beta froze the public API and promised that existing composables and components would keep their names, signatures, and behavior. A month and six releases later, that promise held — and it is now enforced mechanically: a repository check fails any pull request that changes the public surface (#409).
The release candidate narrows scope further. Between now and v1.0:
After v1.0, the surface is governed by semver: breaking changes only in major releases.
At the beta announcement the totals were 49 components and 68 composables. Beta.0 itself shipped the Tooltip component with its useTooltip plugin and createDataGrid; the freeze window added useReducedMotion in beta.2. The RC surface is 50 components, 71 composables, and 24 utilities.
The RC also promotes the v1 stable set (#470): the selection family — createModel, createSelection, createSingle, createStep, createGroup, createNested — plus createRegistry and the useTheme, useStorage, and useBreakpoints plugins are now API-locked for 1.0. They join the already-stable foundation and observer composables, bringing the stable surface to 16 composables and 17 utilities.
| Maturity | Components | Composables | Utilities | What it means |
|---|---|---|---|---|
| Stable | 0 | 16 | 17 | In use across releases, no planned breaking changes |
| Preview | 40 | 55 | 7 | Feature-complete and documented |
| Draft | 10 | 0 | 0 | Experimental or planned for a future release |
::: info The full list is on the Maturity Matrix, with the current level for every component and composable. :::
The ten draft components — DatePicker, DateRangePicker, TimePicker, Otp, Alert, DataGrid, DataTable, Kanban, Virtualizer, and Tour — are experimental and sit outside the frozen surface. They are not committed to v1 and promote individually when ready.
The beta cycle ran on a weekly cadence — five follow-up releases between June 9 and the RC cut — and produced 184 commits: 60 fixes, 5 performance rewrites, and 66 documentation commits. The fixes cluster into a few themes:
<dialog> paints above all z-index, so overlays teleported to body rendered underneath it. Snackbar and Portal can now teleport into the topmost open modal instead (#397), and non-modal overlays no longer count toward stack blocking or scrim state (#354, #352).0 (#288), invalidating in-flight async validation (#294), and committing parsed NumberField values before the reactivity round-trip completes (#371).Performance work landed alongside: registry reordering moved from a Map rebuild to an order-array splice with windowed reindexing (#273), proxy registry snapshots rebuild lazily on read (#280), createDataTable replaced its reactive row registry with an event-driven version signal (#328), and Overflow visibility checks dropped from O(n²) to O(n) per resize (#417).
The largest user-facing change of the cycle is invisible until you turn on a screen reader. Every v0 component now ships a built-in English aria label through the locale system's new ti method (#372) — "translate if exists" — which returns the translation or undefined instead of echoing the key:
const label = locale.ti('Button.label') ?? 'Button'
Apps with no locale plugin get meaningful accessible names (WCAG 4.1.2) with zero locale strings bundled into the runtime. The canonical English catalog is exposed as an optional @vuetify/v0/locale/messages/en export for seeding translations.
The RC audit of the project's PHILOSOPHY document surfaced two more attribute-compliance bugs, fixed in the same pass (#451): ExpansionPanel emitted data-selected="false" instead of dropping the attribute, and Slider and Rating dropped aria-disabled entirely when enabled instead of emitting a concrete boolean for assistive tech.
Beta.2 also added the useReducedMotion plugin (#278) — a three-way system / always / never mode over prefers-reduced-motion, with a reactive flag and a body data attribute for CSS-only consumers:
import { useReducedMotion } from '@vuetify/v0'
const motion = useReducedMotion()
motion.isReduced.value // should motion be minimized right now?
motion.select('always') // force reduce
motion.select('system') // follow the OS setting
Current numbers:
::: info The benchmarks page documents the methodology and per-primitive results. :::
Numbers describe the surface; DevKey shows it in use. The developer API dashboard from the alpha tutorial is maintained as the reference v0 implementation and is updated in lockstep with releases — including this RC. Its command palette is a good picture of how the primitives compose: a Dialog, an Input, createFilter, useHotkey, and useVirtualFocus in one component (condensed from the source):
<script setup lang="ts">
import { Dialog, Input, createFilter, useHotkey, useVirtualFocus } from '@vuetify/v0'
// Cmd+K to open
useHotkey('cmd+k', () => {
open.value = true
query.value = ''
})
// Filter commands by search query
const filter = createFilter({ keys: ['label'] })
const { items: filtered } = filter.apply(query, () => commands)
// Keyboard navigation through results
const { highlightedId, onKeydown } = useVirtualFocus(
() => filtered.value.map(cmd => ({ id: cmd.id })),
{ control: search },
)
</script>
No positioning math, no key-event switch statements, no filter re-implementation — the component is mostly wiring. The full source is at vuetifyjs/devkey, and the integration guide walks through the architecture.
The 61 documentation commits were mostly one push: a full audit of the guide pages. Component and composable pages were normalized to one structure (#392), FAQ sections homogenized (#395), examples converted to multi-file copy-paste blocks (#382), and stale data corrected across the board (#458, #461).
New pages landed for testing (#283) and a core terminology glossary (#410). The release pipeline moved to Changesets (#365), and the docs now derive feature counts directly from the maturity manifest instead of hand-maintained numbers (#378).
For learning the framework, Vuetify0 Skillz — interactive, hands-on tutorials built into the docs, itself in beta — now counts three guided tours: Using the Docs, Using Search, and Using Examples, the newest landing alongside the RC (#459) to walk through live examples, the Playground, and multi-file recipes. Every page is also tagged Beginner, Intermediate, or Advanced, and the skill filter trims the navigation to the levels you choose.
As before, each documentation page has an Ask AI option, the docs publish llms.txt and llms-full.txt, and the Vuetify MCP server connects an editor to the API reference. The MCP data is synced to the RC.
::: info The Vuetify MCP guide covers connecting it to an editor. :::
The release candidate is the last milestone before v1.0:
See the roadmap for details.
Scope, not API. The beta froze names and signatures but still accepted additive features; the RC accepts none. Between now and v1.0 only release-blocking fixes and documentation land — the focus is testing, security review, and feedback. New features resume after v1.
Code written against the beta API ran through six beta releases and the RC without changes, and the same guarantee carries to v1: the surface is frozen and the freeze is enforced by a repository check on every pull request.
The ten draft components are experimental and outside the frozen surface, and each is already plotted on the public milestones: table components in v1.1, product tours in v1.2, virtualized lists, Kanban, and OTP input in v1.3, then time and date pickers in v1.4 and v1.5. Each promotes when it meets the bar.
None are planned. The only thing that could force one is a critical security vulnerability with no other fix, and it would be documented in the release notes.
Yes. They don't conflict, and you can adopt v0 primitives inside a Vuetify 4 app today. Meanwhile, Vuetify 5's internals are being refactored to use v0 directly — the frozen surface is the foundation that work builds on.
Bug reports go through issues.vuetifyjs.com — issues opened outside the generator are closed automatically. The contributing guide covers local setup and conventions, and Discord is the place to discuss before you build.
Vuetify0 is part of the Vuetify ecosystem. Documentation is at 0.vuetifyjs.com; source is on GitHub.