amjadiqbal/filament-rankforge-lite
Lightweight Filament plugin that adds RankForge-style drag-and-drop ordering to your resources. Attach the trait and rows become instantly sortable in the admin panel, with minimal setup and no bloat—ideal for menus, categories, and any ranked list.
Architecture fit
v1.0.0 is a content-SEO package that couples three layers into one deliverable: a persistence layer (HasSeo trait → polymorphic rankforge_meta row per record), an admin layer (Filament SeoFields form section, live analysis panel, SeoScoreColumn), and a delivery layer (<x-rankforge::tags> Blade component and @rankforge directive). For a Laravel monolith already on Filament, this is a strong fit — one install covers authoring, review and rendering, with no separate SEO service to operate.
The fit is weaker if our admin surface is not Filament. The release notes describe the form section, analysis panel and table column as first-class features without stating that the persistence and rendering layers stand alone. Before committing, we need explicit confirmation that HasSeo + the tags component work headless (no Filament installed or enabled), because that determines whether this is a platform-wide standard or a single-panel convenience. The Blade component and directive are a good sign for server-rendered front ends; Inertia/React or API-driven front ends would consume the underlying meta model directly and lose the preview/analysis UI entirely.
Integration feasibility
Low-to-moderate effort for a Filament-based app: install, publish config and migration, add the trait to content models, drop the section into existing resources, add the column to index tables, and place the tags component in the layout head. Two notes materially reduce risk:
ralphjsmit/laravel-seo on the same model without trait boot-method collision means we can adopt incrementally rather than big-bang, and can run both during a transition window.The main feasibility gap is i18n storage. The package advertises hreflang output and 22 checks across 6 languages, but the persistence model is described as one row per record. If meta title/description are single columns, a multi-locale site either needs per-locale model instances or a strategy the release notes don't describe. Any site with more than one public language must resolve this before rollout.
Technical risk
saveQuietly(), bulk update(), insert(), imports, seeders and direct DB writes bypass model events; the score silently goes stale. Bulk editorial imports are the common real-world case.laravel-seo produces two meta stores; which one renders must be an explicit, documented decision per template, or we ship duplicate/conflicting tags.noindex inherited, or a canonical pointing at a preview domain) is a business-visible outage, not a bug.Key questions
HasSeo and <x-rankforge::tags> function without Filament installed?laravel-seo fields win when both are installed on the same model?Stack fit
Assume Laravel 10/11, PHP 8.2+, Filament admin, Blade-rendered public site. Add to a single low-traffic content model first, on a non-critical section (e.g. blog, not the money pages). Confirm headless behaviour on that pilot before widening scope. If the public site is not Blade, treat the package as an authoring tool only and build a thin renderer against the meta model — do not assume the component covers us.
Migration path
Path depends on current state:
<head> output before and after on a sample of pages.ralphjsmit/laravel-seo: run both. Add HasSeo to one model, render RankForge tags for that template, verify laravel-seo output is suppressed for the same template, then migrate template by template. Retire laravel-seo once parity is confirmed — leaving both live indefinitely is the worst outcome.Compatibility
Verify in this order: Filament version, PHP version, Laravel version, and coexistence with whatever else hooks saved/created/updated on content models (audit logs, search indexers, revision packages). Multiple listeners on the same events are fine functionally but compound save latency.
Sequencing
Maintenance
Two maintenance surfaces: the package itself (upgrade cadence, changelog discipline at v1.x) and our own configuration — the 22 checks in 6 languages are content that may be tuned or overridden, and overrides become our code to maintain. Budget a recurring review per minor version to catch score drift. If we override check weights or locale strings, document them centrally or they will silently diverge from upstream defaults.
Support
Primary support load is editorial, not technical: "why did my score drop", "why is this green but ranking badly", "why is the preview wrong". Publish an internal one-pager framing the score as a hygiene checklist, not a ranking predictor, before rollout. Secondary load is template-level tag questions from the front-end team. Third-party vendor support is unknown at v1.0.0 — assume self-support and plan accordingly.
Scaling
updated_at; otherwise every page view costs a query. Confirm the package doesn't already do this.SeoScoreColumn is sortable, which on large tables means a sort on a polymorphic-scoped column — needs a composite index or it will table-scan. Verify the published migration includes it.Failure modes
| Failure | Impact | Mitigation |
|---|---|---|
| Analysis throws on save | Editorial save blocked or 500 | Confirm failure isolation; add monitoring on save-path errors |
| Analysis is API-backed and the provider is down | Publishing degraded | Queue + fallback to last-known score; circuit breaker |
| Score not recalculated on bulk/quiet saves | Stale scores, misleading dashboards | Nightly reconciliation job over recently-modified records |
| Both SEO packages render tags | Duplicate/conflicting meta, confused crawlers | Explicit per-template ownership; automated head-output test |
| Robots or canonical misconfigured | Deindexing or canonical dilution — revenue-visible | Defaults locked in config review; assertion test on noindex and paginated pages |
| Locale coverage incomplete | hreflang gaps on multi-language site | Resolve storage model in week 1; audit hreflang output per locale |
| Package abandoned / breaking minor | Forced fork or migration | Wrap trait and component behind our own thin abstraction where cheap; keep exit path documented |
Ramp-up
Editors: roughly 30 minutes. The live panel, SERP preview and social card previews are self-explanatory, which is the package's strongest adoption lever. The required training is not mechanical but policy: what score is "good enough" for our site, and that the score is advisory. Developers: half a day for the trait/component wiring, plus the head-output test harness, which is the real work. Front-end: 1–2 hours to validate tag output against our existing templates and analytics/tag-manager assumptions. Expect the first two weeks of pilot to generate most of the questions; capture them into the internal one-pager rather than answering individually.
How can I help you explore Laravel packages today?