Lightweight, modern SEO toolkit for Laravel, Inertia, Schema.org, sitemaps, robots, OpenGraph, Twitter Cards and optional AI SEO.

Maintainers

Package info

github.com/ProgrammerHasan/seo

pkg:composer/programmerhasan/seo

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 0

v1.0.0 2026-05-15 16:41 UTC

This package is auto-updated.

Last update: 2026-05-15 17:06:23 UTC


README

programmerhasan/seo

Modern AI-Powered SEO Toolkit for Laravel, Inertia.js & Modern Web Apps.

Latest Version Downloads License

Features

  • Meta Tags
  • OpenGraph
  • Twitter/X Cards
  • JSON-LD Schema
  • Multi Schema Builder
  • Canonical & hreflang Links
  • Inertia.js SEO Payloads
  • React/Vue SSR Helpers
  • SSR Support
  • Sitemap Generator
  • Image Sitemap
  • Video Sitemap
  • News Sitemap
  • Robots.txt Generator
  • SEO Audit Command
  • Performance SEO Helpers
  • Auto Model SEO
  • Blade Components
  • Optional AI SEO Drivers
  • Laravel Auto Discovery
  • Livewire Support
  • Filament Support
  • Nova Support
  • Developer Friendly Fluent API

Installation

composer require programmerhasan/seo

Publish config:

php artisan vendor:publish --tag=seo-config

Publish views:

php artisan vendor:publish --tag=seo-views

Quick Usage

use ProgrammerHasan\Seo\Facades\Seo;

Seo::title('Laravel SEO Package')
    ->description('A lightweight SEO toolkit for Laravel.')
    ->canonical(url()->current())
    ->image(asset('images/og.jpg'));

Render SEO tags:

<head>
    {!! Seo::generate() !!}
</head>

Or use the Blade component:

<x-seo />

Fluent Builder API

$html = Seo::make()
    ->title('Best Laravel SEO Toolkit')
    ->description('Modern SEO package for Laravel, Inertia and APIs.')
    ->canonical('https://example.com/packages/seo')
    ->image('https://example.com/images/seo-og.jpg')
    ->article(published: now()->toAtomString())
    ->generate();

Meta Tags

Seo::title('Page title');
Seo::description('Page description');
Seo::keywords(['laravel', 'seo', 'schema']);
Seo::canonical('https://example.com/page');
Seo::author('Programmer Hasan');
Seo::robots('index, follow');

Seo::noIndex();
Seo::noFollow();

OpenGraph

Seo::title('Product page')
    ->description('Product description')
    ->image('https://example.com/product.jpg')
    ->type('product')
    ->og('locale', 'en_US')
    ->og('site_name', 'Example Store');

Twitter/X Cards

Seo::twitter('card', 'summary_large_image')
    ->twitter('site', '@yourhandle')
    ->twitter('creator', '@programmerhasan');

JSON-LD Schema

$schema = Seo::schema();

Seo::make()
    ->title('SEO Toolkit')
    ->schema($schema->product(
        name: 'SEO Toolkit',
        description: 'Laravel SEO package',
        image: 'https://example.com/product.jpg',
        sku: 'SEO-001',
        offers: $schema->offer('49', 'USD')
    ))
    ->generate();

Available Schema Helpers

Seo::schema()->organization('Example', 'https://example.com');
Seo::schema()->website('Example', 'https://example.com');
Seo::schema()->person('Programmer Hasan');
Seo::schema()->article('Title', 'https://example.com/post');
Seo::schema()->blogPosting('Title', 'https://example.com/post');
Seo::schema()->newsArticle('Title', 'https://example.com/news');
Seo::schema()->product('Product name');
Seo::schema()->offer('49', 'USD');
Seo::schema()->aggregateRating(4.8, 120);
Seo::schema()->review('Great product', 'Hasan', 5);
Seo::schema()->faq([['question' => 'Question?', 'answer' => 'Answer.']]);
Seo::schema()->breadcrumb([['name' => 'Home', 'url' => '/']]);
Seo::schema()->event('Laravel Meetup', '2026-05-12');
Seo::schema()->course('Laravel SEO', 'Learn SEO for Laravel');
Seo::schema()->howTo('How to install', ['Install package', 'Publish config']);
Seo::schema()->recipe('Recipe name', ['Ingredient'], ['Step 1']);
Seo::schema()->videoObject('Video title', 'Description', 'thumb.jpg', '2026-05-12');
Seo::schema()->softwareApplication('App name');

Inertia.js SEO

return Inertia::render('Posts/Show', [
    'post' => $post,
    'seo' => Seo::make()
        ->title($post->title)
        ->description($post->excerpt)
        ->canonical(route('posts.show', $post))
        ->forInertia(),
]);

React example:

import { Head } from '@inertiajs/react'

export default function Show({ post, seo }) {
  return (
    <>
      <Head>
        <title>{seo.title}</title>
        <meta name="description" content={seo.description} />
        <link rel="canonical" href={seo.canonical} />
      </Head>

      <h1>{post.title}</h1>
    </>
  )
}

Auto Model SEO

Seo::fromModel($post)->generate();

Supported model fields:

  • seo_title
  • title
  • name
  • seo_description
  • description
  • excerpt
  • seo_image
  • image_url
  • image

Canonical, hreflang & Pagination

Seo::autoCanonical();

Seo::alternate('en', 'https://example.com/en/page');
Seo::alternate('bn', 'https://example.com/bn/page');
Seo::alternate('x-default', 'https://example.com/page');

Seo::pagination($posts);

Sitemaps

This package supports dynamic sitemaps, static sitemap files, image/video/news sitemaps, model-based URLs, and sitemap indexes.

Basic example:

$xml = Seo::sitemap()
    ->add('https://example.com')
    ->add('https://example.com/about')
    ->image('https://example.com/post', [
        'https://example.com/image.jpg'
    ])
    ->video('https://example.com/video', [
        ['title' => 'Demo video']
    ])
    ->news('https://example.com/news', [
        'name' => 'Example News',
        'language' => 'en',
        'title' => 'News title',
    ])
    ->toXml();

Save sitemap:

Seo::sitemap()
    ->add('https://example.com')
    ->save(public_path('sitemap.xml'));

Sitemap index:

Seo::sitemap()
    ->index('https://example.com/sitemap-posts.xml')
    ->index('https://example.com/sitemap-products.xml')
    ->save(public_path('sitemap.xml'));

Generate via command:

php artisan seo:sitemap

👉 Full documentation: docs/sitemap.md

Robots.txt

$content = Seo::robots()
    ->allow('/')
    ->disallow('/admin')
    ->sitemap('https://example.com/sitemap.xml')
    ->toString();

Command:

php artisan seo:robots

Performance SEO

Seo::preload('/fonts/app.woff2', as: 'font', type: 'font/woff2', crossorigin: true);

Seo::preconnect('https://fonts.googleapis.com');

Seo::dnsPrefetch('https://cdn.example.com');

Optional AI SEO

Seo::ai()->generate($content);

Seo::ai()->improve($content);

Seo::ai()->analyze($content, 'laravel seo');

OpenAI

SEO_AI_DRIVER=openai
SEO_OPENAI_API_KEY=your-api-key
SEO_OPENAI_MODEL=gpt-4o-mini

Gemini

SEO_AI_DRIVER=gemini
SEO_GEMINI_API_KEY=your-api-key
SEO_GEMINI_MODEL=gemini-1.5-flash

Ollama

SEO_AI_DRIVER=ollama
SEO_OLLAMA_URL=http://localhost:11434
SEO_OLLAMA_MODEL=llama3

Commands

php artisan seo:install
php artisan seo:sitemap
php artisan seo:robots
php artisan seo:audit

Testing

composer install
composer test
composer format:test
composer analyse

Run all quality checks:

composer ci

Version Support

Package Supported
PHP 8.2, 8.3, 8.4
Laravel 10, 11, 12

Documentation

Full docs are available in the docs/ directory.

Security

Please see SECURITY.md.

Contributing

Please see CONTRIBUTING.md.

License

MIT License.

Author

Programmer Hasan