User guide
Inlay user guide
This is the practical guide for building Laravel administration screens with Inlay. It is written for a developer who is starting with a clean Laravel application and wants to u…
Inlay keeps the application code in Laravel. You define panels, resources, forms, tables, validation, actions, and widgets in PHP. Inertia transports a versioned data contract to the frontend, and the official React or Vue renderer turns that contract into accessible controls.
PHP configuration
│
├── Form / Table / Resource / Panel / Widget
│
▼
Inertia props (versioned Inlay contract)
│
├── React renderer
└── Vue rendererThe guide is intentionally progressive. Start with the first two chapters, then read only the feature chapter you need. The package READMEs remain the complete API reference; this guide explains which pieces belong together and shows the recommended application structure.
Choose a starting point
| I want to… | Read |
|---|---|
| Install a panel in a new Laravel application | Getting started |
| Understand panel login, navigation, and middleware | Panels |
| Build CRUD without writing controllers | Resources |
| Build a form in PHP | Forms |
| Build a searchable, filterable table | Tables |
| Present a read-only record detail view | Schemas and Infolists |
| Keep rules in one reusable class | Validation |
| Add actions, notifications, and dashboard widgets | Actions and widgets |
| Change the entire UI with one theme | Themes |
| Install permissions, media, or another extension | Plugins |
| Use Forms or Tables without a panel | Standalone pages |
| Test and deploy safely | Testing and deployment |
The five-minute mental model
An Inlay screen normally has five layers:
- Model and policy — Laravel owns data, authorization, scopes, and persistence.
- PHP contract — a
Form,Table,Resource, orPaneldescribes what the screen can do. - Route or page class — Laravel decides where the screen is delivered and which mutation endpoint receives data.
- Inertia transport — Inlay serializes the PHP object as a named, versioned contract.
- Renderer — React or Vue renders the contract and reports interaction back to the server.
Business rules stay in layers 1–3. The renderer should not become a second place where authorization or validation is implemented.
Recommended application layout
The installer creates this shape. You can rename directories, but keeping the boundaries makes a project easy to navigate:
app/
Inlay/
Resources/
UserResource.php
ListUsers.php
CreateUser.php
EditUser.php
Themes/
Widgets/
Providers/Inlay/
AdminPanelProvider.php
Validation/
UserRules.php
resources/
js/
layouts/inlay-panel-layout.tsx # or .vue
pages/inlay/
auth/login.tsx
dashboard.tsx
pages/users/
index.tsx
form.tsx
css/app.cssApplication-owned files are deliberately generated into app/ and
resources/. You can edit them, commit them, and review them like any other
Laravel code. Inlay packages provide the runtime and renderer primitives; they
do not hide your application in a vendor directory.
Conventions used in the examples
The examples use:
- Laravel 12 or 13;
- PHP 8.3 or newer;
- Inertia Laravel 3;
- React 19 unless a Vue example is shown;
- an
App\Models\Usermodel with the normal Laravel authentication contract.
Replace User and the field names with your own model. Every route, policy,
column, field, and validation rule should be reviewed for the data your
application actually owns.
Package map
The package ecosystem is intentionally layered. Start with the first table for the screens most applications need, then add an optional plugin when the product actually needs it. The final table lists foundation packages that are usually installed transitively or used by package authors.
Recommended application stack
| Need | Composer package | React package | Vue package |
|---|---|---|---|
| Clean panel preset | inlayphp/inlay |
Selected at install time | Selected at install time |
| Forms | inlayphp/forms |
@inlayphp/forms-react |
@inlayphp/forms-vue |
| Tables | inlayphp/tables |
@inlayphp/tables-react |
@inlayphp/tables-vue |
| CRUD Resources | inlayphp/resources |
@inlayphp/resources-react |
@inlayphp/resources-vue |
| Schema containers | inlayphp/schemas |
Rendered by the Forms/Infolists adapter | Rendered by the Forms/Infolists adapter |
| Read-only details | inlayphp/infolists |
@inlayphp/infolists-react |
@inlayphp/infolists-vue |
| Validation | inlayphp/validation |
— | — |
| Actions | inlayphp/actions |
@inlayphp/actions-react |
@inlayphp/actions-vue |
| Notifications | inlayphp/notifications |
@inlayphp/notifications-react |
@inlayphp/notifications-vue |
| Dashboard widgets | inlayphp/widgets |
@inlayphp/widgets-react |
@inlayphp/widgets-vue |
The normal install uses React. Choose Vue with
php artisan inlay:install --panels --renderer=vue; the PHP contracts and
application code stay the same.
Optional product plugins
| Capability | Composer package(s) | Add when… |
|---|---|---|
| Media library and picker | inlayphp/media-manager (pulls inlayphp/media) |
the application needs uploads, albums, folders, or asset picking |
| Media catalog only | inlayphp/media |
the application needs storage and catalog services without a panel UI |
| Roles and permissions | inlayphp/permission-manager (pulls the Spatie adapter) |
the application needs role, permission, and assignment screens |
| Validated imports | inlayphp/imports |
users need CSV, XLSX, or batch import workflows |
| XLSX table exports | inlayphp/tables-xlsx |
users need spreadsheet exports from a Table |
| Two-factor authentication | inlayphp/two-factor-authentication |
the panel needs TOTP, recovery codes, or login challenges |
| Spatie media bridge | inlayphp/media-spatie |
the application already uses Spatie Media Library |
| Visual editing | inlayphp/visual-editing |
editors need an in-context page editing workflow |
Foundation and support packages
These are important seams, but most application developers should not install them one by one:
| Package | Purpose |
|---|---|
inlayphp/core |
shared contracts, serialization, and package infrastructure |
inlayphp/panels |
panel registration, routing, middleware, and page contracts |
inlayphp/authorization |
policy and ability abstractions used by Resources and plugins |
inlayphp/design + inlayphp/theme |
design tokens, generated themes, and renderer styling |
inlayphp/support |
shared Laravel and transport helpers |
inlayphp/ui |
low-level renderer primitives and shared UI utilities |
Install the inlayphp/inlay preset for a complete panel foundation. Use the
individual foundation packages directly when building a standalone page,
authoring a community plugin, or integrating a custom renderer.
Source of truth and compatibility
The package READMEs contain exhaustive method-level details:
- Forms API
- Tables API
- Resources API
- Panels API
- Schemas API
- Actions API
- Validation API
- Infolists API
- Schemas API
Every top-level object carries a versioned contract such as
inlay.forms.v1 or inlay.tables.v1. Adding optional keys is compatible;
changing the meaning or shape of an existing key requires a new contract
version. This rule lets applications upgrade package and renderer releases
without silently changing a screen.
Before opening an issue
Run the smallest useful checks first:
php artisan inlay:doctor
php artisan route:list | grep admin
npm run build
php artisan inlay:doctor --productionFor a page that is blank in the browser, inspect the browser console and the
Inertia response first. A blank React or Vue page is usually an exception in a
page resolver, a missing compiled asset, or a missing inlayPanel prop—not a
database query problem.