iki/seo-meta
iki/seo-meta is a Laravel package for managing SEO metadata in your application, letting you define and render page titles, meta descriptions, canonical URLs, and social sharing tags from a clean, fluent PHP API.
Bottom line: this is a single-maintainer Nova field package with zero adoption, zero dependents, and a release history that stopped in July 2023. It is not a dependency to adopt as-is; it is at best a reference implementation to fork, or a reason to build the same field in-house in a day.
Architecture fit. The package is a Laravel Nova field, not a general SEO library. Nova is a commercial, license-gated admin panel, so the package is only relevant if Nova is already the back-office surface for the content models in question. It does not appear to provide a front-end rendering layer, sitemap generation, or meta-tag Blade components — meaning it solves the editor input problem (title, description, OG tags, canonical, robots as a JSON blob on a model) and leaves the output problem to us. That asymmetry matters: the cheap, low-risk half is in the package; the half that actually affects SEO correctness is not.
Integration feasibility. Mechanically straightforward for a Laravel developer: composer require, register the field in a Nova resource, publish compiled assets. The real feasibility question is not "does it install" but "does it survive our upgrade cadence." Nova 5 moved to Vue 3; a field last released mid-2023 was almost certainly built against Nova 4 / Vue 2. If we are on Nova 5 or plan to be, the field's compiled dist/ assets are likely incompatible, and fixing that means owning the Vue build toolchain ourselves.
Technical risk.
composer.json will tell us whether Laravel 11/12 is even installable; Nova 5 support is a separate and more expensive question.Key questions to answer before any code is written.
json column? What is the exact payload shape, and is that shape documented anywhere other than the source?dist/ committed to the repo, or must we build assets to install it at all?Stack fit. Treat this as non-adoptable as a dependency and as high-value as a reference. The correct integration pattern is: vendor the source into our own namespace (or a private fork), pin it, and take ownership — never require it from Packagist in a production composer.json where a future composer update or an upstream deletion can change our admin UI.
Decision path.
php artisan nova:field against the current Nova scaffold is likely cheaper than resurrecting Vue 2 assets, and it gives us a supported build pipeline.Migration path. Two independent tracks, and they should be sequenced so the data contract lands before the UI:
Compatibility and sequencing. Pin by commit SHA, not by tag or branch. Add a composer.json constraint audit for PHP and laravel/nova before the spike, not during it. Sequence: schema decision → spike on a throwaway branch → front-end output rendering (meta tags, OG tags, canonical) built and tested independently of the field → field UI last.
Concrete guardrails if we proceed. Fork under our org, keep upstream as a read-only remote, commit the built assets so deploys don't require Node on the release box, and add at least a smoke test that a saved resource round-trips its meta payload.
Maintenance. Assume we own 100% of it from day one. Budget for: a Nova major-version upgrade touching the Vue component, a Laravel/PHP constraint bump, and asset rebuilds. Realistically this is a small, periodic tax — a few hours per Nova upgrade — but it is a tax on the admin panel, which is the surface content editors depend on daily, so outages are visible and urgent.
Support. No upstream support to lean on. Internally, the owning team should be whoever owns the Nova admin, not a general platform team — the failure surface is editorial workflow, not runtime infrastructure. Document who can rebuild dist/.
Scaling. Effectively zero runtime scaling concern. The field is admin-only; the public request path only ever reads a JSON column on an already-loaded model. The scaling risk is organizational, not technical: if meta is stored as opaque JSON with no accessor, every new consumer (API, sitemap generator, AMP template) re-implements parsing and they drift.
Failure modes to design against.
composer.lock.<head>. Mitigation: escape at output, and treat the stored JSON as untrusted on read.Ramp-up. Low for installation and wiring — an afternoon for a mid-level Laravel developer. High for modification: changing field behavior requires Vue competence plus familiarity with Nova's asset registration, which is a narrow, thinly documented skill. That asymmetry is the core operational argument against adoption: easy to start, awkward to steer.
Recommendation. Do not add this as a dependency. Reuse it as a spec for a first-party Nova field backed by a schema we define, with the front-end rendering layer built and tested independently. The package's zero-adoption profile is not disqualifying on its own — the disqualifier is that it occupies the low-risk half of the problem while creating ownership obligations in the high-risk half.
How can I help you explore Laravel packages today?