All notable changes to monorailphp/monorail are documented here.
Format based on Keep a Changelog;
the project adheres to Semantic Versioning.
Targeting 1.0.0. Consolidates all shipped work across Phases 1–7.
Panel+PanelManagerfluent config; auto-registered routes on register.PanelProviderabstract base for host-app panel definitions.RenderMonorailErrorPagesmiddleware converts 403 / 404 / 419 / 500 GET responses into Inertia error pages.- Custom Pages discoverable via
Panel::discoverPages().
Resourceabstract: list, create, edit, view + store / update / destroy.- Laravel authorization —
viewAny,view,create,update,deletepolicy gates; sidebar auto-filters hidden resources. - Row actions:
ViewAction,EditAction,DeleteAction; bulk actions:BulkDeleteAction; overflow dropdown viaTable::actionsOverflowAfter(). - Panel-scoped AJAX lookup route for searchable relation fields.
TextColumn(money / number / date / dateTime / since / limit / prefix / suffix / markdown / copyable),BadgeColumn,BooleanColumn,ImageColumn,IconColumn.- Filters:
SelectFilter,TernaryFilter,TrashedFilter,DateRangeFilter(shadcn Popover + Calendar with preset sidebar). - Search, sort, pagination, per-page selector clamped to config.
HasLabel/HasColor/HasIconenum contracts.
- Fields:
TextInput,Textarea,Select,Checkbox,Radio,MultiSelect,Toggle,DatePicker,FileUpload,BelongsTo,BelongsToMany,KeyValue. - Layout:
Section,Tabs(URL-hash persistence + per-tab validation-error dots). - Enum-driven options on
Select/Radio/MultiSelectviaEnumSupport. - Searchable
BelongsTowith debounced shadcn combobox + auto-resolved selected label. - Validation rules serialized to Inertia; inline error display.
Form::applyAfterSave()+Field::afterSave()hooks.
RelationManagerabstract +RelationManagerRenderer(policy-gated perviewAny).- Namespaced search / sort / filters / pagination per manager (
rm_{name}_*). Resource::relationManagers()declaration;relationManagersLayout()toggles tabs (default, with record-count badges, URL-hash persistence) vs. stacked.monorail.pagination.relation_manager.per_page(default5).
StatWidget,ChartWidget,TableWidget,RecentRecordsWidget,ActivityFeedWidget.Resource::widgets()+CanRenderOnPagestrait with->only(['list', 'create', 'edit', 'view']).- Lazy-loaded Recharts; column span, loading skeleton, empty state.
Cmd+Kpalette with cross-resource fan-out; per-resourcetake(5), overall cap 50;viewAny-gated.Resource::globalSearchColumns(),globalSearchResult(),getGlobalSearchEloquentQuery()hooks.Panel::globalSearchEnabled()+globalSearchPlaceholder().
Panel::setPrimaryColor(),setAccentColor(),setFont(),setRadius(),setDensity().- Tokens serialized into shared props; CSS variables injected via
PanelShell. - Density scales
--monorail-gap,--monorail-input-height,--monorail-font-size.
Panel::notificationsEnabled()+ shared propnotifications = { enabled, urls }.NotificationControllerwithindex,recent,markRead,markAllRead.- Topbar bell icon with count badge + popover.
Panel::locale(string | Closure)independent of app default.monorail-langpublish tag withen.json+ar.json.- RTL-aware
PanelShellshipped alongside shadcn sidebar migration.
Exporterabstract +ExportColumnDSL;Resource::exporter()hook.ExportAction(full filtered query) +ExportBulkAction(selection);Table::headerActions().Bus::batch()orchestration:PrepareExportJob→ExportCsvChunkJob[]→CompleteExportJob;ExportReadyNotification.Importerabstract +ImportColumnDSL withrequiredMapping,guess,rules,example,relationship,castStateUsing,fillRecordUsing, etc.ImportActionwith mapping modal; status page + JSON poll endpoint; failed-rows CSV download;ImportCompletedNotification.- Migrations:
monorail_exports,monorail_imports,monorail_failed_import_rows(loadMigrationsFrom +monorail-migrationspublish tag). monorail:make-exporter/monorail:make-importergenerators.- Config:
monorail.exports.chunk_size,monorail.exports.disk,monorail.imports.chunk_size,monorail.imports.disk.
Panel::login(),registration(),passwordReset(),emailVerification(),profile(),authGuard(),authMiddleware(), custom*Page()overrides.PanelAuthController+ per-IP+email login throttle (5/min); panel-scopedAuthenticatemiddleware.CreatePanelUser/UpdatePanelProfileaction hooks.- Standalone Inertia auth pages branded by
panel.brandandpanel.theme; sidebar footer user menu.
- Self-contained React entrypoint (
monorail.tsx) + pages: list, create, edit, view, dashboard, error, auth. - shadcn components: badge, button, card, input, label, select, skeleton, switch, table, textarea, popover, calendar, sonner, dropdown-menu, sheet, sidebar.
- Responsive
PanelShell: collapsible desktop sidebar + mobile slide-in drawer. - Flash-to-toast wiring via
useFlashToast; semantic palette mapping withdark:variants; lucide icons vialucide-react/dynamic.
- Artisan generators:
monorail:make-panel,monorail:make-resource,monorail:make-page,monorail:make-exporter,monorail:make-importer. - Publish tags:
monorail-config,monorail-stubs,monorail-lang,monorail-migrations.
- 278 tests / 630 assertions across resources, forms, auth, actions, filters, dashboard, enum support, color tokens, relation managers, import/export.
- GitHub Actions matrix: PHP 8.2 / 8.3 / 8.4 × Laravel 11 / 12 / 13 (PHP 8.2 × Laravel 13 excluded); separate Pint code-style job.
- Initial package scaffold:
Panel,PanelManager,PanelProvider Resourceabstract +ListRecordspageTablewithTextColumnandBadgeColumnResourceControllerdispatches panel + slug to Inertia pagesHandleMonorailRequestsInertia middleware (root view, shared props, asset version)- Artisan:
monorail:make-panel,monorail:make-resource - Self-contained React layer built on shadcn/ui + Tailwind v4
- Filament-style
Panel::discoverResources(in:, for:)convention scanner - Laravel-style
config/monorail.phpwith env-driven defaults - Orchestra Testbench suite with Pest
- MIT license, README, CI via GitHub Actions