optimistdigital/nova-menu-builder
A Laravel Nova package for building and managing menus with a drag-and-drop interface. Create nested menus, link to models or custom URLs, and localize menu items directly from Nova's admin panel.
Build vs. buy for editor-managed navigation. The alternative to this package is a bespoke menus + menu_items schema — polymorphic links, sort order, nested depth, per-item enable/disable, per-locale menu sets — plus the Nova admin UI to manage it. Realistically 1–2 sprints of build and a permanent maintenance tail. This collapses it to a composer require, conditional on the org already holding a Nova license. Without Nova there is no product here, only a migrations-and-models snippet that is cheaper to write by hand.
Roadmap sequencing. "Marketing can change the header without a deploy" is table-stakes, but it usually sits in front of a CMS or marketing-site milestone as a blocking dependency. Pre-built means it lands alongside the rest of the admin work rather than becoming its own scheduled item — which is a real, defensible "we can promise this earlier" statement in planning.
Drawing the line between content navigation and product navigation. Header, footer, sidebar, legal links, locale switcher, campaign items → content, editor-managed, low blast radius. Primary app nav, onboarding, checkout flows → product, hard-coded, high risk. This package makes that boundary cheap to enforce because the content half stops consuming engineering time.
Deciding whether new link types are editorial concepts. Custom item types are pluggable classes, so "link to a landing page template" or "link to a product detail" becomes a bounded, per-initiative decision — not a commitment to a page builder or a CMS migration.
Forcing the localization question at planning time. Multi-locale menus are supported at the data layer. That surfaces the question that actually matters — what is our locale fallback chain, and who owns it? — before launch rather than after.
What it explicitly does not decide: rendering, markup, ARIA semantics, caching, cache invalidation, broken-link handling, or an API surface. It hands you a nested tree; your Blade/Inertia/Vue layer owns everything downstream. The technical review puts that work at 3–5x install time. Budget it as a named line item — this is the number that disappears when the package is sold internally as "free."
Adopt when:
Look elsewhere when:
spatie/laravel-menu with your own persistence, or the menus built into Statamic/WordPress/Craft.Diligence before committing to a client project:
optimistdigital/* → outl1ne/*. Confirm the canonical package name, that the old one is properly abandoned, and that the Nova 4/5 and Laravel/PHP support matrix is current. The rename is a recurring source of confusing Composer conflicts and fatal class-not-found on copied snippets.menus / menu_items table collisions in a production-shaped staging database before the first migrate.Mitigation if you proceed: MIT license plus a shallow integration surface makes fork-and-own cheap. Keep the package behind a resolver seam from day one — views call MenuResolver::for($slug), never MenuItem — so the abandonment risk is "swap one class," not "rewrite the admin." Pin exact versions, run a CI job that boots the panel against the next Nova major, and name an internal owner for the fork path before an upgrade blocks you.
For executives: We can give marketing the ability to edit the site header and footer without a deploy, without buying a CMS and without blocking an engineer for a sprint. The cost is a small dependency, an admin screen that already fits our Nova panel, and a bounded amount of frontend work to render it. The strategic value is that content navigation stops competing with product navigation for engineering time.
For engineering: This is a focused, MIT-licensed Nova package — models, migrations, a drag-and-drop tree editor, pluggable link types, and per-locale menu rows. It is not a frontend solution. It ships no renderer, no cache invalidation, no broken-link handling, and no API endpoint; all of that is ours, and it is the majority of the effort. Install is an hour; production-ready is closer to a week. Two non-negotiables: Nova must already be licensed, and the package must sit behind a resolver seam so a maintenance lapse never becomes a rewrite. Pin the version, watch the vendor rename, and verify the release cadence against Packagist before we commit.
The honest one-liner: it's a genuine accelerator for a narrow, well-understood problem, on one condition — that we're already a Nova shop and we budget the frontend work as real work rather than treating the package as free.
How can I help you explore Laravel packages today?