Pascal Baljet's Avatar

Pascal Baljet

@pascalbaljet

Husband of Esmée, dad of Loïs and Kate ❤️ Works at @laravel.com‬. Open-source enthusiast. Also builds inertiaui.com. https://pinkary.com/@pascalbaljet

1,506
Followers
147
Following
464
Posts
22.09.2023
Joined
Posts Following

Latest posts by Pascal Baljet @pascalbaljet

demo-v3Log in - demo-v3

Want to play with the new Inertia v3 features? @pascalbaljet.bsky.social built a comprehensive demo app!

Links straight to both the docs and the source code for every example, so you can try it in the browser and immediately see how it's implemented.

demo-v3.inertiajs.com

11.03.2026 13:50 👍 9 🔁 3 💬 0 📌 0
Preview
Inertia.js v3 Is Now in Beta | Laravel - The clean stack for Artisans and agents Inertia.js v3 beta is out. No more Axios, a new Vite plugin handles SSR automatically, and optimistic updates are now built in. Upgrade guide included.

ICYMI

laravel.com/blog/inertia...

09.03.2026 13:05 👍 12 🔁 4 💬 1 📌 0

My Table package uses Dusk for E2E tests (moving to Pest soon). Yesterday CI suddenly became very slow on my Mac Mini M1 self-hosted runner.

Turned out Chrome 145 was the culprit. Downgrading to Chrome 138 fixed it. If Dusk is slow in CI, try that! 🐌

09.03.2026 13:02 👍 2 🔁 0 💬 0 📌 0
Preview
Upgrade Guide for v3.0 - Inertia.js Documentation

This is a beta release, so we'd love your feedback. Install it, test it, and let us know what you think!

Full blog post: laravel.com/blog/inertia...

Upgrade guide: inertiajs.com/docs/v3/gett...

05.03.2026 20:01 👍 2 🔁 0 💬 0 📌 0

v3 also includes nested prop types with dot-notation support, a default layout option in 'createInertiaApp', TypeScript form component generics, enum support in 'Inertia::render()', and a 'preserveErrors' option for partial reloads.

05.03.2026 20:01 👍 3 🔁 0 💬 1 📌 0

Axios has been replaced with a built-in XHR client. Smaller bundle, fewer dependencies. Built-in HTTP interceptors provide the same extension point, and an Axios adapter is available if you prefer to keep using it.

05.03.2026 20:01 👍 2 🔁 0 💬 1 📌 0
// app/Providers/AppServiceProvider.php
use Inertia\ExceptionResponse;
use Inertia\Inertia;

Inertia::handleExceptionsUsing(function (ExceptionResponse $response) {
    if (in_array($response->statusCode(), [403, 404, 419, 429, 500, 503])) {
        return $response->render('ErrorPage', [
            'status' => $response->statusCode(),
        ])->withSharedData();
    }
});

// app/Providers/AppServiceProvider.php use Inertia\ExceptionResponse; use Inertia\Inertia; Inertia::handleExceptionsUsing(function (ExceptionResponse $response) { if (in_array($response->statusCode(), [403, 404, 419, 429, 500, 503])) { return $response->render('ErrorPage', [ 'status' => $response->statusCode(), ])->withSharedData(); } });

Custom error pages for 500s and other exceptions now have a proper API. The 'handleExceptionsUsing()' method lets you render Inertia error pages with full access to shared data 🛡️

05.03.2026 20:01 👍 2 🔁 0 💬 1 📌 0
<!-- AppLayout.vue -->
<script setup>
import { useLayoutProps } from '@inertiajs/vue3'

const layout = useLayoutProps({
    subtitle: '',
})
</script>

<template>
    <div v-if="layout.subtitle" class="banner">
        {{ layout.subtitle }}
    </div>
    <slot />
</template>

<!-- AppLayout.vue --> <script setup> import { useLayoutProps } from '@inertiajs/vue3' const layout = useLayoutProps({ subtitle: '', }) </script> <template> <div v-if="layout.subtitle" class="banner"> {{ layout.subtitle }} </div> <slot /> </template>

<!-- Any page -->
<script setup>
import { setLayoutProps, resetLayoutProps } from '@inertiajs/vue3'

setLayoutProps({ subtitle: 'Welcome back!' })

// Reset to defaults...
resetLayoutProps()
</script>

<!-- Any page --> <script setup> import { setLayoutProps, resetLayoutProps } from '@inertiajs/vue3' setLayoutProps({ subtitle: 'Welcome back!' }) // Reset to defaults... resetLayoutProps() </script>

The new 'useLayoutProps' hook lets layouts declare defaults that pages can override. Pages update layout state with 'setLayoutProps()'. Supports nested layouts as well.

05.03.2026 20:01 👍 1 🔁 0 💬 1 📌 0
<template>
    <Link
        href="/features/navigation/target"
        component="Features/Navigation/Target"
    >
        Navigate Instantly
    </Link>
</template>

<template> <Link href="/features/navigation/target" component="Features/Navigation/Target" > Navigate Instantly </Link> </template>

// Or programmatically with placeholder props...
router.visit(url, {
    component: 'Features/Navigation/Target',
    pageProps: (currentProps, sharedProps) => ({
        ...sharedProps,
        greeting: 'Loading from server...',
        items: [],
    }),
})

// Or programmatically with placeholder props... router.visit(url, { component: 'Features/Navigation/Target', pageProps: (currentProps, sharedProps) => ({ ...sharedProps, greeting: 'Loading from server...', items: [], }), })

Instant visits swap to the target page component immediately while the server request fires in the background. The user sees the new page right away with shared props, and the full data merges in when the response arrives ✨

05.03.2026 20:01 👍 3 🔁 0 💬 1 📌 0
import { router } from '@inertiajs/vue3'

router
    .optimistic((props) => ({
        post: {
            ...props.post,
            is_favorite: !props.post.is_favorite,
        },
    }))
    .post(`/posts/${post.id}/favorite`)

import { router } from '@inertiajs/vue3' router .optimistic((props) => ({ post: { ...props.post, is_favorite: !props.post.is_favorite, }, })) .post(`/posts/${post.id}/favorite`)

Optimistic updates are now built into Inertia. Chain 'optimistic()' before any router visit to apply changes instantly. If the request fails, props revert automatically 💫

05.03.2026 20:01 👍 2 🔁 0 💬 1 📌 0
<script setup>
import { useHttp } from '@inertiajs/vue3'

const http = useHttp({ name: '' })

function postToApi() {
    http.post('/api/endpoint', {
        onSuccess: (response) => {
            console.log(response)
        },
    })
}
</script>

<template>
    <input v-model="form.name" />
    <button :disabled="form.processing" @click="postToApi">
        {{ form.processing ? 'Sending...' : 'Send Request' }}
    </button>
</template>

<script setup> import { useHttp } from '@inertiajs/vue3' const http = useHttp({ name: '' }) function postToApi() { http.post('/api/endpoint', { onSuccess: (response) => { console.log(response) }, }) } </script> <template> <input v-model="form.name" /> <button :disabled="form.processing" @click="postToApi"> {{ form.processing ? 'Sending...' : 'Send Request' }} </button> </template>

Introducing the 'useHttp' hook. It gives you the same developer experience as 'useForm', but for plain HTTP requests. Reactive state, error handling, file upload progress, and request cancellation, all without triggering a page visit.

05.03.2026 20:01 👍 4 🔁 0 💬 1 📌 0

SSR in development no longer requires a separate Node.js server. With the Vite plugin, just run 'composer dev' and your pages are server-rendered. No separate build step, no separate process, way better error reporting 🔥

05.03.2026 20:01 👍 1 🔁 0 💬 1 📌 0
// vite.config.js
export default defineConfig({
    plugins: [
        laravel({
            input: ['resources/js/app.js'],
            refresh: true,
        }),
        inertia(),
        vue(),
    ],
})

// resources/js/app.js
import { createInertiaApp } from '@inertiajs/vue3'

createInertiaApp()

// vite.config.js export default defineConfig({ plugins: [ laravel({ input: ['resources/js/app.js'], refresh: true, }), inertia(), vue(), ], }) // resources/js/app.js import { createInertiaApp } from '@inertiajs/vue3' createInertiaApp()

The new @inertiajs/vite plugin handles page resolution, code splitting, and SSR setup automatically. Your entire entry point can now be a single function call: createInertiaApp() ⚡️

05.03.2026 20:01 👍 1 🔁 0 💬 1 📌 0

Inertia 3 beta is here! 🚀

This is a big one. New Vite plugin, optimistic updates, standalone HTTP requests, layout props, simplified SSR, and Axios has been replaced with a built-in XHR client.

Here's what's new 🧵

05.03.2026 20:01 👍 23 🔁 4 💬 2 📌 3

So a regular HTTP request and then update the Inertia Page props?

28.02.2026 10:21 👍 0 🔁 0 💬 1 📌 0
Post image

🔥

28.02.2026 10:19 👍 3 🔁 0 💬 0 📌 0
Upgrade Guide | Inertia Modal Documentation Documentation for the Inertia Modal package

Would love your help testing before the stable release!

Upgrade guide: inertiaui.com/inertia-moda...

28.02.2026 10:14 👍 2 🔁 0 💬 1 📌 0

Inertia Modal v2 beta is out!

✅ TypeScript support for React + Vue
✅ Prefetch: preload modals on hover, click, or mount
✅ Native <dialog> element for better accessibility
✅ closeOnClickOutside prop
✅ Local modal props
✅ Inertia 2 + Tailwind 4 only
✅ Laravel Boost support

28.02.2026 10:14 👍 4 🔁 0 💬 1 📌 0

I'll probably release this Modal beta tomorrow. I've already published the Vanilla library, which will be shared across other existing and upcoming packages 🔥

Probably not super interesting to most, but if you want to check it out, here it is:

github.com/inertiaui/va...

27.02.2026 23:06 👍 1 🔁 0 💬 1 📌 0
Preview
Web Animations API - Web APIs | MDN The Web Animations API allows for synchronizing and timing changes to the presentation of a Web page, i.e., animation of DOM elements. It does so by combining two models: the Timing Model and the Anim...

developer.mozilla.org/en-US/docs/W...

27.02.2026 12:58 👍 0 🔁 0 💬 0 📌 0
Post image

TIL the Web Animations API lets you trigger animations in JavaScript and await their completion ✨

No CSS keyframes needed. Works in all modern browsers.

27.02.2026 12:58 👍 4 🔁 0 💬 1 📌 0
Preview
GitHub - protonemedia/laravel-ffmpeg: This package provides an integration with FFmpeg for Laravel. Laravel's Filesystem handles the storage of the files. This package provides an integration with FFmpeg for Laravel. Laravel's Filesystem handles the storage of the files. - protonemedia/laravel-ffmpeg

github.com/protonemedia...

24.02.2026 22:06 👍 1 🔁 0 💬 0 📌 0

Also shipped v8.9.0 of the FFmpeg package! Laravel 13 support, improved handling of HLS with multiple audio streams, and 10+ fixes included.

Happy encoding! 📺

24.02.2026 22:06 👍 4 🔁 0 💬 1 📌 0
Preview
GitHub - protonemedia/laravel-cross-eloquent-search: Laravel package to search through multiple Eloquent models. Supports sorting, pagination, scoped queries, eager load relationships and searching th... Laravel package to search through multiple Eloquent models. Supports sorting, pagination, scoped queries, eager load relationships and searching through single or multiple columns. - protonemedia/l...

github.com/protonemedia...

23.02.2026 21:24 👍 1 🔁 0 💬 0 📌 0

I just released v3.7.0 of my Cross Eloquent Search package! In addition to some fixes, it also comes with:

✅ Support for Laravel 13
✅ Support for PostgreSQL and SQLite
✅ Added exactMatch() and tap() methods

Enjoy! 🔎

23.02.2026 21:23 👍 3 🔁 1 💬 1 📌 1

Try to get a beta version out in the next couple of days.

22.02.2026 20:40 👍 1 🔁 0 💬 0 📌 0

Migrated from Dusk to Pest Browser Testing. Added support for prefetching, native <dialog> element, passing props to local modals, custom component support for <ModalLink>, and better 'click outside' customization. Also some architectural changes.

22.02.2026 20:39 👍 3 🔁 0 💬 0 📌 0

The next major version of Inertia Modal will drop all dependencies like Headless UI and Reka UI. All utilities will be built in-house.

Dropping support for Inertia 1, Laravel 10, and Tailwind CSS 3. Adding TypeScript.

16.02.2026 15:21 👍 5 🔁 0 💬 1 📌 2
Post image

With the latest version of Laravel Precognition, you can now validate array and nested object fields using wildcards ✨

form.validate('author.*')

form.validate('contributors.*.email')

form.validate('contributors.*.*')

04.02.2026 17:20 👍 2 🔁 1 💬 0 📌 0

This SDK is a beast! 🚀

30.01.2026 18:05 👍 2 🔁 0 💬 0 📌 0