interaction-design-foundation/nova-html-card
A Laravel Nova card that renders custom HTML or Blade content directly on your dashboards and resource pages. Drop in markup, embed views, and build flexible info panels without writing a full custom card component.
What it is: A Laravel Nova card that renders arbitrary HTML in a dashboard or resource view. It is a thin presentation-layer wrapper — no models, no migrations, no routes, no persistence. The entire value is "put content where operators already are."
Architecture fit: Good, and deliberately shallow. Nova cards are registered through NovaServiceProvider and rendered as isolated Vue components, so this package slots in without touching application domain code. That makes it a presentation-layer dependency, not an architectural one — trivially removable and cheap to A/B against a hand-rolled card if needed.
Integration feasibility: Low effort. Composer install plus one card registration; realistically a half-day including review and a staging check. The real work is not technical — it is deciding what content goes in and who is allowed to author it.
Technical risk (ranked):
Key questions to resolve in the spike:
canSee() / authorization callbacks so cards can be permission-gated per role?view()->render()), enabling templating and i18n rather than string concatenation?v-html, or is it purely server-rendered?Stack fit: Requires Laravel + Nova (paid license) — a non-starter if Nova isn't already your admin layer. For teams already standardized on Nova, fit is essentially perfect: it adds zero new runtime concepts.
Migration path: Greenfield-friendly; nothing to migrate. If replacing existing ad-hoc documentation (Confluence links in a wiki, pinned Slack messages, README files nobody reads), the migration is a content move, not a code move. If replacing a bespoke custom Nova card you already maintain, this package likely deletes code — a net maintenance win.
Compatibility posture: Pin to an exact version in composer.json and record the Nova version it was validated against. Keep the integration behind a small internal wrapper class (e.g., App\Nova\Cards\DocsCard) that extends the package card, so a swap or fork is a one-file change. That wrapper is the single most valuable TPM-level control here.
Sequencing (recommended 3-step rollout):
nova:assets publishing, verify against production CSP, verify Nova version.canSee() to the ops role. Measure: support pings deflected, time-to-find for new hires.mews/purifier) and a named owner for the content source before enabling any non-developer authoring.Do not skip to step 3. The package is safe as a developer-authored documentation surface and becomes a security review item the moment content authoring is delegated.
Maintenance: Very low steady-state. No migrations, no scheduled jobs, no external services. Cost is a composer dependency plus a version bump when Nova upgrades. Realistic ongoing cost: a few hours per Nova major upgrade.
Support: Low, but diffuse — because the artifact is content, not code, "support" means answering "who changed this card?" Adopt a convention (card content lives in version control, in the same file as its registration) so the answer is a git blame, not an investigation. This is a one-line policy that prevents a recurring annoyance.
Scaling: Negligible by construction. Rendering is server-side string interpolation on dashboard load; no queries, no cache, no N+1. The only scaling concern is cognitive: dashboards accrete cards until nobody reads any of them. Set a soft cap (recommend ≤5 docs cards) and a review cadence, or you will build a second, worse wiki inside Nova.
Failure modes:
Ramp-up: Effectively zero for any Laravel developer — the API is a card class and a string. The onboarding effort that matters is for content owners, not engineers: a short written policy covering what may be embedded, the sanitization rule, and the review cadence.
TPM verdict: A cheap, low-risk, single-purpose lever with a clear ownership boundary. Approve for developer-authored dashboard documentation and environment/on-call banners; treat database-driven or user-authored HTML as a separate, security-reviewed decision. The package's technical merits are unremarkable — the reason to adopt is organizational: it shortens the loop between "operators need this information" and "operators see this information" from a sprint to an afternoon.
How can I help you explore Laravel packages today?