palauaandsons/nova-tags-field
A Laravel Nova field for adding tag-style input to your resources. Lets editors attach multiple tags through a clean, searchable interface, making it easy to organize, filter, and manage records from the Nova admin panel.
Architecture fit. This is a back-office UI extension, not a platform component. It plugs into a Nova resource's fields() method and renders a searchable select-or-create tag input; it never touches routing, domain services, queues, APIs, or customer-facing surfaces. That makes it the lowest-risk integration class we can take on — a Composer dependency scoped entirely to the admin layer, with blast radius capped at a handful of admin screens and a trivial removal path. The one hard gate: it is Nova-only, so confirm Nova is licensed and in active use before any engineering time is spent. Outside that context the package has zero value. Position it in the roadmap as an "internal tooling UX accelerator," not a dependency the product builds on.
Integration feasibility. Mechanically trivial: composer require, one field line per resource, php artisan nova:assets. The real feasibility question is a documentation contradiction that must be resolved before we commit budget. The description claims the package "uses cartalyst/tags," while the Laravel-level integration guidance describes persisting a flat JSON array with an array/AsArray cast. Those are materially different data models with different downstream ceilings:
cartalyst/tags implies a polymorphic taggable pivot, a shared tag namespace, cross-model queryability, and migrations to own.whereJsonContains that will not scale to large datasets.That distinction drives schema design, reporting capability, data migration effort, and whether tags are reusable across records. It must be answered by reading the shipped 4.0.1 source and README — not the marketing copy. This is the single highest-value diligence item a TPM can force here: a half-day spike that prevents a quarter of schema regret.
Technical risk. Tier this as low adopter risk, high sustainability risk, and manage the two separately.
Key questions.
cartalyst/tags (pivot + migrations), or persist a JSON array on the model? README and source may disagree.Stack fit. Suitable only where the stack is Laravel + Nova and the need is an admin-facing tag input for content taxonomy, record labelling, or CRM-style segmentation. Explicitly not a fit for non-Nova Laravel, Blade/Vue frontends, or any customer-facing surface. Confirming Nova is licensed and in use is the gate that kills a surprising share of "should we adopt this?" conversations — clear it first.
Migration path. Split by cohort, because the work is asymmetric.
nova:assets, hard-refresh, and visually verify the input in both light and dark themes. No data migration and no config change implied by the patch.cartalyst/tags versus JSON storage question against actual source, (b) proves create/read/update/search/filter end-to-end on one resource, and (c) confirms the model cast. Only then commit to a storage contract — the package is cheap to try, the schema is expensive to reverse.Compatibility. Treat Nova major-version alignment as a standing gate, not a one-time check. Verify the supported Nova version against current and next-planned majors; if a Nova upgrade sits inside the dependency's lifetime, budget for replacing or forking at that moment. Pin the exact version (4.0.1) in the lockfile and record the pin plus its rationale in the decision log so the next engineer understands why it is frozen.
Sequencing.
cartalyst/tags relational model — document it, and put normalization (trim/dedupe/lowercase) in a model mutator so admin writes and API/CLI writes converge.rules() with model-level validation (API and CLI writers bypass Nova validation entirely), and apply onlyOnDetail/hideFromIndex where rendering cost matters.Weigh build vs. buy honestly: a Nova tag field is a few hundred lines. If the need outgrows simple labelling — custom chip rendering, async lookup, a real Tag relation — the package's stated extension path ("publish and fork the Vue components") is most of the build anyway, so skip the dependency and build.
Maintenance. Low, but not zero, and it must be owned. Standing costs: Nova upgrade smoke tests on every major, a pinned lockfile, and periodic checks that the upstream repo hasn't gone dark. Assign a named internal owner — this is the single most important operational control for a 10-star, single-maintainer dependency. The version pin plus a documented rationale in the decision log prevents silent drift.
Support. There is none — no SLA, no vendor, no procurement-safe security trail. That is acceptable for internal-only admin convenience and unacceptable for anything operational. The support model is: we support it ourselves, and the fallback is the published Vue components forked into our codebase. State that in the adoption record so the escalation path is explicit before it is needed.
Scaling. Fine for the intended use — modest admin screens, a handful of resources. Two scaling caveats: a JSON-column model won't support tag-based reporting or aggregation at volume (JSON-path filtering degrades), and rendering many tag chips on index views costs front-end cycles, so use hideFromIndex/onlyOnDetail where it matters. If tags become a filterable, aggregated, or reported-on dimension, that's the signal to migrate to a first-party relational schema — plan that as a separate, justified roadmap item rather than stretching this package.
Failure modes. Enumerate them up front so they are annoyances, not incidents:
Degraded mode in all cases: a comma-separated text input, a few hours of work. That keeps every failure above in "annoyance" territory.
Ramp-up. Half a day for composer require, one fields() entry, nova:assets, and a light/dark render check — plus the 1–2 day spike if it's a new adoption with schema implications. Onboarding cost for a new engineer is low because the surface is small, but the decision-log entry and the naming of the fork owner are non-negotiable handoff artifacts; without them, the next engineer inherits an undocumented frozen dependency and no fallback. Budget the standing Nova-major testing as recurring, not one-off.
How can I help you explore Laravel packages today?