Every Laravel starter kit now builds with Vite+, the unified toolchain released in beta on July 2, 2026. Taylor Otwell announced the switch on X:
All Laravel starter kits now ship with Vite+.
The work landed in laravel/maestro#60 from Wendell Adriel, and Maestro synced the change out to the React, Vue, Svelte, and Livewire repositories the same day. The pull request touches all starter kit variants and pins vite-plus at 0.3.0.
Vite+ is a single CLI called vp that wraps Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task, and manages your runtime and package manager alongside them. For the starter kits, the practical result is that ESLint and Prettier are no longer part of the frontend setup.
Four Commands Become Two
The Inertia kits previously carried separate lint, lint:check, format, and format:check scripts. Those collapse into vp check, which formats with Oxfmt, lints with Oxlint, and type checks in one pass:
"scripts": { "build": "vp build", "build:ssr": "vp build && vp build --ssr", "dev": "vp dev", "check": "vp check", "check:fix": "vp check --fix", "types:check": "tsc --noEmit"}
composer ci:check follows the same path, running npm run check where it used to run npm run lint:check and npm run format:check back to back.
Deleting the old toolchain removed eslint.config.js, .prettierrc, and .prettierignore from each Inertia kit, along with roughly a dozen devDependencies: eslint, typescript-eslint, prettier, prettier-plugin-tailwindcss, the ESLint plugins for React, Vue, Svelte, and imports, and globals. The React kit alone dropped 129 lines of ESLint config.
Lint and Format Rules Move Into vite.config
With the standalone config files gone, the rules now live in vite.config.ts under lint and fmt keys. Warnings are treated as failures, and type-aware linting is on:
import { defineConfig, lazyPlugins } from 'vite-plus'; export default defineConfig({ plugins: lazyPlugins(() => [ // ... ]), lint: { ignorePatterns: [ 'vendor/**', 'bootstrap/ssr/**', 'resources/js/actions/**', 'resources/js/components/ui/*', 'resources/js/routes/**', 'resources/js/wayfinder/**', ], options: { denyWarnings: true, typeAware: true, }, }, fmt: { printWidth: 80, tabWidth: 4, singleQuote: true, semi: true, sortTailwindcss: { functions: ['clsx', 'cn', 'cva'], entryPoint: 'resources/css/app.css', }, },});
Per-Stack Changes
The React kit moved to @vitejs/plugin-react v6 and now runs the React Compiler through @rolldown/plugin-babel rather than the plugin's babel option:
import babel from '@rolldown/plugin-babel';import react, { reactCompilerPreset } from '@vitejs/plugin-react'; // ...react(),babel({ presets: [reactCompilerPreset()],}),
The Svelte kit swapped lucide-svelte for the supported @lucide/svelte package. The Livewire kit got the smallest diff of the four, since it has no TypeScript to lint: two files changed, moving dev and build to vp and wrapping its plugins in lazyPlugins().
Trying It
New applications generated from the starter kits pick this up automatically. To move an existing Vite project across, VoidZero provides a migration command:
vp migrate
The migration guide notes that complex projects may still need manual follow-up, so read it before running this against production code.
The full diff is in laravel/maestro#60, and the Vite+ documentation lives at viteplus.dev.