Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Meta Tags Laravel Package

torann/meta-tags

Meta tags manager for Laravel that adds SEO and social metadata to models and views with a fluent, configurable API. It handles titles, descriptions, Open Graph, and Twitter cards, keeping tag setup readable and centralized.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package addresses a genuinely cross-cutting presentation concern (page metadata) through Laravel's idiomatic extension points: a service provider, a facade for controller-side writes, a publishable config for defaults, and a Blade directive for rendering. That is the right shape for a Blade/Livewire server-rendered app — metadata is resolved per request and rendered once in <head>.
  • Fits: Laravel monoliths with Blade layouts, CMS/marketing surfaces where title/description/OG fields live on Eloquent models, multi-locale or multi-tenant apps needing per-request metadata.
  • Does not fit: Inertia/React/Vue SPAs with an existing client-side head manager (two sources of truth), or static global metadata only (a layout partial is cheaper than a dependency).
  • Coupling note: the facade and @meta directive are transitive dependencies of every template that calls them. Constrain usage to a single head partial/component so the API surface appears in exactly one file.

Integration feasibility

  • The gating question is not functionality, it is installability. Last release is 2017-01-24 (v0.0.4), which places it in the Laravel 5.3/5.4 era — before package auto-discovery landed in 5.5. Expect to register the service provider and facade alias manually, and expect the composer.json constraints (illuminate/support, PHP ^5.6|^7.0) to hard-conflict with PHP 8.x / Laravel 10–12.
  • Realistic paths: (a) composer require on a modern stack fails, (b) succeeds only with --ignore-platform-reqs (unacceptable for production), or (c) requires a maintained internal fork that widens constraints and adds a compatibility shim. A one-day spike answers this definitively via composer why-not.
  • Functional scope is small enough to verify by hand: correct <meta name="description"> attribute key, property vs name conventions for OG, escaping of quotes/ampersands/non-ASCII, and single-emission per tag.

Technical risk

  • Abandonment (high): 6 stars, 0 dependents, no release in ~8 years, single maintainer. Zero dependents means no community canary — we would be the only ones discovering breakage.
  • Quality signal (high): a patch-level fix to the description attribute key means the library's single core output was wrong in the wild. Assume thin or absent test coverage and re-verify every tag type ourselves.
  • Compatibility drift (high): Laravel's container, provider registration, and PHP type expectations have moved substantially; unpinned adoption is a latent upgrade blocker.
  • SEO blast radius (medium→high): failures are silent. A wrong attribute key or duplicated description tag degrades search and social previews without an exception or alert.
  • Supply chain (low): BSD-2-Clause is permissive and clean; the package is tiny, so audit cost is low and vendoring/forking is cheap.

Key questions

  1. Does it install against our exact PHP/Laravel matrix without constraint overrides? If not, is a fork acceptable, and who owns it?
  2. What is the honest build cost of the alternative — a config array plus a ~40-line Blade component, with our own feature tests? If that is ≤2 engineer-days, "build" wins on TCO regardless of package quality.
  3. Do we need JSON-LD/structured data, hreflang, or canonical URL logic? Confirm coverage before committing; this package is positioned as "extremely simple."
  4. Who is the named internal owner of the fork, and what is the exit trigger (Laravel major upgrade, security advisory, first rendering defect)?
  5. Are non-engineers authoring metadata? If yes, the model-driven workflow is the value; if no, the value proposition collapses to "fewer duplicated <meta> blocks."

Recommendation: Treat as conditional / pilot-only, not a standard. Only adopt if (1) the install spike passes cleanly, or (2) we accept a fork with a named owner. Otherwise build the small internal equivalent — the package's scope is not a differentiator, and its maturity is a liability.

Integration Approach

Stack fit

  • Target: Laravel + Blade/Livewire, server-rendered <head>, PHP 8.x, CI with Composer lock and Dependabot.
  • Non-target: SPA/Inertia front ends, or teams already using a head-management library — do not introduce a second metadata authority.

Compatibility

  • Pin exactly 0.0.4 (the description-attribute fix). Do not use ^0.0 — pre-1.0 semver permits behavior changes in patch releases, and there is no upstream to consult about intent.
  • Validate a 3×3 matrix before piloting: {PHP 8.1/8.2/8.3} × {Laravel 10/11/12}, or whatever two versions we actually run. Success criterion is composer install with no constraint overrides plus correct tag output.
  • Manual wiring assumed: service provider + facade alias registration; confirm config publish tag exists, and that config:cache and view:cache round-trip cleanly.

Migration path

  1. Inventory existing hardcoded <meta> blocks across layouts and views; count page types. If the number is small (<5), stop — build instead.
  2. Spike on a throwaway branch: install, wire provider/facade, emit one description tag from a controller, assert markup in a feature test.
  3. Introduce a single head partial (resources/views/partials/head-meta.blade.php) that owns all meta rendering. Nothing else in the codebase may call the facade or directive.
  4. Parity check page type by page type: assert the new output matches the old markup for title, description, canonical, OG, Twitter — including escaping edge cases (apostrophes, &, CJK/accents).
  5. Delete duplicates in the same PR that adds package output; otherwise both render and crawlers see conflicting descriptions.
  6. Wrap behind an internal seam — a PageMetadata service or view composer — so replacing the package later is one file, not a template sweep.

Sequencing

  • Week 1: spike + compatibility matrix + build-cost estimate for the internal alternative. Go/no-go gate here.
  • Week 2: pilot on one non-critical, content-driven surface (marketing/blog), with feature tests asserting exact markup.
  • Weeks 3–6: expand page type by page type behind the head partial; no API leakage into templates.
  • Ongoing: re-evaluate at first Laravel major upgrade and at any upstream 1.0 (unlikely). Escalate to "replace" if a second rendering defect is found.

Operational Impact

Maintenance

  • There is effectively no upstream maintenance. Budget internal ownership from day one: fork under our org, CI on the supported matrix, changelog of our own patches, and a documented diff from upstream so we can drop the fork if the package is ever revived.
  • Add the fork to dependency scanning and lockfile review; keep the surface small enough that a full audit fits in an afternoon.
  • Enforce the "one head partial" rule in review — it is the only durable protection against API sprawl.

Support

  • No SLA, no security policy, no release cadence, no maintainer responsiveness. Support is entirely internal. This must be explicit in the adoption decision — it is not a "community-supported" dependency in any practical sense.
  • Documentation is thin (a README and a handful of assessment notes); expect engineers to read the source, which is cheap given the size.

Scaling

  • Runtime cost is negligible: metadata rendering is a handful of string operations per request and is naturally memoized per request. No meaningful effect on throughput or p95 latency.
  • The real scaling constraint is organizational, not technical: each additional page type and locale/tenant variant adds a place where defaults, overrides, and fallbacks can disagree. Multi-locale and multi-tenant resolution must happen in middleware after locale/tenant is known, or metadata will be wrong for a subset of requests with no visible error.
  • Config caching is a scaling-adjacent trap: stale cached config after deploy is the most common "it didn't apply" report.

Failure modes

Failure Symptom Detection Blast radius
Composer constraint conflict Install/upgrade fails CI Blocks Laravel upgrades
Wrong attribute key (name vs property) Crawlers/social ignore the tag Silent SEO + share previews
Duplicate description tags Conflicting metadata Silent SEO ranking/preview
Escaping defect (quotes, &) Broken markup in <head> Silent or layout breakage Page rendering
Empty defaults on new page type Blank/absent title or description Silent SEO
Config cache stale Changes don't apply Manual Confusing debugging
Upstream goes fully dark No patch path — Forces fork/replace
  • Critical property: almost all failures are silent. Mitigation is mandatory feature tests asserting exact rendered markup per page type, plus a scheduled smoke check of the rendered <head> on key URLs in staging.

Ramp-up

  • Engineer ramp-up: ~half a day to be productive, ~1 day to be confident, given the small source and thin docs; the manual provider/facade registration is the only non-obvious step.
  • PM/stakeholder ramp-up: low — the concept is well understood, and the pitch is straightforward. The education burden is the maturity story, not the technology.
  • Content-team ramp-up: only relevant if model-driven metadata is wired up; plan a short guide on field ownership (who writes titles/descriptions, character guidance, OG image requirements) — otherwise the tooling ships without the workflow that justifies it.

Bottom line for the roadmap: this is a small, undifferentiated glue dependency with a stale upstream and a documented correctness defect history. It can accelerate an SEO/sharing initiative on a low-risk surface, but only behind an internal seam, pinned to 0.0.4, with a named owner and a defined exit trigger. If the install spike fails or the internal build estimate lands at ≤2 engineer-days, choose the build.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
frankyso/ipaymu
3mdikram/worldmoneywords
snowsoft/config
itmosoft/laravel-subscriptions
larva/laravel-ai-qwen
diephp/sequences
users-au/socialite-provider
twidpay/twid-logger
mrnewport/laravel-plaid
mrnewport/laravel-repo
mrnewport/laravel-docsign
mrnewport/laravel-stow
mrnewport/laravel-flow
mrnewport/laravel-priceable
mrnewport/laravel-nestedterms
fredmeng/laravel-apidoc-generator