ralphjsmit/laravel-filament-seo
A Filament PHP fieldgroup that edits the title, author, and description of a laravel-seo model. It automatically loads and saves data through the seo() relationship, so you can drop SEO::make() into any form with no extra configuration.
What this package actually is. ralphjsmit/laravel-filament-seo is not an SEO platform. It is a thin Filament form adapter over ralphjsmit/laravel-seo, contributing exactly one useful primitive: SEO::make(), a fieldgroup that renders SEO title, author, description, and — since 1.4.0 — a robots-tag control, then transparently loads and persists those values through the model's polymorphic seo() relationship. The parent package owns the schema, migration, seo.php configuration, persistence model, and any front-end rendering. The TPM lever is therefore time-to-admin, not SEO capability: it buys back the hours a developer would otherwise spend hand-building metadata fields, relationship hydration, and save logic inside a Filament resource.
Architecture fit. Good fit for a Laravel application that already runs Filament and is willing to adopt the parent laravel-seo package as its metadata store. Both conditions are hard prerequisites. The package has no standalone mode, no abstraction layer over the parent, and no fallback if the parent is rejected. If the parent is out (existing SEO tooling, a CMS integration, or an agency-managed platform), this package has no role. It also should not be positioned to stakeholders as covering sitemaps, redirects, canonical management, JSON-LD/structured data, OG image generation, keyword scoring, audits, or analytics — none of that is in scope, and correcting that expectation early is the single highest-value thing a TPM does here.
Integration feasibility. High on the happy path. One composer require pulls the parent; then publish and configure seo.php, run the parent migration, add the HasSEO trait to each target model, and drop SEO::make() into the Filament form schema. The README demonstrates both Filament Admin resources and standalone Filament Forms inside Livewire. The standalone path carries one non-obvious trap: after creating a record you must explicitly call $this->form->model($post)->saveRelationships() or the SEO relationship silently does not persist. For a competent Filament developer on an existing resource, first working integration is hours, not days; per-model rollout thereafter is closer to minutes.
Technical risk.
Filament\Resources\Form, getFormSchema()), while the package has shipped V3, V4, and V5 support. Code has moved ahead of docs; expect developers to read source and translate examples. Budget for that, and do not treat the README as an integration spec.updateOrCreate (0.6.2), create-on-save semantics (0.6.0), and dynamic SEO model handling (0.7.0). These are fixed, but create → edit → re-save → relationship-load paths deserve explicit acceptance tests rather than trust.Key questions before committing.
^.ralphjsmit/laravel-seo acceptable as our metadata store, and who owns its config and migration?HasSEO in phase one, and is the polymorphic relationship acceptable for our reporting/replication needs?Stack fit. Requires a Laravel application with Filament installed, plus the parent laravel-seo package and its migration. The package's own surface is a Filament fieldgroup; it inherits whatever Filament version you run, which is why version pinning is the central integration decision. Multilingual labels are supported (French, Arabic, Turkish, Spanish, Italian translations shipped), which helps if the admin is used by non-English editors — but note that is UI label translation, not per-locale SEO content.
Migration path. Additive and low-risk. The parent migration creates a separate SEO table keyed polymorphically to your models; no existing columns are altered and no backfill is required to ship the field. Existing records simply have no SEO row until an editor saves one. That makes this a safe "turn it on behind a feature flag, add it to one resource, observe" change rather than a schema-migration event. Front-end rendering of the stored metadata depends on the parent package's Blade helpers — confirm those are wired on the public site before promising editorial value, since an admin field with no rendered output is a false win.
Compatibility. Pin explicitly to the release line that matches your Filament and Laravel majors, and record that mapping in your dependency policy:
Verify at install time rather than assuming; the README examples are stale enough that the changelog, not the README, is the authoritative compatibility record. Lock the version in composer.json with a caret-to-minor constraint and add a note to the upgrade runbook that Filament major bumps require a matching check here.
Sequencing.
laravel-seo decision and publish/configure seo.php (config ownership assigned to a named team).Post) with the HasSEO trait.SEO::make() in that one resource's form; if using standalone Filament Forms, add the saveRelationships() call and test it explicitly.Maintenance. Low ongoing code maintenance, moderate dependency maintenance. You will not be editing this package's source. You will be bumping it whenever Filament or Laravel majors move, and those bumps are the entire changelog. Assign a named owner and treat it as a tracked dependency in the upgrade runbook rather than an install-and-forget library. Because the surface is one fieldgroup, a fork is a realistic contingency — roughly a day of work to internalize and keep building against the parent — which materially reduces the single-maintainer risk.
Support. Upstream support is best-effort from one maintainer who explicitly asks for detailed issues and PRs. Do not plan on SLA-backed support. Internal tier-1 support is trivial (the field either saves or it doesn't); tier-2 is "read the source, check the changelog." Document the pinned version, the Filament mapping, and the saveRelationships() requirement internally so support does not rediscover them. Community translations arrive via PRs and can lag; if the admin is multilingual, verify label coverage on your pinned version.
Scaling. Scales fine along the dimension that matters here — number of models and number of editors — because each is just another fieldgroup on a polymorphic relation. It does not scale along content-operations dimensions: no bulk editing, no cross-record metadata views, no per-locale variants, no import/export. If the SEO workflow grows to hundreds of pages needing batch metadata updates or agency handoff, this package becomes the bottleneck and you will be building a custom resource on top of laravel-seo directly. That is an acceptable, foreseeable evolution — plan for it rather than being surprised by it.
Failure modes.
saveRelationships() is omitted. Highest-probability real-world failure; mitigate with an explicit test.Ramp-up. Very low. A developer familiar with Filament reads the README, translates the stale API names, and is productive within an hour; a developer new to Filament needs the surrounding resource/form concepts first, which is Filament onboarding, not this package. Editor-side ramp-up is near zero — four labeled fields with a character counter on description. The real ramp-up cost is organizational: getting the parent-package decision made, config ownership assigned, and the pinning policy agreed. That is TPM work, and it is where the schedule risk lives.
How can I help you explore Laravel packages today?