tomatophp/tomato-admin
Tomato Admin is a Laravel admin panel built on Splade that gives you a ready-made dashboard with authentication, roles and permissions, a CRUD generator, menus, notifications, and translation tools, so you can scaffold complete backend interfaces quickly with minimal code.
Architecture fit. Tomato Admin is an opinionated, monolith-side back-office accelerator: a FilamentPHP-derived theme layered on Laravel Splade, shipping auth, users/roles/permissions, settings, menus, media, and a CRUD generator. The architecture that fits is a server-rendered Laravel app whose admin surface is internal — ops consoles, support tooling, CMS-lite. It does not fit API-first/headless products, heavily multi-tenant deployments, or any surface where the admin is customer-visible. The single most consequential architectural fact for a TPM is that adoption is a stack bet, not a package pick: it commits the team to Livewire/Alpine and Vue 3/Splade simultaneously. That has downstream consequences for hiring, code review norms, and frontend build ownership, and should be recorded as an explicit architecture decision rather than inherited quietly from a composer require.
Integration feasibility. Mechanically straightforward (Composer package, MIT, publishable config/assets, migrations) but organisationally it is an ecosystem commit. Sibling packages — settings, roles, forms, translations — are designed to compose, and the trap is shallow adoption of five rather than deep adoption of two. Feasibility hinges on three unknowns that must be answered before any schedule is committed:
composer.json require filament/filament outright, or is only the theme vendored? That single answer decides whether you inherit the full Filament resource engine or merely a UI shell — and it changes the build-vs-scaffold estimate materially.Technical risk. The risk is concentrated in the front end and in ownership, not in PHP:
public/; if the pipeline rebuilds rather than ships them (or vice versa), staging serves stale assets with no error surfaced anywhere.Key questions to resolve before approval.
Stack fit. Target Laravel + Livewire/Alpine + Vue 3 via Splade. If the team is React/Next-native, taking on two additional frontend paradigms for one internal screen set is a poor trade — a React-based admin is the better call. If the team is already Blade/Livewire-comfortable, fit is good and the value proposition (three to six weeks of plumbing removed from the first release) is credible.
Migration path. Do not install into the existing production app first. Sequence:
php artisan serve. Run the production build on day one, not day ten, specifically to force the Tailwind collision to surface inside the timebox.UPSTREAM.md. This is the default workflow, not a contingency. Pin the version; upstream diffs happen on a scheduled manual cadence, never on composer update./admin prefix with its own layout and its own Vite entrypoint (and, where possible, its own Tailwind config) so the Filament/Splade preset merge cannot break the customer-facing app. Feature-flag the rollout: internal users first, then a cohort.Compatibility. Pin Laravel constraint, Filament major, and Splade version together as a set and treat them as a single upgrade unit. Confirm config/auth.php guard name matches what the package expects, confirm the user model binding, and confirm middleware ordering (auth before panel middleware) — a guard mismatch locks the team out on first deploy and presents as a routing bug.
Sequencing and team pattern. Establish the scaffolding pattern on day two, with documentation. If the full Filament resource engine is present, make:filament-resource is the path; if only the theme layer shipped, duplication of the package's Users resource is the path. Write the internal "how to add a CRUD screen" doc while copying the reference files. Register navigation the same way the shipped screens do — no second navigation system. Keep business rules, exports, and integrations in our own modules that admin screens call into; that single constraint is what makes a future swap a re-skin rather than a rewrite. Adopt two sibling packages deeply (roles and settings are the natural picks) rather than five shallowly.
Maintenance. Budget approximately 10–15% of one engineer ongoing. The driver is not this package's release cadence — it is that the fork tracks three moving upstreams (Laravel, Filament, Splade) while the package tracks none of them on our schedule. Add a defined quarterly upstream-diff slot and a standing owner. If that allocation cannot be secured, the honest recommendation is not to adopt.
Support. There is no SLA, no vendor, no security policy, and no evident CVE channel; zero dependents means no crowd-sourced bug surface to lean on. For internal ops consoles that is an acceptable posture because we are effectively the maintainer of record. It is not acceptable for customer-facing or regulated-data surfaces, where a larger, scrutinised dependency is the better bet. Communicate this to stakeholders as a maintenance cost, not a licensing cost — the ask is approval of a timeboxed spike plus a fork-and-own policy, not the selection of a supplier.
Scaling. This is an opinionated monolith-side dashboard. It scales adequately across breadth — standardising three or four ad-hoc internal tools onto one theme and component set shrinks the design and QA surface, which is one of the cleanest arguments for adoption. It does not scale into headless/API-first requirements, heavy multi-tenancy, or high-concurrency public traffic patterns.
Failure modes to instrument for.
/admin.Ramp-up. Plan 1–2 weeks to productivity for a mid-level Laravel engineer; the cost is carrying two mental models at once (server-driven DOM morphing for Livewire/Alpine, client-driven SPA routing for Vue/Splade). Do not staff this with a React/Next-native engineer without explicitly accepting the context-switch tax. Onboarding artefacts worth producing: the day-two CRUD doc, the assets-ownership note, a debugging checklist (clear config/route/view caches after publish → confirm published theme assets present → confirm correct guard → confirm the production build's Tailwind content globs include package views → confirm provider registered → confirm Filament major matches the views), and the ranked extension-point policy: config first, view overrides second, container bindings third, vendored-source edits only inside the fork.
What I would track as TPM. Spike exit criteria (screenshot of /admin behind our guard, production build); the fork created and UPSTREAM.md live; a named maintenance owner at 10–15%; a visual smoke test in the release gate; at least one internal ops screen shipped to a real user cohort; and an explicit, written exit cost for migrating to vanilla Filament. This package is an internal velocity lever — it frees capacity for revenue-facing work — and should never appear in customer-facing positioning, competitive analysis, or pricing conversations.
How can I help you explore Laravel packages today?