oriondevelops/nova-greeter
oriondevelops/nova-greeter is a small Laravel Nova add-on that greets users on the dashboard with customizable, time-aware welcome messages. Lightweight and easy to configure, it adds a friendly personal touch to any Nova admin panel.
Architecture fit. oriondevelops/nova-greeter is a Laravel Nova dashboard card — a PHP class extending Laravel\Nova\Card that hydrates a Vue component into Nova's dashboard grid. It lives entirely in the presentation layer: no migrations, no publishable config, no scheduled jobs, no domain logic, no auth or permission changes. From a delivery standpoint this collapses scoping to a single binary gate: does this product run a licensed Nova installation, and do we want a greeting affordance on the admin dashboard? If yes, it is a self-contained UI unit that can be added or removed with a one-line revert. If no, the package has zero transferable value and should be closed out of the evaluation immediately rather than carried in a backlog.
Integration feasibility. The mechanical work is roughly half a day end-to-end including code review and a visual verification pass: one composer require, one entry returned from NovaServiceProvider::cards() (or a specific dashboards() definition if we scope per dashboard), an optional php artisan nova:publish, and a hard-refresh check. There are no data dependencies and no cross-team coordination surface beyond the platform owner who controls Nova. A TPM should treat the engineering task as effectively pre-solved and reallocate their attention to the actual product question: what does this panel do for the user, and is it a standalone nicety or the anchor for onboarding content we intend to build on.
Technical risk. Functional risk is low — the worst realistic outcome is a card that renders blank, which is cosmetic and recoverable. The risks that actually belong on a TPM's radar are delivery and governance risks:
composer.json Nova constraint covers the version we run today and the version we plan to upgrade to. A card built against Nova 4 can install cleanly and render nothing on Nova 5.src/NovaGreeter.php and resources/js/components/Card.vue to determine the actual configurable prop surface, because unrecognized meta keys are silently discarded.withMeta([...]) and only keys declared in the Vue props array survive hydration. That means any stakeholder requirement ("show their first name," "say good afternoon") is dependent on prop names a maintainer never documented.Key questions to resolve before approval:
name, and who owns the fallback (display_name ?? email)?Stack fit. The package is a native Nova card and therefore only fits a stack that already includes Laravel + a licensed Nova installation at a compatible major version. There is no framework-agnostic path and no version that works without Nova. Confirming the Nova license and version is the first gate, not an afterthought — this card should never be a factor in a Nova licensing decision, only a beneficiary of one already made.
Migration path. There is essentially no migration: no schema changes, no data backfill, no config publication, no queue or scheduler wiring. The only state is whether the card is registered and what meta we pass. That gives us an unusually clean adoption/rejection symmetry — deletion is one array entry plus a composer update, with no migration to roll back and nothing else built on top of it. We should preserve that property deliberately: do not build anything on this card that we could not delete without a migration. Any requirement that would violate this is the signal to fork.
Compatibility. Two axes matter:
composer show oriondevelops/nova-greeter --all and compare against our installed Nova. If it does not cover our major, or does not cover the next major we intend to move to, the correct posture is to vendor/fork the source rather than depend on it. Pin the exact version in composer.json regardless.php artisan nova:publish, then a hard refresh) rather than trusting a clean composer require as evidence of a working render.Sequencing. I would sequence this as a low-risk, time-boxed spike rather than a feature:
Card.vue props; grep resources/js for fetch|axios|http to confirm no outbound calls. This is the security review and the requirements-feasibility check in one pass.composer require with a pinned version, register in cards() as ->width('full') at the top of the main dashboard, nova:publish, hard refresh. Verify it renders.name on SSO accounts (fallback via meta, not by editing vendor code) and timezone behavior of the salutation.canSee so service accounts and shared admin logins don't see a greeting addressed to a role, not a person. Consider per-dashboard scoping so it appears only on the main dashboard, not admin-only ones.Decision checkpoint after step 3: if any requirement beyond "greeting strip" surfaces — CTA, onboarding checklist, release notes, activity summary, role-specific quick links — stop depending on upstream at that moment and scaffold with php artisan nova:card acme/greeter, copying Card.vue into our own card. A greeter is small enough to reimplement in an hour, and doing so eliminates the compatibility-drift risk entirely. Treat adoption as reference implementation, not strategic dependency.
Maintenance. Steady-state maintenance cost is near zero if and only if we pin the version and treat the package as frozen. The maintenance burden is not in the card itself; it is in the two events that will eventually touch it: (a) a Nova major upgrade, and (b) a user-model change that alters the name field. Both are our responsibility, not upstream's. Assign explicit ownership — a named team, not "the platform team generally" — for the vendored/forked copy and for the visual re-verification on every Nova upgrade. Plan to fork on first need rather than filing an upstream issue; with a bus factor of one and no dependents, an upstream fix has no expected arrival time.
Support. There is no community backstop: 8 stars, 0 dependents, one maintainer, one release. Internal support load should be modeled as first-line support is us, with the vendor source as the reference. Practically, this means documenting the fork point in the runbook and keeping the two vendored files (NovaGreeter.php, Card.vue) readable to any engineer on the team. Because the card is a pure view, first-line triage for "my greeting is wrong/missing" is genuinely tractable: check canSee gating, check the name fallback, check whether a stale asset manifest is at play.
Scaling. The card has no scaling dimension to speak of — it is a per-session Vue component with no data access, no queries, no cache, no external calls (pending the grep confirmation). It will not affect dashboard latency or throughput at any realistic admin user count. The "scale" concern here is organizational, not technical: the number of Nova dashboards and the number of distinct audiences (ops, support, content, admin-only views) grows, and each one is a placement decision. Prefer a second card class gated by canSee() over stuffing conditionals into meta, so that Nova's card system owns routing and visibility and the greeter stays a pure presentational component. Keep the greeter out of admin-only dashboards.
Failure modes and triage. Ranked by likelihood:
/nova-api request or missing compiled JS, then php artisan nova:publish, clear browser cache, hard refresh. Document this in the runbook so it isn't escalated as a platform incident.props array is discarded without warning — a stakeholder requirement can appear "delivered" while doing nothing. Mitigate by cross-checking every key against Card.vue at review time and verifying visually.name, producing "Good morning, " or a broken string. Fix in meta ('name' => $user->display_name ?? $user->email), never by patching the Vue file, which composer update will overwrite.composer update to warn you.Ramp-up. Effectively none for the adopting engineer — the install and registration pattern is idiomatic Nova and the card has no domain concepts to learn. Budget the half-day for install plus review, and treat the real ramp-up as organizational: getting the security/provenance review done, agreeing placement and audience gating with the stakeholders who own the admin tooling, and writing the two-line runbook entry for blank-card triage and the fork decision point. If the effort estimate ever exceeds a day and a half total, the correct move is to write the card in-house and skip the dependency entirely.
How can I help you explore Laravel packages today?