tomatophp/tomato-freelancers
Tomato Freelancers is a Laravel package for managing freelancers, clients, and projects inside the Tomato admin ecosystem, with ready-made CRUD resources, database migrations, and configurable workflows for hiring and tracking contract work.
tomatophp/tomato-freelancers is a v0.0.1 package from the TomatoPHP ecosystem, intended to add freelancer management (profiles, skills, projects/bids, admin CRUD) to a Laravel app. Release notes for v0.0.1 are just a changelog link, so treat the source and README as the source of truth rather than release notes.
Minimal steps:
tomatophp/tomato-admin or a Filament-based Tomato panel). This package almost certainly assumes that base rather than working standalone.composer require tomatophp/tomato-freelancersphp artisan vendor:publish --provider="TomatoPHP\TomatoFreelancers\TomatoFreelancersServiceProvider" (check the actual provider name in composer.json/src/).php artisan migrate. Inspect the migration files first — on a v0.0.1 package, table names and FKs are still in flux.php artisan optimize:clear.config/ for the package config, src/Models for the entities it ships, src/Tables/src/Resources (or src/Http/Controllers) for the admin surface, and database/migrations for the schema it assumes.First use case: log into the admin panel, find the new freelancer menu entry, create a freelancer record with the required fields, and confirm the list/detail/edit screens work. That single round-trip tells you whether the package's assumptions (auth guard, panel registration, relationships) match your app.
Treat it as an admin-panel module, not a domain library. The package's value is the pre-built CRUD and menu wiring. Keep your business logic in your own services/actions and let the package handle the admin surface.
Extend the shipped models, don't edit vendor files. Configure your own model via the package config (most TomatoPHP packages support swapping the model class) and subclass the provided one to add relationships, scopes, casts, and accessors. This is the safest extension point at v0.0.1.
Pattern: freelancer as an aggregate root. Typical wiring is Freelancer belongsTo User, and hasMany skills/portfolios/projects/bids. When you add fields, prefer a companion table or a JSON meta column over editing vendor migrations — you'll be able to upgrade without conflict.
Pattern: policy-gated admin, public read-only frontend. Use the package for the authenticated admin CRUD, then expose your own thin frontend controller/resource that reads the same models. Don't reuse the package's admin routes publicly.
Integration: events for cross-package reactions. If the package dispatches model events (it should, being Eloquent-based), hook observers rather than patching controllers — e.g. notify on freelancer approval, sync to a search index on profile update.
Testing workflow. Because v0.0.1 ships little to no test coverage, write your own feature test that boots the panel, hits the freelancer index route, and asserts a 200 for an authorized user. That test is your upgrade smoke test for every future version.
Pin and stage. In composer.json, use an exact version ("tomatophp/tomato-freelancers": "0.0.1") rather than ^0.0.1, and install on a branch/preview environment first.
0.0.1, config keys, table names, and class namespaces can change in any patch. Pin exactly and read the diff on every bump.v0.0.1 against the next tag yourself (git diff) before upgrading; don't rely on semantic versioning here.php artisan migrate --pretend first. If a freelancers table already exists in your schema, the package migration will fail — rename via config or extend the existing table instead.config for an enabled/panel key rather than assuming the package is broken.composer.json constraints before upgrading either side.with() and add indexes to any FK columns the package creates but doesn't index.storage/logs/laravel.log for class-not-found errors from unregistered service providers, then confirm the provider is auto-discovered (php artisan about / package:discover).vendor/ and in your own app/ layer so a fork or replacement is a day's work, not a rewrite.How can I help you explore Laravel packages today?