runlinenl/nova-profile-tool
Nova Profile Tool adds a dedicated profile page to Laravel Nova, letting authenticated users update their name, email, password, and avatar without leaving the admin panel. Simple to install and easy to customize.
Architecture fit. runlinenl/nova-profile-tool is a narrow presentation-layer add-on to Laravel Nova, not a platform or identity component. It adds a self-service profile page inside the Nova admin panel so authenticated users can edit name, email, password, and configured fields (avatar optional). Fit is conditional on three things being true: the organization already runs Laravel Nova as an internal back-office surface, the need is basic profile self-service rather than customer identity management, SSO/2FA, or compliance-grade account administration, and the Nova version is compatible with a 2018-era codebase or the team is prepared to fork. As a TPM, frame it as a tactical UI convenience with a days-not-weeks payoff, not a strategic dependency. The 1.1.2 release—translatable field labels—is additive and genuinely broadens fit to multilingual admin panels, but it does not change the architectural role or the underlying risk profile.
Integration feasibility. Installable is plausible but not assumed: Composer install, Nova tool registration in NovaServiceProvider::tools(), and vendor:publish are all contingent on the package's composer.json laravel/nova constraint matching the host app. That constraint is the primary go/no-go gate and should be verified with composer show laravel/nova before any sprint commitment. The package is small, config-driven (config/nova-profile-tool.php is the real contract surface), and self-registering, so implementation effort is low once compatibility is confirmed. The 1.1.2 localization work adds a modest but real differentiator for multilingual admin surfaces—provided lang keys are namespaced and the team accepts the added test surface for locale switching, fallback behavior, and validation messages.
Technical risk.
Key questions for the team.
User model use the hashed cast or Hash::make, and does the tool actually produce a $2y$ hash against our schema?Stack fit. Best case is an existing Nova 2.x application on a matching PHP/Laravel pair: install is Composer + tool registration + publish, hours not days. If the host is on modern Nova, treat this as a reference implementation to fork rather than a dependency to install—the shipped compiled JS targets Nova 2's webpack toolchain and will need npm install && npm run prod in a fork. If the panel is English-only, the 1.1.2 translation release is effectively neutral and should not be used as a justification to adopt.
Migration path. There is no meaningful data migration—the tool edits existing users columns. That is a strength for sequencing and a liability for rollback: because this touches authentication, before piloting with real users we should snapshot the users table and document a manual reset path (Hash::make via tinker or a one-off command). The "migration" here is really a configuration and extension migration: publish the config, publish lang files, register the tool, register a UserObserver, and route the package through a thin adapter of our own.
Compatibility and extension points.
config/nova-profile-tool.php. Published config is not re-published on composer update, so it overrides package defaults silently—this is the first place to look when a field is missing.(new ProfileTool())->canSee(fn ($request) => $request->user() !== null), and in any custom controller or resource always resolve the target user from auth()->user(), never from a route parameter.UserObserver::updated() to reset email_verified_at and notify old and new addresses on email change, and to log plus invalidate other sessions (with AuthenticateSession) on password change. This keeps the package lightweight while meeting our audit expectations.profile-tool::fields.name), override via resources/lang/{locale}/vendor/profile-tool/fields.php, and grep our own lang folder for key collisions before publishing. Every custom config field needs matching keys in every shipped locale."runlinenl/nova-profile-tool": "1.1.2".Sequencing.
/nova/profile-tool—confirm from routes rather than assuming), edit name/email/password.password column is a $2y$ hash, Hash::check() passes, and the change landed on our user row.Maintenance. This is the dominant cost and it is not covered by the license. Zero dependents and a single one-line minor release since 2018 mean we should assume the package is frozen: pin the version, assign a named owner, and put an upgrade/fork-review task in the backlog with a date. Treat it as a short-term fork or reference implementation unless fork ownership is explicitly budgeted. Translation upkeep is a real recurring line item—every new config field requires keys in every shipped locale, or raw keys surface in the UI.
Support. No vendor support, no maintainer cadence, no upstream SLA. Support burden lands on our engineering team, and the surface is authentication-adjacent, so tickets will be higher-severity than the feature's size suggests ("I changed my password and got logged out everywhere" / "I changed my email and can't verify"). Define the fallback before launch: a documented manual password reset and profile-correction path so support is never blocked on the package.
Scaling. Low concern on throughput—this is a single-user form posting to standard Eloquent writes inside Nova, with no novel scaling characteristics. The scaling that matters is organizational: the number of locales, the number of custom fields in config, and the number of Nova/Laravel upgrades we intend to survive. Each of those multiplies maintenance linearly while upstream contributes nothing.
Failure modes.
composer require fails when laravel/nova doesn't match—this is desirable. Never use --ignore-platform-reqs to force it; that converts an install failure into a runtime failure.Hash::check against the database.auth()->user(), one admin can edit another. There are no tests to catch this for us.email_verified_at leave accounts in an inconsistent, potentially security-relevant state.Ramp-up. Low for engineers who already know Nova: the package is small, config-driven, and readable, and the published config is the primary contract. Budget roughly half a day to a day of engineering orientation (read composer.json, publish and read config, confirm routes and views exist) plus explicit time for the security review and the tests upstream doesn't ship. For the TPM, the ramp-up is mostly stakeholder framing: brief executives that this saves days of UI work but adds an owned maintenance obligation, and brief engineering that this is a reference or fork—not a dependency to lean on. Minimum viable guardrails before pilot: authorization test, password-hashing test, email-verification-reset test, locale-switching test, observer registered, version pinned, owner named, rollback documented.
How can I help you explore Laravel packages today?