tomatophp/tomato-php
TomatoPHP core package gives Laravel developers a modular, open-source foundation for building admin panels and CMS applications, complete with ready-made CRUD generators, reusable plugins, and a growing ecosystem of tools for shipping dashboards faster. It is the heart of the TomatoPHP framework.
Pull CRUD-heavy internal surfaces forward — or don't staff them at all. The decision this package actually informs is a scoping one: if the backlog contains a cluster of conventional, model-centric admin screens (back-office tooling, ops dashboards, MVP data management) behind an auth wall, a generator can compress that work from sprints to days. If that cluster doesn't exist, the package has nothing to offer and should be closed out in an hour.
Build vs. borrow for scaffolding. MIT license, plain-PHP output, require-dev install, and an exit path that is literally git revert plus composer remove --dev. That makes "borrow" defensible against an in-house scaffolding investment — provided a named reviewer exists before generation starts. A generator without a reviewer is not an accelerator; it's deferred cleanup.
Reallocate engineering capacity to differentiated work. The ROI is not the lines of code saved. It's the capacity redirected into permissions, audit trails, workflows, integrations, and domain logic — work a generator cannot do and competitors can't copy from a package.
Keep the bet deliberately narrow. Best fit: Laravel apps already committed to Splade or Breeze, generating standard CRUD modules into a bounded namespace. Poor fit: API-first services, event-sourced domains, heavy multi-tenant permission matrices, Inertia/React front ends, or retrofits into a mature domain layer. Do not let a successful admin pilot escalate into "standardize this across all product surfaces" — that's how a two-day experiment becomes an architecture decision nobody voted on.
Decision gate with pre-agreed metrics. Approve a 1–2 day spike plus a one-sprint pilot, measured on: time to first working CRUD screen, generated-vs-handwritten line ratio, percentage of boilerplate eliminated (target ~70%+), defects found in generated output, security findings, and ongoing maintenance effort. Write the kill criteria before the pilot, not after the first demo looks good.
Adopt for a pilot when:
require-dev, generate into a fenced namespace, commit raw generator output separately from hand edits, and pin at 1.1.8 or later. Earlier tags emit a broken Splade relation select (remoteRoute where remoteRoot('data') is required) — and the generator exits successfully anyway; the failure appears when an admin opens a create form. Grep existing scaffolding for remoteRoute before evaluating anything already generated.Look elsewhere when:
tomatophp/* packages have shipped the same bug, so keep the constraint tight.For executives — one paragraph: This is a free, MIT-licensed Laravel code generator that scaffolds standard admin CRUD screens for apps already built on Splade or Breeze. We propose a 1–2 day spike plus one sprint against a bounded internal-tools backlog, with kill criteria agreed up front. Cost is a few engineer-days; upside is compressing routine admin scaffolding by roughly 70% and redirecting that capacity to permissions, audit, and workflow work that actually differentiates us. Exit cost is near zero — it installs as a dev-only dependency and removal is a revert plus a composer remove. We are not proposing it as a platform standard, and we are not taking a support dependency: it's a single-maintainer project with no SLA.
For engineering — the operating rules that make it safe:
composer require --dev, pinned at 1.1.8+, excluded from production images. Verify the tag is real on Packagist.->remoteRoot('data') and the JSON endpoint must return a { data: [...] } envelope. You own both halves.The framing to hold onto: it removes typing, not accountability. The generated code is ours — its tests, its security posture, and its upgrades. Approve it as a scoped accelerator with a named owner and a documented exit path, or don't approve it at all.
How can I help you explore Laravel packages today?