Ziggy or Wayfinder for Laravel routes in Vue

Old tutorials install Ziggy and call route(). The Vue starter kit generates Wayfinder functions. Do not install both.

For your AI agent

Copies a prompt. Paste it into the AI agent you already have open.

Read https://laravel-vuejs.space/laravel-ziggy-vue.md
Old tutorials install Ziggy and call route(). The Vue starter kit generates Wayfinder functions. Do not install both.
Do not install Ziggy on the kit: two URL builders, only one checked.
Do not install Ziggy on that kit.
Show the diff. Do not commit.

Next: Laravel 13.35: QUERY routes, Markdown responses and model defaults()

On this page · 7 sections
  1. What the old tutorial installs
  2. What the kit already generates
  3. Do not keep both
  4. Recap
  5. FAQ
  6. Next steps
  7. Sources

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.
  • @routes ships every named route to the browser.
  • An existing app on Ziggy can keep it.

What you'll learn

  • What Ziggy did and what replaced it
  • How the old and new form calls compare
  • When it is fine to keep Ziggy

Who it's for: Developers following older Laravel + Vue tutorials

Applies to: Laravel 13 · Vue starter kit · Wayfinder · Ziggy

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#

bash
composer require tightenco/ziggy

The 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:

vue
<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):

resources/js/pages/posts/Create.vuevue
<Form :action="route('posts.store')" method="post">
resources/js/pages/posts/Create.vuevue
<Form :action="store()">
bash
php artisan wayfinder:generate

Import 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.

resources/js/pages/posts/Create.vuevue
<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

bash
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.

Next steps#

Sources#

Found this useful?

Ask questions, share what you built.

Join thousands of Laravel and Vue developers in our Facebook group, or get new posts in your Telegram feed. Sharing this article helps too.

Keep reading

Newsletter

Get the best of Laravel & Vue, once a month.

One short email with new guides, release notes worth reading and hand-picked community links. No spam, unsubscribe any time.