genealabs/laravel-multi-tenant-manager
Multi-tenant manager for Laravel from GeneaLabs, aimed at tenant resolution and scoping in multi-tenant apps. Early-stage package with limited adoption, so review its maintenance status and test coverage before relying on it in production.
Architecture fit — Poor on the evidence available, and the burden of proof sits with the package. Multi-tenancy is not a utility concern; it is a load-bearing architectural decision that determines data isolation boundaries, connection lifecycle, queue/job context propagation, and cache key namespacing. A package that owns tenant resolution must sit in the request lifecycle before any Eloquent query executes and must survive every async execution path we run (queued jobs, scheduled commands, Octane workers, Horizon). The description claims domain/subdomain resolution, dynamic per-tenant connections, Eloquent scoping, and middleware hooks — that is exactly the right feature list for the problem, but it is a claim in a README, not a design we have reviewed. There is no architecture documentation, no lifecycle diagram, and no statement of where the tenancy context is stored (request container binding, singleton, static, or session). That last detail is the difference between a package that works and one that leaks data across tenants under concurrency.
Integration feasibility — Mechanically a composer require, but feasibility is gated on facts we do not have. We need the php and illuminate/* constraints before we can say whether it installs at all on our Laravel version; a 2021 release realistically targeted Laravel 8, and we are several majors past that. We also need to know whether it publishes migrations, whether it patches the connection resolver in a way that conflicts with our existing database configuration, and whether its middleware must be globally registered (which changes our entire HTTP kernel for all routes, not just tenant routes).
Technical risk — High, and concentrated in three places:
genealabs/laravel-multi-tenant-manager but the repository link points at mikebronner/laravel-multi-tenant-manager. That is likely just an org rename, but a TPM should require it be confirmed before we take a dependency — an unverified publisher-to-repository mapping is precisely the kind of thing that should be resolved in a five-minute check rather than discovered later.Key questions (blocking — answer from source, not from the description):
composer.json actually permit, and does that matrix include anything we run today?Stack fit — Unverified, and I would not sequence work around it. The one assertion I can make is that installation cost is near zero, which argues for a timeboxed spike rather than a paper decision — but only after the version matrix clears.
Migration path — There is none. No upgrade guides, no prior versions, no documented path from a single-tenant codebase to a tenant-aware one. If we adopt, we design the migration ourselves, including the backfill of tenant identifiers onto existing rows and the audit of every query that might now be silently scoped. That is the larger half of the work and the package contributes nothing to it.
Compatibility — Pin exactly to 0.1.0, not ^0.1. At 0.x, semver permits breaking changes in a minor bump, and this project has not yet demonstrated changelog discipline. Commit the lockfile. Publish and commit the config file so any default drift shows up as a diff in our repository rather than as a behaviour change in production.
Sequencing
composer.json, README, LICENSE, src/, tests/. Answer the seven questions. If the version matrix does not cover our Laravel, stop here; that is a legitimate and cheap outcome.TenantResolver contract plus an adapter binding in a service provider. No application code references the package namespace directly. This is the single most valuable artifact in the whole plan and it is valuable whether or not we adopt.The ordering is deliberate: we are buying an implementation detail, and the interface is what makes walking away cheap.
Maintenance — The dominant cost, and currently uncapped. A five-year-stale 0.1.0 should be modelled as a package we have forked rather than one we consume. Budget a review slot at every Laravel upgrade, plus the recurring cost of carrying a dependency that no longer tracks the framework. Our exposure is bounded only by how well step 3's adapter isolates it — that adapter is not overhead, it is the maintenance cap.
Support — Effectively none. No documentation, no issue history, no evident support commitment. Escalation is "the maintainer's GitHub," and the trailing five years of silence suggests even that is optimistic. Acceptable for a low-blast-radius helper; unacceptable for a component in the tenant isolation path, where the failure mode is a data breach rather than a broken page.
Scaling — Unverified and worth probing deliberately rather than discovering under load. Two specifics: whether tenant resolution does per-request work that does not belong in a hot path (synchronous lookups, config re-parsing, connection churn on every request), and whether per-tenant connection pooling survives connection-count limits as tenant count grows. Dynamic connection switching is exactly the kind of feature that works at ten tenants and falls over at two thousand.
Failure modes, roughly ordered by likelihood:
0.1.x bump consumed by a loose constraint. Mitigation: exact pin plus committed lockfile.Ramp-up — Half a day for a competent Laravel engineer to reach go/no-go, contingent on a readable README and a test suite. If either is missing, add a day for source reading, and treat the absence of tests as a strong negative signal rather than a scheduling detail. The estimate should be revised after discovery.
Decision — do not adopt; authorise discovery only. The evidence does not support adoption or a flat rejection: one release, no dependents, no maintenance signal for five years, and a feature list that is plausible but unverified. What I would fund is a half-day discovery pass plus a one-day comparison against a maintained alternative, with the interface-first spike held behind that gate. The strategic point is that the interface is worth building regardless of the outcome — it converts this from a commitment into a reversible implementation choice, and reversibility is the only thing that makes a package this immature even discussable for a component that owns tenant data isolation.
How can I help you explore Laravel packages today?