Sign in

Pascal Baljet

@pascalbaljet.bsky.social
1.5K followers 147 following 525 posts

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

PostsRepliesMedia
Pascal Baljet @pascalbaljet.bsky.social · 18/07/2026
<Form :form /> ✨ That's it. Backend-populated, or composed in the frontend. CSS-variable theming. Cohesively tuned components. Presenters split from composables/hooks. Override or extend. Integrates with Laravel validation, Precognition, uploads/storage, and model binding.
151
Pascal Baljet @pascalbaljet.bsky.social · 09/07/2026
This was planned as a separate package, but it's now folded into and integrated with the Form Builder and Components 📁 Temporary uploads, pause/resume/retry, direct-to-S3 + multipart support, drag-and-drop, image previews, reordering, and Spatie Media Library integration 💅
010
Pascal Baljet @pascalbaljet.bsky.social · 30/06/2026
Thought I'd never finish this package. At one point I was convinced AI would make it irrelevant before I shipped it. Turns out AI loves this package. Pair it with an agent and you build crazy fast 💨
120
Pascal Baljet @pascalbaljet.bsky.social · 20/05/2026
Next up: router.once(). Same as router.on(), but auto-unsubscribes after the first event. Contributed by @sebdd.net 👏
121
Pascal Baljet @pascalbaljet.bsky.social · 20/05/2026
We also added dynamic data to usePoll() 🔁 You can now pass a function as the request options and Inertia will re-evaluate it on every tick. No more stale snapshots from props or state captured at mount.
110
Pascal Baljet @pascalbaljet.bsky.social · 20/05/2026
Today we're shipping new polling features to Inertia.js! ⏱️ usePoll() now accepts a mode option to control the behavior between requests.
182
Pascal Baljet @pascalbaljet.bsky.social · 06/05/2026
Lastly, you may now pass a host option to the SSR config to restrict the server to a specific host. It still defaults to 0.0.0.0, but it's there if you need it ✨
010
Pascal Baljet @pascalbaljet.bsky.social · 06/05/2026
There are two places where Inertia injects some minimal styling: the progress bar and the error dialog. When you're using a Content Security Policy, CSP for short, you may now pass a nonce to createInertiaApp() and it'll be applied to those styles 🔒
110
Pascal Baljet @pascalbaljet.bsky.social · 06/05/2026
Instead, the <Deferred> component renders a new rescue slot, which is great for showing a custom error message and a retry button 🔁
110
Pascal Baljet @pascalbaljet.bsky.social · 06/05/2026
Inertia 3.1 is out, and it brings rescued deferred props! 🪄 Your deferred prop might call a flaky third-party API or throw an exception. With the new rescue option, the exception is still reported, but your users won't see an error response.
182
Pascal Baljet @pascalbaljet.bsky.social · 22/04/2026
About time! 🥵
020
Pascal Baljet @pascalbaljet.bsky.social · 11/04/2026
💅
110
Pascal Baljet @pascalbaljet.bsky.social · 11/04/2026
I'm redesigning the Inertia Table website 👀 If you're using it and want to be featured, send me a DM with a testimonial. I'll include a backlink to your project or company 🙏
000
Pascal Baljet @pascalbaljet.bsky.social · 03/04/2026
Date filtering has become much more advanced in the next version of Inertia Table 🔥
020
Pascal Baljet @pascalbaljet.bsky.social · 03/04/2026
This might end up being an expensive day for tokens
020
Pascal Baljet @pascalbaljet.bsky.social · 01/04/2026
010
Pascal Baljet @pascalbaljet.bsky.social · 31/03/2026
Inertia Table 4 on its way: Inertia 3 support, plus Headless UI and Axios ripped out entirely. Replaced with the Vanilla package, the same primitives that power Inertia Modal. If you're using both packages, your bundle just got significantly lighter.
040
Pascal Baljet @pascalbaljet.bsky.social · 25/03/2026
Introducing the useHttp hook. 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.
160
Pascal Baljet @pascalbaljet.bsky.social · 25/03/2026
Optimistic updates are now built into Inertia. Chain optimistic() before any router visit to apply changes instantly. If the request fails, props revert automatically 💫
150
Pascal Baljet @pascalbaljet.bsky.social · 25/03/2026
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. SSR in development no longer requires a separate Node.js server either. Just run `composer dev` ⚡️
140
Pascal Baljet @pascalbaljet.bsky.social · 24/03/2026
One more Inertia 3 beta! We've added Blade components to the Laravel adapter. You can now use <x-inertia::app /> and <x-inertia::head> instead of the inertia/inertiaHead directives. The directives still work, so no breaking changes! 🎯
2102
Pascal Baljet @pascalbaljet.bsky.social · 05/03/2026
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 🛡️
// 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();
    }
});
120
Pascal Baljet @pascalbaljet.bsky.social · 05/03/2026
The new 'useLayoutProps' hook lets layouts declare defaults that pages can override. Pages update layout state with 'setLayoutProps()'. Supports nested layouts as well.
<!-- 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>
110
Pascal Baljet @pascalbaljet.bsky.social · 05/03/2026
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 ✨
<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: [],
    }),
})
130
Pascal Baljet @pascalbaljet.bsky.social · 05/03/2026
Optimistic updates are now built into Inertia. Chain 'optimistic()' before any router visit to apply changes instantly. If the request fails, props revert automatically 💫
import { router } from '@inertiajs/vue3'

router
    .optimistic((props) => ({
        post: {
            ...props.post,
            is_favorite: !props.post.is_favorite,
        },
    }))
    .post(`/posts/${post.id}/favorite`)
120
Pascal Baljet @pascalbaljet.bsky.social · 05/03/2026
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.
<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>
140
Pascal Baljet @pascalbaljet.bsky.social · 05/03/2026
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() ⚡️
// 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()
110
Pascal Baljet @pascalbaljet.bsky.social · 28/02/2026
🔥
030
Pascal Baljet @pascalbaljet.bsky.social · 27/02/2026
TIL the Web Animations API lets you trigger animations in JavaScript and await their completion ✨ No CSS keyframes needed. Works in all modern browsers.
140
Pascal Baljet @pascalbaljet.bsky.social · 04/02/2026
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.*.*')
021
Pascal Baljet @pascalbaljet.bsky.social · 11/01/2026
First PR: Testing downloads 📂 github.com/pestphp/pest...
051
Pascal Baljet @pascalbaljet.bsky.social · 10/01/2026
Moving the Inertia Table E2E test suite from Dusk to @pestphp.bsky.social. All 121 tests pass. I needed a few helpers here and there, but I'm super happy with the result. I will open PRs for the helpers, maybe others will find them useful as well 👌
0100
Pascal Baljet @pascalbaljet.bsky.social · 19/12/2025
Lastly, TypeScript users can configure the Flash Data type globally using declaration merging. That way, your page.flash will be fully typed throughout your app 🔒
010
Pascal Baljet @pascalbaljet.bsky.social · 19/12/2025
You can also set Flash Data entirely on the client using router.flash(). New values are merged with existing data, and with a callback, you may access or replace the current state ✨
110
Pascal Baljet @pascalbaljet.bsky.social · 19/12/2025
To handle Flash Data globally, listen to the global flash event. This is ideal for toast notifications managed from a single location like your layout component.
110
Pascal Baljet @pascalbaljet.bsky.social · 19/12/2025
Need Flash Data when making requests? Use the onFlash callback. This is great for catching server-generated values like new Model IDs right after form submissions. 🎯
110
Pascal Baljet @pascalbaljet.bsky.social · 19/12/2025
On the frontend, Flash Data is available on the page object. You may access it directly in your components, for example, to show notifications or highlight newly created items. 💫
110
Pascal Baljet @pascalbaljet.bsky.social · 19/12/2025
If you're using this for redirects, you can chain back() onto flash(). You can also use Flash Data for regular page renders, and you may call flash() either before or after returning an Inertia response.
110
Pascal Baljet @pascalbaljet.bsky.social · 19/12/2025
Ready for another new feature? Introducing Flash Data in Inertia! ⚡️ With Flash Data, you can send one-time values to your frontend that won't reappear when users navigate through browser history. Perfect for success messages, newly created IDs, or other temporary values.
2232
Pascal Baljet @pascalbaljet.bsky.social · 11/12/2025
Previously, when using useForm() with Precognition, you had to install an extra package. As of Inertia 2.3, you can remove it and import useForm() directly from Inertia again. The API stays the same and we added a new method to enable Precognition, plus support for Wayfinder ⛵️
100
Pascal Baljet @pascalbaljet.bsky.social · 11/12/2025
You may also specify which fields to validate, and you can pass success and error listeners. This is great for multistep forms where each step should validate before going to the next one 👏
110
Pascal Baljet @pascalbaljet.bsky.social · 11/12/2025
You may validate fields on events like blur and change, but you can also choose to "touch" fields. Later on, you can simply call validate() to validate all touched fields at once.
100
Pascal Baljet @pascalbaljet.bsky.social · 11/12/2025
In Laravel, the only thing you need is a Form Request and the HandlePrecognitiveRequests middleware on the route. That's it! When Laravel receives a precognitive request, it runs your middleware and validation exactly like a real submission, but skips executing the controller.
110
Pascal Baljet @pascalbaljet.bsky.social · 11/12/2025
Precognition can be used for various cases, but it's mainly for validating forms as users fill them out before they actually submit the form. It uses your existing server-side validation rules, so there's nothing to duplicate on the client 💅
110
Pascal Baljet @pascalbaljet.bsky.social · 11/12/2025
Today we're bringing Precognition to Inertia's Form component! 🔮 And not only in the Form component, we're also bringing it to useForm() out of the box. No additional packages needed anymore.
4153
Pascal Baljet @pascalbaljet.bsky.social · 09/12/2025
Last but not least, Once Props can be combined with Deferred, Merging, and Optional Props 👌
040
Pascal Baljet @pascalbaljet.bsky.social · 09/12/2025
Since shared data is such a common use case for Once Props, you can add a dedicated shareOnce() method to your Inertia middleware. This method will be called alongside the existing share() method, allowing you to keep your Once Props nicely organized ✨
150
Pascal Baljet @pascalbaljet.bsky.social · 09/12/2025
If you share the same data across multiple pages but with different prop names, you can specify a custom key 🔑 In this example, even though the prop name differs, they share the same key (roles), so navigating between the two pages will not re-evaluate the callback.
140
Pascal Baljet @pascalbaljet.bsky.social · 09/12/2025
You may use the fresh() and until() methods to control when the Once Prop should be re-evaluated. You can also force a reload of the prop on the client side 🔁
150
Pascal Baljet @pascalbaljet.bsky.social · 09/12/2025
Say you share a collection of Models from your Inertia middleware. They will only be evaluated on the first request. When you navigate to another page, the callback will not be executed again, and the frontend will carry over the prop data 💫
120