Your tutorial says route('posts.store'), your starter kit says store(), and you’re wondering which one is wrong. Neither, but you only want one. Here is why the current kit skips Ziggy and what to do with old code.
TL;DR
- The Vue starter kit uses Wayfinder, not Ziggy.
- Do not install Ziggy on the kit: two URL builders, only one checked.
@routesships every named route to the browser.- An existing app on Ziggy can keep it.
A Vue tutorial from a few years ago tells you to install Ziggy, drop @routes in the root Blade file, and call route('posts.store') from the page. That was how a Blade-less page learned Laravel’s named routes. The Vue starter kit does not do it that way. It generates a TypeScript function per controller action with Wayfinder, and the form calls that function.
Gotcha: two URL builders
Do not install Ziggy on that kit. You would have two ways to build the same URL, and only one of them is checked when the route changes. Wayfinder itself is typed routes in Vue. This page is only the choice. The stack is Laravel and Vue in 2026.
An app that already runs Ziggy, including an old Breeze app, can keep it. This page does not migrate that app. The Breeze and Jetstream map is the same kind of decision for auth.
What the old tutorial installs#
composer require tightenco/ziggyThe Blade root then prints every named route into the page with @routes. Vue calls route('posts.store') and gets a string. A form that posts to a string still needs the method:
<Form :action="route('posts.store')" method="post">Heads up: every named route is public
@routes sends the named route list to the browser. Anything you named is in that payload, including routes the current page never calls.
What the kit already generates#
Ziggy (older tutorials), then Wayfinder (Vue starter kit):
<Form :action="route('posts.store')" method="post"><Form :action="store()">php artisan wayfinder:generateImport the action the generator wrote and pass the function. Inertia reads the URL and the method from it, so you do not also set method.
<script setup lang="ts">
import { store } from "@/actions/App/Http/Controllers/PostController";
</script>
<template>
<Form :action="store()">
</template>The generator’s files and the update(post.id) case stay in the Wayfinder guide. Check the generated file before you invent a helper it did not write.
Check what your app already has
composer show tightenco/ziggy 2>/dev/null && echo "Ziggy installed" || echo "no Ziggy"
ls resources/js/actions >/dev/null 2>&1 && echo "Wayfinder actions present"Do not keep both#
On the Vue starter kit, skip composer require tightenco/ziggy, skip @routes, and skip a Ziggy plugin in resources/js/app.ts. The kit’s app.ts does not register one. Adding it does not make store() start working.
route('posts.store') is a string. store() is the Wayfinder action. Pick the one the app already has. A separate Vue SPA that is not Inertia does not use either of these for its own URLs. That router is Vue Router.
Recap#
- Ziggy printed named routes into the page; Wayfinder generates typed functions.
- On the Vue kit, use Wayfinder only.
- Old Ziggy apps can stay as they are.
- A separate SPA uses Vue Router for its own URLs.
FAQ#
Is Ziggy deprecated for Laravel Vue?
Ziggy still works, but the Laravel 13 Vue starter kit uses Wayfinder instead and does not install Ziggy.
Can I use Ziggy and Wayfinder together?
Avoid it. You would have two ways to build the same URL and only one is type-checked.
Do I need to migrate an existing Ziggy app?
No. An app that already runs Ziggy, including an old Breeze app, can keep it.



