digitalcloud/nova-custom-views
Add fully custom views to Laravel Nova resources. Define your own index, detail, and form screens with Blade templates, keeping Nova's navigation and authorization while giving you complete control over layout and data.
"Build vs. buy vs. fork" — the only framing that fits. At 79 stars, zero dependents, and a last release of 2018-11-12, this is not a library selection decision; it is roughly 200–300 lines of glue code that renders a Blade view inside a Nova screen. The real strategic options are: (a) vendor it, pin it, and own it; (b) fork it into your namespace with a compatibility test against your Nova/Laravel/PHP matrix; or (c) replace it with a native Nova custom field/tool (≈30 lines on Nova 4+) and remove the dependency entirely. Treating it as a normal composer dependency with no named owner is the failure mode — it becomes an unplanned migration line item at your next Nova upgrade.
Admin-surface roadmap: ship internal panels this sprint vs. next quarter. The concrete value is turning "add an ops health panel / Stripe customer snapshot / changelog view / external-system sync status" from a multi-week Vue tool scaffold into days of Blade work, using Nova's existing layout, auth, and navigation. That is a real scheduling decision for internal tooling that rarely competes well for frontend capacity. Measure every other claimed benefit against this one — it is the entire proposition.
Resolve the product-identity ambiguity before scoping anything. The README pitches navigable custom pages (route + menu entry + middleware/auth inheritance); the engineering review, working from the code, describes a Nova field that renders a Blade partial on a resource screen (fields() entry, ->with() data callback). These are different products with different integration costs, different authorization surfaces, and different upgrade risk. Do not commit a sprint until someone has read src/ end-to-end and confirmed which one you are buying. Ten minutes of code reading replaces a week of misdirected estimation.
Sequencing against the Nova upgrade — put both decisions on one board. Nova 2 reworked field/meta serialization; Nova 3/4 moved the Vue and asset pipelines. On Nova 3+ the PHP side may install cleanly while the JS component silently fails to register (blank panel, "unknown component" console error). If a Nova major upgrade appears anywhere on the roadmap, that upgrade is this package's retirement date. Decide the migration path now, while the screens are few and the cost is roughly a day, rather than discovering it mid-platform-upgrade.
Team shape and capacity allocation. It lowers the bar for Blade-fluent, Vue-light Laravel developers to contribute admin UI — valuable when frontend skill is thin, contracted, or committed to customer-facing work. The inverse is equally a decision input: if your team is Vue-strong and already on current Nova, this package buys you nothing and adds unowned surface area.
Use-case fit is genuinely narrow — say so explicitly. Good fit: read-only detail-screen panels, one-off reports, external-system status blocks, admin settings summaries, and Blade partials already living in the main app. Poor fit: customer-facing UI, anything needing SPA behavior (tabs, filters, polling, modals), or screens spanning many pages. The rule of thumb to circulate: if the view needs to know something after the page load, this is the wrong tool.
A market signal worth recording for platform strategy. A high opportunity score against a mediocre overall score is a demand signal: teams want lightweight, Blade-based custom admin screens in Nova, and maintained supply is thin. That argues for standardizing internally — deliberately own a fork, or standardize on a modern admin framework (native Nova tools, Filament, Backpack) — rather than letting bespoke, unowned glue accumulate per project.
Consider it when:
composer.json.Gate::allows() / authorize() plus a test.Look elsewhere when:
v-html injection makes {!! !!} an XSS vector requiring audit, and Nova's aggressive asset caching makes nova:publish + hard refresh a routine debugging step.Adoption gate (cheap, run it first): one throwaway resource, one read-only panel, one branch. Confirm the component registers in the browser console, confirm the view namespace resolves, confirm authorization behaves. If a blank panel appears, triage in this order: browser console for a Vue registration error → composer show for what actually installed → view:clear for namespace resolution → published assets. PHP errors surface in the Nova log; a silently empty panel is almost always JS or view resolution.
To executives — one paragraph: There is a small, unmaintained open-source helper that lets us drop Blade templates into our Laravel Nova admin as read-only panels, so we can ship internal ops screens — health checks, billing snapshots, sync status — in days of Blade work instead of weeks of frontend scaffolding. It is roughly a few hundred lines of glue code, last released in 2018, with zero dependents and no security response path. The recommendation is therefore not "adopt a library" but a bounded, time-boxed decision: we either fork and own it with a named owner and a compatibility test, or we replace it with roughly thirty lines of native Nova code on a current version. Either way we set the retirement date now — the next Nova major upgrade — so it never becomes a surprise line item.
To engineering — the honest version: This is a 2018-era Nova 1.x package. The PHP side may install and boot cleanly while the Vue component fails to register on Nova 3+, producing a blank panel and a console error. That is the headline risk, and it is cheap to test: one throwaway resource, one branch, one read-only field defaulting to ->onlyOnDetail() and ->exceptOnForms(), with data computed in the ->with() callback and rendered dumb in Blade using {{ }} only. If it works and the Nova version is legacy, we vendor it, move it into our namespace, pin it, commit published assets, add a matrix compatibility test, and name an owner. If it doesn't work — or if we're on Nova 4+ — we write the native field instead and skip the dependency entirely. We also resolve the docs inconsistency first: navigable page vs. field-rendered partial are different integrations, and the code is the source of truth. Authorization is enforced in the view, not assumed from the route.
The one-line framing to reuse: a narrow, cheap, deliberately-owned tool for read-only internal admin panels on legacy Nova — valuable precisely because it is small, and dangerous precisely because it is unowned.
How can I help you explore Laravel packages today?