misaf/vendra-user
User management module for the Vendra admin panel, providing CRUD screens, authentication-ready user models, and role/permission handling so you can add team and customer accounts to your Laravel application quickly.
Architecture fit: misaf/vendra-user is not a general-purpose community package — it is a read-only subtree split of the misaf/vendra monorepo, meaning this repository is a distribution artifact, not the development home. Architecturally it is a first-party domain module: it owns user persistence, the Misaf\VendraUser namespace, factories, seeders, policies, observers, console commands, Filament admin classes, config, migrations, translations, and tests. It explicitly sits inside a module graph that includes misaf/vendra-support (capabilities/tagging), a separate misaf/vendra-socialite (Socialite user model, registrar, Filament socialite wiring), and a tenant layer (TenantSchema, TenantTableRegistry, vendra-tenant:enable). The fit question for a TPM is therefore not "does this package do users well?" but "are we adopting the Vendra platform stack, or bolting one module of it onto a non-Vendra Laravel app?" The former is low-friction; the latter imports a dependency graph and a set of conventions (translatable JSON columns, tenant column registration, tag integration contracts) that only pay off if the rest of the graph is present.
Integration feasibility: Good for a greenfield or existing Vendra application; moderate for a standalone Laravel app. The integration surface is conventional and well-documented: composer require misaf/vendra-user, publish config and migrations (--tag=vendra-user-config, --tag=vendra-user-migrations), review config/vendra-user.php for table names, route prefixes, middleware, and model bindings, then migrate. The real cost centres are: (1) deciding whether to extend the package User model or make your existing App\Models\User implement the package contract plus trait; (2) creating users through the package service rather than User::create() so profile/address side effects and events are not bypassed; (3) disabling package-registered routes/views if you already own account routes, to avoid duplicate route names and middleware conflicts. Filament admin UI is bundled — a genuine accelerant if you are on Filament, dead weight (and an extra dependency surface) if you are not.
Technical risk: Two distinct risks, and they should not be conflated. Subtree-split risk is the headline: this repository is [READ ONLY], so issues, PRs, and security fixes filed here are likely to be ignored — all change control, code review, and disclosure must route through misaf/vendra. Any governance plan that treats misaf/vendra-user as the upstream is wrong. Release-opacity risk is inherited: the v1.12.3 notes are a bare compare link (v1.11.0...v1.12.3), with no itemized changes, so the TPM cannot size the upgrade from the artifact alone. There are also concrete behavioural contracts that make for sharp edges: translatable fields must be JSON columns and must stay consistently translation-aware across casts, factories, validation, Filament locale UI, API serialization and tests; every table whose migration calls TenantSchema::addTenantColumn() must be registered with TenantTableRegistry or tenant retrofit silently misses schemas migrated pre-tenancy; and the package's tag handling must go through Misaf\VendraSupport\Capabilities\HasOptionalTags with Tagger listed only under suggest — importing the concrete Tagger model is a design violation. The 1-star count is not a meaningful quality signal here (it measures the split, not the platform) but it does confirm there is effectively no external community to lean on — support is vendor/team-internal.
Key questions:
vendra-support, Filament, and tenant affordances?misaf/vendra) the acknowledged upstream for issues, security disclosures, and PRs, and do we have a named owner on the vendor/team side?users table conflict with the package migration, and should that migration be skipped or adapted?self.version alignment and transitive-API exposure rules enforced in our lockfile, so we do not drift across the package graph?Stack fit: Assume Laravel/PHP; validate against your Laravel major, PHP runtime, database driver, and auth scaffolding before committing. The package is opinionated toward a Vendra application: Eloquent user persistence, authentication-ready account handling, configurable profile data, Filament admin surfaces, optional tenancy, optional tagging. Score the fit on adjacency: if the app is on Filament and planning multi-tenancy, the module is close to free. If the app is an API-only, single-tenant, non-Filament product with an entrenched auth domain, you will be disabling or reimplementing a meaningful fraction of the package and should re-evaluate the business case.
Migration path: Treat first adoption and version upgrade as separate tracks.
config/vendra-user.php line by line, and decide up front between "extend the package User" (greenfield) and "implement contract + trait on our existing User" (brownfield). Run migrations in a disposable environment first, specifically to observe ordering against any pre-existing users table. Then rewire the auth provider, password broker, policies, gates, and remember-token handling together — a partial model swap is the classic failure here.Compatibility: Check Composer resolution against your lockfile for Laravel, PHP, Filament, and misaf/vendra-support / misaf/vendra-tenant constraints. Because the package graph uses self.version alignment, a single-module bump can force a coordinated multi-package bump — plan the whole graph move as one change, not package-by-package. If you have customised published migrations, overridden the user model, or added columns via separate migrations, verify each against the new release. Confirm the vendra-user testsuite and static analysis (composer stan) run green in your CI, not just upstream's.
Sequencing:
v1.11.0...v1.12.3; classify as patch / feature / potentially breaking.php artisan migrate against a production-shaped schema clone.vendra-tenant:enable {tenant} against a pre-tenancy schema and confirm TenantTableRegistry registration catches every TenantSchema::addTenantColumn() table.php artisan test --compact --testsuite=vendra-user and composer stan.Maintenance: The dominant cost is changelog reconstruction, not code. With release notes reduced to a compare link, every upgrade requires someone to read the diff and write an internal upgrade note — budget this as recurring engineering time, not a one-off. Pin the version explicitly (no floating constraints), and because this is a read-only split, keep any local patches as host-app overrides (custom models, event listeners, separate migrations, view overrides) rather than vendor edits, which would be silently clobbered and impossible to upstream from here. Establish a monthly-or-quarterly review of misaf/vendra for releases across the whole graph, since self.version alignment means the modules move together.
Support: Assume no community support: 1 star, a split repo, and a [READ ONLY] banner mean the issue tracker here is not a support channel. Operational support must be contractually or organisationally internal — a named owner, an agreed SLA for security patches, and a documented path to file upstream issues against misاف/vendra. If that owner does not exist, this package is a single-maintainer dependency on the authentication path, which is a material business-continuity risk that must be accepted explicitly by someone senior.
Scaling: The package sits on the hot path — session handling, login lookups, and per-request user resolution. Two scaling concerns are specific and worth pre-empting. First, address/profile relationships invite N+1 queries on customer lists and checkout/account pages; mandate eager loading and verify query counts with Telescope or DB::listen() before load testing. Second, translatable fields implemented as JSON columns are harder to index and filter than scalar columns; if you make a field translatable, confirm the query patterns still hold at volume. Multi-tenancy adds a third axis: connection and table-name configuration must be validated under tenant switching, not just single-tenant load. Authenticated-request throughput, not raw DB size, is the metric to watch.
Failure modes:
config:clear before config:cache on deploy.users table; the highest-probability first-deploy failure.TenantSchema::addTenantColumn() but was never registered with TenantTableRegistry; fails quietly, discovered later as cross-tenant data exposure or missing columns.$translatable field backed by a non-JSON column, or a non-translatable field carrying translation-shaped array data; surfaces as serialization or Filament locale bugs rather than loud errors.self.version-aligned siblings.Ramp-up: Low for Laravel developers — the package follows familiar Eloquent, service-provider, config-publish, and trait patterns, and the module's own skill documentation is unusually explicit about conventions (namespace, module boundary, translatable persistence, tenant registration, transitive-API policy, tag integration). The genuine ramp-up cost is institutional: teaching the team that this repo is read-only, that the monorepo is the source of truth, that user creation must go through the package service rather than User::create(), and that the test/analysis gate is --testsuite=vendra-user plus composer stan. Plan roughly a day of onboarding for the conventions and one to two days per upgrade cycle for diff review and staging validation; add explicit time if tenancy or translation work is in scope, since both have silent-failure characteristics that only show up under test coverage you have to write yourself.
How can I help you explore Laravel packages today?