tomatophp/tomato-hr-module
An HR management module for Tomato PHP and Laravel that adds HR tools to your admin panel, helping you manage employees, departments, and related records. Integrates with the Tomato ecosystem and Filament for a ready-to-use HR workflow.
Architecture fit
tomatophp/tomato-hr-module is a vertical domain module for the TomatoPHP ecosystem — a Laravel package that ships Filament resources, migrations, models, policies, and seeders for HR primitives (employees, departments, job titles/positions, attendance, leave requests, and typically payroll-adjacent records). Architecturally it is not a standalone HR library; it is a presentation-and-schema layer bound to tomato-admin / Filament conventions (service provider registration, config-driven table/route prefixes, published migrations, tomato-utils helpers, and often spatie/laravel-permission + TomatoPHP's roles module for authorization).
That makes it a good fit only if the surrounding platform is already committed to Filament and the TomatoPHP conventions (base admin panel, tomato-settings for module config, tomato-roles for ACL). In a bespoke Blade/Livewire admin, or an API-first Laravel app with no admin surface, most of the module's value is unusable and you would be inheriting migrations and models wrapped in a rendering framework you do not run.
Integration feasibility
Feasible within a day for a proof-of-concept in a clean Laravel + Filament app: composer require, register provider, php artisan vendor:publish, migrate, seed permissions, create a user, load the module routes. The realistic effort sits in the second week — reconciling the module's employee/department schema with the client's existing users, org-structure, and payroll data, and deciding whether the module's models become the system of record or a shadow of an existing HRIS.
Technical risk
tomato-admin, tomato-utils, tomato-roles, tomato-settings). A patch release in any of them can break this module, and the 1.0.0 tag pins none of them tightly by default.Key questions
tomato-* sibling packages are hard requirements, and are their versions constrained (^1.0) in composer.json?users relationship, or does it reference an existing model via config?down() path?Stack fit
Strong fit: Laravel 10/11, PHP 8.1+, Filament 3.x, MySQL/PostgreSQL, an admin panel already built on TomatoPHP or willing to adopt Filament. Weak fit: API-first or headless backends, non-Filament admin, multi-tenant SaaS with per-tenant schema isolation (the module does not natively model tenancy — you would wrap it), and any environment where HR data must be isolated from the general admin application.
Migration path
Greenfield: install at v1.0.0, publish config and migrations, run migrations unmodified, seed the module's permission set, and treat upstream as read-only — pin the exact tag in composer.json and commit composer.lock.
Brownfield with existing HR data: do not let the module's migrations own the employee table. Two viable options:
Either way, run the module's employee PII through your existing encryption-at-rest and retention policy before go-live, not after.
Compatibility
Pin tomatophp/tomato-hr-module:1.0.0 exactly. Verify each transitive tomato-* dependency resolves to a tag, not dev-main. Confirm Filament major version alignment (Filament 2 vs 3 resource APIs are incompatible) and check that the module's published config keys do not collide with existing config/tomato/* entries. Verify Laravel version support against the repo's composer.json require block rather than the README.
Sequencing
Maintenance
Ongoing cost is dominated by ecosystem tracking, not by this package alone. Budget a recurring dependency-review slot each month for the tomato-* tree; a single-maintainer ecosystem ships fast and breaks occasionally. Because we pin exactly, upgrades are deliberate — expect a half-day per minor bump to re-run the resource smoke test. If we take the fork path, add the cost of manually replaying upstream migration changes.
Support
Upstream support is community/GitHub-issues with no SLA and no commercial backing apparent at this tag. Internal ownership must therefore be explicit: name a module owner, and require that at least two engineers can read the Filament resource definitions and the published migrations. Escalation for HR-data bugs during payroll or leave-cycle windows cannot depend on an external maintainer's response time.
Scaling
The module is CRUD-shaped, so read scaling is ordinary Laravel: index the foreign keys the module creates (department, manager, employee) and paginate the Filament tables. Watch three things at volume: attendance tables grow fastest and deserve partitioning or archival early; Filament resource tables with relationships generate N+1 queries unless eager loading is configured; and any dashboard/report widgets the module ships will run aggregate queries on page load. Multi-tenancy is not free — if required, plan a global scope plus tenant-aware migrations as a deliberate extension, not an afterthought.
Failure modes
composer update on a sibling package — mitigated by exact pins and lockfile discipline.Ramp-up
A Laravel developer familiar with Filament can be productive on the module's resources in one to two days; the learning curve is Filament's resource/form/table API, not this package. Add one to two days for the TomatoPHP conventions (settings, roles, utils) and the publish/config workflow. Plan half a day of HR-domain walkthrough with an actual HR stakeholder — the module encodes opinions about leave accrual and attendance states that engineers will otherwise guess wrong, and correcting them post-import is expensive.
How can I help you explore Laravel packages today?