digit7s/filament-seo
digit7s/filament-seo brings SEO management into Filament admin panels, letting you add editable meta titles, descriptions, and social sharing tags to your resources so content teams can tune search snippets without touching code. Lightweight and simple to drop into existing resources.
Architecture fit. The package follows conventional Laravel package anatomy: a service provider, publishable config and migrations, an Eloquent model with a polymorphic relation, Filament 5 schema/infolist/table components, and a Blade component for output. That is the correct decomposition for a Filament add-on and it keeps concerns separated — storage (polymorphic SEO table), authoring (Filament fields/tabs), presentation (Blade renderer). The frontend renderer being opt-in and explicitly placed is a deliberate and defensible choice: it avoids the common failure mode of SEO packages that inject tags globally and collide with existing <head> output.
Integration feasibility. Mechanically trivial — three artisan commands and a composer require. The gate is the runtime matrix: PHP 8.4+, Laravel 13, Filament 5. This is bleeding-edge. Any estate on Laravel 11/12 or Filament 3/4 cannot adopt without a framework upgrade, so feasibility is conditional on already being on that stack rather than a general-purpose option. The polymorphic relation means adoption is additive per model — you can attach SEO to one content type without touching others.
Technical risk.
0.1.0 signals no backward-compatibility promise. Expect breaking changes in 0.x minors.Digit7s), no stated support model, no visible CI/test signal in the release notes. Mitigated somewhat by small surface area — a fork is realistic.Key questions.
<title>/og:* produce duplicates?canonical and robots validated (absolute URL, allowlisted directives), or passed through as free text?spatie/laravel-seo or similar, and can both coexist?Stack fit. Adopt only if the target application is already on Laravel 13 / Filament 5 / PHP 8.4. Otherwise this is a blocked-on-upgrade item, not an integration task; treat it as a signal to revisit after the platform upgrade lands. Where the stack does fit, the package is a low-ceremony fit for Filament-administered content models.
Migration path. Greenfield adoption — no data migration required. The only schema change is one additive polymorphic table plus indexes. Rollback is clean: remove the composer dependency, drop the table, delete the published config. Note the migration is published, not loaded from the package, so it becomes our schema and our responsibility to review before running.
Compatibility. Pin to the exact patch (0.1.0) rather than the floating ^0.1 shown in the README, and commit the lockfile. Wrap usage behind our own layout partial and a thin internal presenter/accessor so the rendering layer is swappable — this decouples us from the component's tag output shape and from 0.x churn. Treat the published config and migration as forked artifacts and record the origin version in a comment.
Sequencing.
spatie/laravel-seo plus hand-rolled Filament fields) — the delta may be small enough that owning ~200 lines beats a pre-1.0 dependency.Maintenance. Low ongoing effort but non-zero and forced: the hard version floors (PHP 8.4 / Laravel 13 / Filament 5) mean every future framework major is a potential package-blocking event, and a 0.x package can break on minor bumps. Budget a small recurring line item for dependency tracking, plus a realistic possibility of maintaining a fork. Small codebase makes forking cheap — decide the fork policy now rather than during an incident.
Support. No published SLA; GitHub issues are the only channel. Escalation is effectively "vendor it and patch it ourselves." Confirm there is at least one named maintainer with recent activity before committing, and record that finding.
Scaling. Runtime cost is negligible: one indexed polymorphic lookup per rendered page, plus public-disk URL validation on image fields. Watch for N+1 only in list/index views that render many models per request — eager-load the morph relation. Table growth is one row per model (or per model × locale) and will never be a concern. The Blade component runs in the request path for every page, so keep it out of any hot loop that re-renders heads.
Failure modes.
<title> or og:* outside the component, output will double up and may be ignored or misparsed by crawlers. Enforce the single-emitter policy in code review.Ramp-up. Low for anyone fluent in Filament — the patterns (schema components, infolist section, table column, publishable config) are idiomatic. Estimate half a day for the spike, one to two days to integrate, document, and pilot on a single content type. The real learning is not the API but the two policy decisions it forces: where tags are emitted, and how localized metadata is modeled. Both should be settled before the second content type is onboarded.
How can I help you explore Laravel packages today?