formfeed-uk/nova-breadcrumbs
Adds configurable breadcrumb navigation to Laravel Nova, letting you define breadcrumb trails for resources, custom pages, and dashboards with flexible labels and links for clearer admin navigation.
Architecture fit. This is a thin configuration layer over Laravel Nova's first-party breadcrumb component, not a subsystem. It hooks Nova extension points (service provider boot, tool boot(), config publishing) and emits labels/links; it does not add routes, middleware, models, or frontend assets of its own. For a TPM that means the blast radius of adoption is genuinely small — but it also means the package's value is bounded by whatever Nova's native abstractions already expose. Where the requirement is "relabel and re-link the 4–6 screens ops lives in," fit is good. Where the requirement is permission-aware, tenant-scoped, or dynamically nested trails, the abstraction becomes the constraint and native implementation is cheaper than fighting it.
Integration feasibility. High on paper: one composer require, provider discovery, an optional publish, and a handful of trail definitions in NovaServiceProvider::boot() or per-tool boot(). The real deliverable is not an install, it's a compatibility verdict against our exact composer.lock. The package's last release is 2023-04-25, it has zero dependents, and it almost certainly reaches into Nova internals rather than a public API contract. That is the whole risk story in one sentence: no field validation, no release in roughly two years, and a hard dependency on an extension surface Nova never promised to keep stable.
Technical risk.
Key questions for the spike.
composer.json actually declare, and does it resolve cleanly against our lockfile??client=5)?Stack fit. Native to our stack if we run Nova at all — no frontend/Vue work, no new runtime services, no database surface. The only new artifact is a Composer dependency plus whatever config we publish. That is why this is estimable as a bounded line item rather than an epic: one engineer, one sprint, clear acceptance criteria.
Migration path. There is nothing to migrate from; Nova's native breadcrumbs keep working until we override them. Sequence it as an additive change: install pinned, add one custom tool trail, ship, observe, then expand to resources. Rollback is removing the dependency or removing our trail definitions — both are single-commit operations.
Compatibility gates (do these in order).
formfeed-uk/nova-breadcrumbs:3.1.2 — not ^3.1. 3.1.2 fixed a real home-path duplication bug and there is no reason to sit below it.main.src/ directory end to end. It is small enough to finish in an afternoon, and doing so is the difference between "safe" and "breaks on the next minor Nova upgrade."Nova::availableTools() and middleware-group placement if a tool's crumbs don't render — boot order is the usual culprit, not the package.Sequencing and scoping. Start where native Nova is weakest and where we get the clearest signal: one custom tool page. A resource index is a poor first test because Nova already handles it well and we can't distinguish our override from the default. Then expand to the specific relation-heavy detail screens ops complains about. Keep every trail in one discoverable place — a single central registry in our app code, or resource-local methods invoked from the provider — so that replacing the package later means editing one file, not hunting through vendor/.
Ownership and exit ramp. Treat it as vendored from day one: name the engineer who owns the fork, keep all custom logic in our app code (never patched into vendor/), and document the native fallback. MIT makes copying it into packages/ behind a path repository cheap; the decision we're making is who owns the code, not what it costs.
Maintenance. Low effort, non-zero. Trail edits require a config cache clear (php artisan optimize:clear) — that will cost someone twenty minutes at least once, so put it in the runbook. Gate every Nova upgrade with a manual smoke check covering resource index, resource detail, create/edit, a custom tool, and a dashboard. Assume minor Nova upgrades can break this until proven otherwise; the cheap automated defense is one feature test that hits a Nova route and asserts the expected crumb label appears.
Support posture. Explicitly self-supported. No SLA, no vendor, no security patching from upstream. That is acceptable because the failure mode is cosmetic — but it means support load lands on our own team, and it should be stated that way to stakeholders rather than implied away.
Scaling. Renders on every Nova page load, so the cost is bounded but real: no database queries in crumb closures. If a crumb needs a parent record's name, resolve it from data the page already loaded or cache it. A quiet SELECT per admin page is an easy performance bug to ship and a hard one to notice. Value scales with surface area — this is worth adopting at 4–6 customized screens and unjustified at one or two, where native hooks cover us.
Failure modes to plan for.
canViewAny()/Gate::check() inside the same closure that builds the label.Ramp-up. Under a day for an engineer already comfortable with Nova service providers; roughly an hour to integrate once compatibility is confirmed. The learning curve is not the package — it's Nova's extension points, which the team likely already knows.
Measurement. If we can count ops tickets like "can't find my way back" or "navigation is confusing," this becomes a testable before/after hypothesis rather than an unmeasurable UX change — and gives us a defensible reason to ship or roll back. If we can't count it, treat it as reversible polish and size it accordingly: a slack-week filler win, not a competing initiative.
How can I help you explore Laravel packages today?