SEO
CommunityThis package is a convenient helper for using the laravel-seo package with Filament Admin and Forms.
Author:
Ralph J. Smit
Package health
BetaAutomated checks of this plugin's Composer package
13 checks
-
Passed:
Current Laravel version supported
—
Package dependencies resolve together with current Laravel
13.0. -
Passed:
Current PHP version supported
—
Constraint
^8.0supports current PHP8.5. - Skipped: Current Symfony version supported
- Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
- Passed: Commit and release recency — Active: last commit 132 days ago; last release 132 days ago.
-
Passed:
composer.lock not committed by library
—
composer.lockis absent from the released dist archive. - Passed: Dist archive is lean
- Failed: GitHub Actions pinned to SHA — View details on Plumb
- Passed: Open security advisories
- Passed: Dependabot PR responsiveness — No open Dependabot PRs.
- Passed: Dependabot or Renovate configured
-
Failed:
Dependency update cooldown configured
—
No cooldown configured in
.github/dependabot.yml. View details on Plumb - Passed: Provides a security policy
filament/
namespace. Review the source and install at your own risk. Found
malware or an unresolved security issue the author won't
address?
Report it
.
Documentation

This package is a convenient helper for using the laravel-seo package with Filament Admin and Forms.
It provides a simple component that returns a Filament fieldgroup to modify the title, author and description fields of the SEO model. It automatically takes care of getting and saving all the data to the seo() relationship, and you can thus use it anywhere, without additional configuration!
use Filament\Resources\Form;
use RalphJSmit\Filament\SEO\SEO;
public static function form(Form $form): Form
{
return $form->schema([
SEO::make(),
// .. Your other fields
]);
}
Here's an example of how the SEO component looks like:

#Installation
First, install the packages:
composer require ralphjsmit/laravel-filament-seo
This will the require the ralphjsmit/laravel-seo as well if you didn't have that installed. Be sure to check out the documentation of the main package and configure the values in the special seo.php config file!
Next, make sure that the Eloquent Model you're editing uses the HasSEO trait:
class Post extends Model
{
use HasSEO;
}
Now the SEO::make() helper is available to use anywhere you want. Below are several examples how to use it:
#In Filament Admin
This is an example of using this package in the classic Filament Admin.
It works for both creating and editing posts:
<?php
namespace App\Filament\Resources;
use App\Filament\Resources;
use App\Models\Post;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Form;
use Filament\Resources\Resource;
use Filament\Resources\Table;
use RalphJSmit\Filament\SEO\SEO;
class PostResource extends Resource
{
protected static ?string $model = Post::class;
protected static ?string $slug = 'posts';
protected static ?string $recordTitleAttribute = 'title';
protected static ?string $navigationGroup = 'Blog';
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static ?int $navigationSort = 0;
public static function form(Form $form): Form
{
return $form->schema([
TextInput::make('title'),
SEO::make(),
]);
}
public static function table(Table $table): Table
{
return $table->columns([ /* */ ]);
}
public static function getPages(): array
{
return [
'index' => Resources\PostResource\Pages\ListPosts::route('/'),
'create' => Resources\PostResource\Pages\CreatePost::route('/create'),
'edit' => Resources\PostResource\Pages\EditPost::route('{record}/edit'),
];
}
}
#With Filament Forms
You can also use this package with the stand-alone Filament Forms package.
This is a simple example of how to setup a Livewire component that creates a new post. In this example, I wrapped the SEO component in a Card.
<?php
namespace App\Http\Livewire;
use App\Models\Post;
use Filament\Forms\Components\Card;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Illuminate\Contracts\View\View;
use Illuminate\Database\Eloquent\Model;
use Livewire\Component;
use RalphJSmit\Filament\SEO\SEO;
class CreatePost extends Component implements HasForms
{
use InteractsWithForms;
public array $data = [];
public function mount(): void
{
$this->form->fill();
}
public function render(): View
{
return view('livewire.create-post');
}
protected function getFormSchema(): array
{
return [
TextInput::make('title'),
Card::make([
SEO::make()
]),
];
}
protected function getFormStatePath(): ?string
{
return 'data';
}
protected function getFormModel(): Model|string|null
{
return Post::class;
}
public function submitForm()
{
$post = Post::create($this->form->getState());
/** Do not forget this step. */
$this->form->model($post)->saveRelationships();
}
}
And here's an example of how a Livewire component for editing a post might like like:
<?php
namespace App\Http\Livewire;
use App\Models\Post;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Illuminate\Contracts\View\View;
use Illuminate\Database\Eloquent\Model;
use Livewire\Component;
use RalphJSmit\Filament\SEO\SEO;
use RalphJSmit\Filament\SEO\Tests\Fixtures\Models\Post;
class EditPost extends Component implements HasForms
{
use InteractsWithForms;
public Post $post;
public function mount(): void
{
$this->form->fill([
'title' => $this->post->title,
]);
}
public function render(): View
{
return view('livewire.edit-post');
}
protected function getFormSchema(): array
{
return [
TextInput::make('title'),
SEO::make(),
];
}
protected function getFormModel(): Model|string|null
{
return $this->post;
}
public function submitForm()
{
$this->post->update(
$this->form->getState(),
);
}
}
#General
🐞 If you spot a bug, please submit a detailed issue and I'll try to fix it as soon as possible.
🔐 If you discover a vulnerability, please review our security policy.
🙌 If you want to contribute, please submit a pull request. All PRs will be fully credited. If you're unsure whether I'd accept your idea, feel free to contact me!
🙋♂️ Ralph J. Smit
The author
From the same author
Components
A collection of handy components that can be used in almost any project, like sidebars, timestamps & more.
Author:
Ralph J. Smit
Notifications Pro
Seamlessly integrate Laravel database notifications with Filament.
Author:
Ralph J. Smit
Onboarding Manager Pro
Beautiful onboarding experiences for Filament Admin.
Author:
Ralph J. Smit
Upload Pro
A beautiful, advanced & high-performance upload experience for Filament.
Author:
Ralph J. Smit
Featured Plugins
A selection of plugins curated by the Filament team
Blueprint
Filament Blueprint is a premium Laravel Boost extension that helps AI agents produce accurate, detailed implementation plans and security reports for Filament apps.
Filament
Custom Fields
Eliminate custom field migrations forever. Let your users create and manage form fields directly in Filament admin panels with 20+ built-in field types, validation, and zero database changes.
Relaticle
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese