[01]Compare
Tabletop, Filament, Nova
Three Laravel admin builders. In all three you write screens in PHP. They differ in what renders those screens, and in what you write once the built-in fields run out: React 19 in Tabletop, Livewire and Blade in Filament, Vue in Nova.
| Criterion | Tabletop | Filament | Nova |
|---|---|---|---|
| Rendering | PHP pages are serialized to JSON, sent as Inertia props and rendered by a React 19 client. No Livewire. | HTML rendered on the server with Livewire, Alpine.js and Tailwind CSS. Every page is a full-page Livewire component. | Vue 3.5 over Inertia.js 2.x. Assets are built with Laravel Mix. |
| Authoring | PHP Page classes built with the fluent S builder. There is no Resource class: CRUD is a set of create, index and edit pages. | PHP schemas made of component objects. A resource bundles forms, infolists, tables and pages. | One PHP resource class per Eloquent model. Its fields come from a fields() array. |
| Interactivity | Form state lives in React in the browser, so typing in a form field sends no request. hiddenIf and disabledIf are declarative conditions checked on the client. Logic that needs PHP goes through an opt-in liveRegion, one round-trip each time a declared dependency changes. Saves and navigation go through Inertia, while table refetches, searches, charts and uploads call JSON endpoints. The cost is a large client bundle. | The server renders the HTML, and each action is an AJAX request that runs PHP. Fields do not re-render by default. A live() field or a PHP condition costs a round-trip that re-renders the whole component, unless you opt into partial rendering. To skip the request, you write JavaScript strings with hiddenJs(), actionJs() and similar methods. Changing pages is a full page load unless SPA mode is on. | A Vue SPA over Inertia. Changing pages is an XHR that returns the page component and its props as JSON. Dependent fields (dependsOn) are reconfigured by PHP closures, and some field types, such as File, Trix and Code, cannot drive them. Custom components fetch data with Nova.request(). Index polling and metric refreshes keep data current. |
| Custom UI | A PHP Field subclass registered with S::register(), plus a React component (defineFieldClient for fields, registerBlock for widgets). You place it from PHP by its kind name. | A PHP class plus a Blade view. State binds through Livewire or Alpine. | Vue components (a custom field takes three), each in its own Composer package under nova-components. |
| Screen composition & shell | A page can hold several independent tables and named forms, with no documented limit, arranged with stack, grid, tabs and sections next to stats and charts. You author the shell in PHP through a Chrome class: add to the stock header, sidebar and footer, or replace any of them. React slots are the last-resort override. Navigation can be a sidebar, a topbar or both, and a single page can drop the chrome. | A page body is a schema you can override. It can hold several forms, several tables (each with its own query-string key), header and footer widgets and any Livewire component, with no documented limit. Shell: sidebar or top navigation and a collapsible sidebar, and you can swap the sidebar and topbar for your own Livewire components. Anything else changes through render hooks, CSS hooks and themes. Publishing the internal views is discouraged. | Pages follow the resource model (index, detail, form, lenses), plus dashboards of cards and metrics. A detail page shows one table per relationship, and cards sit at the top of dashboards, indexes and detail pages. Any other layout is a custom Vue tool. Nova manages the shell. You can change the logo and colour, replace the main menu, add items to the user menu, set footer text and turn on breadcrumbs. No documented API replaces the layout or the top bar. |
| Multilingual | YesContent: built into core. ->translatable() stores a field as a per-locale map, with one locale tab bar per form, per-locale rules (rulesForLocale()) and table columns that read the active locale. Content locales are global. UI: locales per panel with a switcher, but the admin ships only English and Ukrainian, and RTL is not documented. | PartlyContent: from a plugin. Core has only a driver contract, and Filament's own translatable plugin is now maintained by the third-party Lara Zeus, whose v5 version is listed as free in the directory. UI: the panels ship translation files for 64 locales. | PartlyContent: no translatable field (one field stored per locale) is built in or documented, so it needs a third-party package. UI: strings and labels are localised with Laravel's translation files, and RTL is built in. |
| Licence & price | MIT for the PHP package and the npm client. No per-seat fee. | MIT, with no paid core tier. Most plugins are free, and some premium ones are sold. | Proprietary, one-time purchase: $99 for one project or $299 for unlimited, each with a year of updates. Renewal ($79 or $249 a year) is optional; without it you keep your version. No free trial, but a 15-day refund. The licence forbids publishing an app that includes Nova in a public repo. |
| Laravel & PHP | PHP 8.4+, the highest floor of the three. Laravel 11, 12 or 13. The host app compiles Tailwind v4. | PHP 8.2+, Laravel 11.28 through 13, Livewire 4 and Tailwind CSS 4.1+. | PHP 8.1+, Laravel 10 through 13. |
| Multiple panels | Each panel is a class with its own guard, prefix, locales and chrome. One page can be listed in several panels. | Any number of panels, each with its own resources, pages and widgets. | A single Nova panel. It can serve several subdomains and hold multiple dashboards. The docs do not describe separately configured panels. |
| Plugin ecosystem | Behind both. As with Nova, extensions are ordinary Composer packages. They build on the block registry and S::register() without core edits, and nothing lists them. There is no plugin API or directory. One first-party extension so far: tbtop/spatie-media-library, an MIT image-picker field with a PHP half and a React half. | Over a thousand plugins in the official directory, plus a formal plugin API and a shared asset system for plugin CSS and JS. Only plugins marked Official are maintained by the Filament team, and the rest are not security-vetted. | Third-party Composer packages, free or paid, since the licence lets authors sell them. Each tool, card and field is scaffolded as its own package. Nova's site and docs do not list or count them. |
| Maturity | Pre-1.0 public beta at v0.5. Only the latest release is supported. | v1.0.0 was tagged in March 2021. Now on its fifth major (v5, January 2026), and 4.x still gets fixes. | 1.0 shipped in August 2018, and Nova 5 in December 2024. Built by the Laravel team. |
[02]Start
Try it before you choose
Click through the live demo, or read the docs first. Install with the command here, then run php artisan admin:install. MIT.