Laravel owns behavior.
Your app owns the UI.
Inertify is a family of headless, schema-driven packages for Laravel, Inertia, and Vue.
Declare behavior once on the server, then render it with your own components and design system.
Declare behavior once on the server, then render it with your own components and design system.
Three packages, one contract
Every Inertify package serializes server-owned behavior into an Inertia property and hands it to a typed Vue engine. None of them ship CSS, a Tailwind preset, icons, or ready-made components.
v0.1.0 pre-release
Inertify Form
Define fields, rules, authorization, visibility, binding, and uploads in Laravel. Render every control with your own Vue components.
- Container-resolved PHP form classes
- Server-side validation, Precognition, and authorization
- Native, temporary, chunked, and direct uploads
- Renderless Vue engine with typed composables
inertify/form@inertify/form-vue
Coming soon
Inertify Table
Planned. Columns, filters, sorting, and pagination declared in Laravel, with rows rendered by application-owned components.
- Column, filter, and sort definitions in PHP
- Query state carried through Inertia partial reloads
- Server-authorized selection and bulk actions
- No table markup, styles, or components shipped
In design. Scope and package names are not final.
Coming soon
Inertify Modal
Planned. Dialogs and slideovers resolved from Laravel routes, keeping real URLs while your application owns the dialog markup.
- Modal responses returned from controllers
- Stacked dialogs with addressable URLs
- Background page preserved across visits
- Your own overlay, focus, and animation decisions
In design. Scope and package names are not final.
Available today
Inside Inertify Form
The first package covers the whole form lifecycle: schema, authorization, validation, binding, uploads, collections, and wizards. Two installs — a Laravel package and a Vue package — behind one form contract.
Schema lives in PHP
Forms are container-resolved classes. Fields, rules, defaults, visibility, binding, routes, and upload behavior are declared once and serialized as functional metadata only.
app/Forms/ProfileForm.php
final class ProfileForm extends Form
{
public function fields(): array
{
return [
TextInput::make('name', 'Name')
->required()
->precognitive(),
Combobox::make('skill', 'Primary skill')
->source(route('skills.index'))
->searchable(),
File::make('avatar', 'Avatar')
->image()
->maxSize(5 * 1024),
TextInput::make('company', 'Company')
->visibleWhen('is_employed', true)
->clearWhenHidden(),
];
}
}
A field for the job
Text and structured input, choices, dates, colors and sliders, files, rich text, repeaters, typed blocks, key-value pairs, fieldsets, and submits.
Authorization stays structural
Unauthorized fields disappear from schema, initial data, and validation rules together instead of being hidden in the browser.
Uploads for real applications
Native, temporary, resumable chunked, and direct-to-storage uploads, each resolved server-side and validated by Laravel.
Collections and wizards
Repeaters, typed blocks, and multi-step forms with stable nested paths, server-side step validation, and application-owned navigation.
Behavior without package markup
The schema describes what a field does. Your application decides its HTML, components, layout, accessibility, and visual states — the Vue engine emits no elements of its own.
resources/js/components/form/index.ts
export const { FormField, FormFields } = createFormRenderer({
renderers: {
Text: TextField,
Checkbox: CheckboxField,
File: FileField,
},
})
Composables first
Nested values and errors, dirty and touched state, debounced Precognition validation, conditional transitions, collection reordering, upload progress, and unsaved-navigation protection.
Shared foundations
The packages differ in scope, not in philosophy. Whatever ships next follows the same rules.
Headless by default
No CSS, Tailwind preset, component library, editor, or icon set is shipped at runtime.
Laravel-first
Behavior is declared in container-resolved PHP classes with the framework APIs you already use.
Inertia-native
Resources pass straight through Inertia properties, including partial reloads and Precognition.
Typed Vue engines
Every package pairs with a Vue 3.5 package built from composables and renderless components.
Server-owned authorization
What a user may see or change is decided in Laravel and reflected in the serialized resource.
MIT licensed
Independent, clean-room implementations released as open source under the MIT License.
Ready to build?
Inertify Form is the package you can install today. Table and Modal are still in design — follow the organization on GitHub to see them land.