genealabs/nova-multi-tenant-manager
GeneaLabs Nova Multi-Tenant Manager adds multi-tenancy support to Laravel Nova: manage tenants, scope resources and queries per tenant, and let users switch tenants so your Nova admin panel stays tenant-aware.
Architecture fit. The package is an operator-facing Nova admin surface, not a request-path component — which is what makes it usable at all. It gives Nova a tenant switcher, tenant-scoped resources, tenant/domain CRUD, and tenant-aware provisioning actions. It supplies no tenancy: no tenant resolution, no per-tenant database routing, no queue/cache separation. So the first TPM move is a scoping decision, not an evaluation: this is only leverageable if a real tenancy model already exists. If tenancy is unbuilt, this package is a UI over work still to be done, and build-vs-adopt collapses to "build." A second fit concern is ownership: if tenant provisioning already lives in a control plane (billing, onboarding, support tools), a Nova widget splits that workflow across two systems and creates a reconciliation problem a TPM will end up adjudicating.
Integration feasibility. Mechanically trivial — Composer install, service-provider auto-discovery, config publishing, middleware registration; a day to spike. The blocker is lifecycle, not engineering. The repo is archived with last release May 2024, ~20 stars, zero dependents, single-maintainer lineage, and a score of 0.29. The only documented release signal is "Laravel 11 compatibility." There is no adopter population to surface edge cases before we do, and no forward path to Laravel 12+ or any Nova major released after mid-2024.
Technical risk. Ranked by what a TPM actually has to manage:
Key questions to get answered before committing.
Stack fit. Laravel 11, PHP 8.2+, current Nova major (verify against package constraints first). Confirm database, cache, queue, and Octane posture up front. Admin-only deployment makes load characteristics trivial; correctness characteristics are not.
Migration path — reframe this as a fork, not an adoption. The TPM's job is to stop a composer require from happening.
^0.7 or a commit hash). Never dev-main or * — an archived repo can still be force-pushed or deleted; a mirror kills that failure mode.Compatibility. Build a CI matrix of Laravel 11 minor × Nova major × PHP 8.2/8.3 × database driver × queue driver. That matrix is the upgrade gate for every future framework bump, because there is no upstream to lean on. Explicitly test the paths the release note is silent on: queue serialization, model casting, cached config, and middleware ordering against Nova's own auth pipeline.
Sequencing.
Maintenance. The cost does not vanish on archival; it transfers to us. Budget roughly 1–3 engineer-days per framework or Nova minor upgrade, plus the cost of the first security finding. The decisive test: if no named owner can be assigned, that is the decision — do not adopt. Confirm the license permits internal forking and redistribution before building on it.
Support. No upstream path exists — no triage, no disclosure channel, no SLA. Our team becomes the escalation tier for every bug and every CVE scanner hit. Frame this for stakeholders explicitly: "open source" here means unsupported, not free. It should land as an ownership transfer, not a procurement saving.
Scaling. Operationally negligible — this is the admin panel, not customer traffic. The scaling risk is organisational: as tenant count grows, the switcher UI and tenant-scoped query patterns become the bottleneck. Watch for N+1s introduced by scoping, and for tenant-resolution middleware applied per-request rather than per-Nova-request — that would turn an admin tool into an unintended production dependency.
Failure modes to instrument.
illuminate/* constraints — surfaces at upgrade time, when options are fewest.Ramp-up. A Laravel-fluent engineer can spike it in about a day. A safe fork — adapter, security wrapper, regression tests, review — is realistically 1–2 weeks. On-call needs a short runbook covering how tenant context is switched, where the audit log lives, and who to page when scope looks wrong.
How can I help you explore Laravel packages today?