[01]Compare
Tabletop vs Filament
Both build Laravel admin screens in PHP. Filament renders them on the server with Livewire. Tabletop sends them as JSON to a React 19 client over Inertia. Filament is the mature, established option; Tabletop is a pre-1.0 beta. This page covers where that difference matters.
| Criterion | Tabletop | Filament |
|---|---|---|
| Rendering | Screens authored in PHP are serialized to JSON, sent as Inertia props and rendered by a React 19 client. No Livewire. | Server-driven: PHP classes render to HTML on the server. Pages are full-page Livewire components, with Alpine.js on the client. v5 requires Livewire 4. |
| Authoring | A Page class with path() and view(), built with the fluent S builder. There is no Resource class: CRUD is a set of pages (create, index, edit). | PHP schemas of component objects. A resource groups its form, infolist and table classes with its Livewire pages. |
| Interactivity | Form state lives in React in the browser. hiddenIf/disabledIf conditions (field, operator, value) are evaluated client-side with no request; anything that needs PHP is an opt-in liveRegion, one round-trip per dependency change. Saves and navigation go through Inertia; table refetch, charts, async select and uploads use JSON endpoints. The cost is a sizeable JS bundle. No benchmark published. | State lives in the Livewire component on the server. Fields are not live by default; live() opts in, and each change re-renders the component on the server, which Livewire morphs into the DOM. Actions and PHP-closure conditions need a round-trip; hiddenJs()/actionJs() run JS strings in the browser. Navigation is a full page load unless SPA mode is on. No benchmark published. |
| Custom UI | A React component registered with defineFieldClient or registerBlock, plus a PHP Field registered with S::register(). No edits to core packages. | A Field subclass plus a Blade view, bound with wire:model or Alpine entangle. Custom pages are a Livewire class plus a Blade view. Widgets can be custom, chart, stats or table widgets. |
| Screen composition & shell | A page's view() is one tree: several independent tables and named forms (each form with its own submit endpoint), with stats, charts and tabs in stack/row/grid layouts. The header, sidebar and footer are authored in PHP in a Chrome class: append to an area or replace it, with React slots as the last resort. Sidebar, topbar or topbar-sidebar navigation, and a chrome-less layout per page. | Each page body is an overridable schema: several forms and several tables (each with its own query-string identifier), header and footer widgets, any Livewire component. Shell: sidebar or top navigation, collapsible sidebar, toggles, and your own Livewire sidebar or topbar. Everything else through render hooks, CSS hooks and themes; publishing its Blade views is discouraged. |
| Multilingual | YesBuilt in: ->translatable() stores a per-locale map, with a locale tab bar per form, per-locale rules (rulesForLocale()) and locale-aware table columns. Content locales are global; the UI language is set per panel, with a switcher. UI strings ship in English and Ukrainian. | PartlyTranslatable content comes from a plugin: core has only a driver contract, and on v5 it is Lara Zeus's free, third-party Spatie Translatable plugin (the former official plugin moved to Lara Zeus). The panel ships UI translations for 64 locales. |
| Licence & price | MIT, free. No paid tier. | MIT, free core. Some premium plugins are sold. |
| Laravel & PHP | PHP 8.4+. Laravel 11, 12 or 13. Inertia 3 and React 19; the host compiles Tailwind v4. | PHP 8.2+. Laravel 11.28+, 12 or 13. Tailwind CSS 4.1+. |
| Multiple panels | YesEach panel class has its own prefix, guard, middleware, locales and chrome, and one page can be listed in several panels. No multi-tenancy. | YesAs many panels as you need, each with its own path, resources, pages and widgets. Multi-tenancy is built in. |
| Plugin ecosystem | Behind Filament. Extensions are ordinary Composer packages built on S::register() and the client block registry, but there is no plugin API and no directory. One first-party extension so far: an image-picker field for spatie/laravel-medialibrary (MIT, Composer plus npm halves). | Plugins are Composer packages with a formal Plugin API, a skeleton and a shared asset system. The directory lists more than a thousand; most are third-party, only Official ones are maintained by Filament, and the rest are not security-reviewed. |
| Maturity | Pre-1.0 public beta at v0.5. Pin the minor version; only the latest release is supported. | v1.0.0 was tagged in 2021; v5, the fifth major, is current. 4.x still gets fixes under a published support policy. |
[02]Start
Try it in your own app
Install with the command here, then npm install @tbtop/inertia-admin and php artisan admin:install. The docs cover the rest step by step: the admin entry in your Vite config, Tailwind v4 in the host, a build, and a first page with make:tbtop-page. To look around first, try the live demo.