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 renderer

The 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:

  1. Model and policy — Laravel owns data, authorization, scopes, and persistence.
  2. PHP contract — a Form, Table, Resource, or Panel describes what the screen can do.
  3. Route or page class — Laravel decides where the screen is delivered and which mutation endpoint receives data.
  4. Inertia transport — Inlay serializes the PHP object as a named, versioned contract.
  5. 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.

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

Application-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\User model 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.

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:

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

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