Search by

nowo-tech / seo-kit-bundle

HecFranco

Symfony SEO kit: multilingual static routes, slug SEO layers (defaults / pages / slug patterns / specific slugs), head tags, hreflang, sitemap and robots for FrankenPHP, php-fpm and Nginx.

Package info

github.com/nowo-tech/SeoKitBundle

Documentation

Type:symfony-bundle

pkg:composer/nowo-tech/seo-kit-bundle

Statistics

Installs: 375

Dependents: 2

Suggesters: 2

Stars: 0

Open Issues: 0

v1.15.0 2026-10-19 09:08 UTC

README

CI Packagist Version Packagist Downloads License PHP Symfony GitHub stars Coverage

⭐ Found this useful? Give it a star on GitHub! It helps us maintain and improve the project.

Symfony SEO kit: multilingual static routes, slug SEO layers (defaults / pages / slug patterns / specific slugs), head tags, hreflang, sitemap and robots for FrankenPHP, php-fpm and Nginx.

FrankenPHP Friendly Worker Mode

This bundle is FrankenPHP worker mode friendly.

Table of contents

Features

  • ✅ Hierarchical SEO config — defaults → slug_routes → pages → slugs → attribute → runtime
  • ✅ Twig head helper — {{ nowo_seo_head() }} with Open Graph, Twitter, JSON-LD, canonical, hreflang
  • ✅ Multilingual paths — locale-specific paths and translated slugs
  • ✅ Sitemap & robots — /sitemap.xml and /robots.txt served by Symfony; extra User-agent groups via robots.groups or GeoRobotsGroupsProviderInterface (GEO crawler policy: GenerativeSeoKitBundle)
  • ✅ Typed JSON-LD — Organization, LocalBusiness, Person, FAQPage, BlogPosting and related nodes
  • ✅ Runtime overrides — SeoRuntime for dynamic titles from controllers
  • ✅ Host providers — defaults, indexability, sitemap URLs, and extra robots groups
  • ✅ Optional Doctrine site settings — persistence.enabled + SeoSiteConfig snapshot
  • ✅ Audit CLI — nowo:seo:audit with tagged subject providers
  • ✅ Optional SEO admin + pencil API — site settings, surface overrides, FormKit forms, OriginUrlGuard
  • ✅ Surface helpers — SeoSurfaceKeys + SeoSurfaceManager for CMS/blog pencils
  • ✅ AbsoluteUrlBuilder — origin + path normalisation from base_url
  • ✅ PHP 8 attribute — #[Seo] on controllers
  • ✅ FrankenPHP-ready demo — single-container Symfony 8 demo

FrankenPHP: Demos use a single PHP service (FrankenPHP, no nginx). With APP_ENV=dev (default), the Docker entrypoint swaps in Caddyfile.dev — php_server without workers for comfortable local development. The baked-in production Caddyfile can use php_server { worker … }; see docs/DEMO-FRANKENPHP.md. Access the demo at http://localhost:PORT (see demo/README.md and .env.example).

Installation

composer require nowo-tech/seo-kit-bundle

Register the bundle in config/bundles.php (Flex does this automatically):

Nowo\SeoKitBundle\SeoKitBundle::class => ['all' => true],

Add to your base layout:

{{ nowo_seo_head() }}

Requirements

  • PHP >= 8.2, < 8.6
  • Symfony 7.4+ or 8.x
  • nowo-tech/form-kit-bundle ^2.4 (hard dependency)

GEO (Generative Engine Optimization — not geolocation) is a companion package: nowo-tech/generative-seo-kit-bundle (llms.txt, AI crawler robots groups via this bundle’s SPI, citation index, nowo:generative-seo:audit). This kit stays classical SEO (head, sitemap, canonical, hreflang).

Version information

Version PHP Symfony Status
1.12.x >= 8.2 7.4 – 8.1+ Stable
1.11.x >= 8.2 7.4 – 8.1+ Stable
1.10.x >= 8.2 7.4 – 8.1+ Stable
1.9.x >= 8.2 7.4 – 8.1+ Stable
1.8.x >= 8.2 7.0 – 8.1+ Stable
1.7.x >= 8.2 7.0 – 8.1+ Stable
1.6.x >= 8.2 7.0 – 8.1+ Stable
1.5.x >= 8.2 7.0 – 8.1+ Stable
1.4.x >= 8.2 7.0 – 8.1+ Stable
1.3.x >= 8.2 7.0 – 8.1+ Stable
1.2.x >= 8.2 7.0 – 8.1+ Stable
1.1.x >= 8.2 7.0 – 8.1+ Stable
1.0.x >= 8.2 7.0 – 8.1+ Stable

Demos

make -C demo up-symfony8   # http://localhost:8050 (default PORT)

Demo extras: locale switch, / default-locale home, SEO Admin at /admin/seo. See docs/DEMO-FRANKENPHP.md.

Documentation

Additional documentation

Tests and coverage

make test
make test-coverage
  • Tests: PHPUnit (unit)
  • PHP: 100% lines (make test-coverage)

License

MIT — see LICENSE.