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

- URL: https://laravel-vuejs.space/laravel-ziggy-vue
- Author: Anass Ez-zouaine (https://laravel-vuejs.space/author/anass-ez-zouaine)
- Published: 2026-10-10
- Topics: Laravel, VueJs, Inertia

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](https://laravel-vuejs.space/laravel-wayfinder-vue). This page is only the choice. The stack is [Laravel and Vue in 2026](https://laravel-vuejs.space/laravel-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](https://laravel-vuejs.space/laravel-breeze-jetstream-vue) 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):**

`resources/js/pages/posts/Create.vue`
```vue
<Form :action="route('posts.store')" method="post">
```

**Wayfinder (Vue starter kit):**

`resources/js/pages/posts/Create.vue`
```vue
<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.vue`
```vue
<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](https://laravel-vuejs.space/vue-router-laravel-spa).

## 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

**Q: Is Ziggy deprecated for Laravel Vue?**

Ziggy still works, but the Laravel 13 Vue starter kit uses Wayfinder instead and does not install Ziggy.

**Q: 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.

**Q: 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

- [Typed routes with Wayfinder](https://laravel-vuejs.space/laravel-wayfinder-vue)
- [Breeze, Jetstream, and the Vue starter kit](https://laravel-vuejs.space/laravel-breeze-jetstream-vue)
- [Vue Router on a Laravel API](https://laravel-vuejs.space/vue-router-laravel-spa)

## Sources

- [Laravel Wayfinder on GitHub](https://github.com/laravel/wayfinder)
- [Ziggy on GitHub](https://github.com/tighten/ziggy)
