withcandour/aardvark-seo
Aardvark SEO is a Laravel package for managing SEO metadata in your applications. It helps generate meta tags, Open Graph and Twitter card markup, and structured data, making it easier to control how pages appear in search results and social shares.
composer require withcandour/aardvark-seo
php artisan vendor:publish for the exact tags the addon registers):
php artisan vendor:publish --provider="WithCandour\AardvarkSeo\ServiceProvider"
config/aardvark-seo.php first. This is where site-wide defaults live: site name, default title/description, social handles, sitemap toggle, and whether SEO fields are injected globally or per-blueprint. Get this file right before touching templates.seo fieldset to the blueprints you care about — usually resources/blueprints/collections/pages/page.yaml and your blog collection. Add it under a dedicated SEO tab so editors don't have to hunt for it.<head>. The addon exposes an Antlers tag (commonly {{ seo }} or a similarly-prefixed tag — confirm by listing vendor/withcandour/aardvark-seo/src/Tags). Put it in resources/views/layouts/base.antlers.html immediately after <meta charset>.Where to look when something is off, in order: config/aardvark-seo.php → vendor/withcandour/aardvark-seo/src/Tags (what the tag actually emits) → resources/views in the vendor directory (what partial is being rendered) → the service provider (routes, sitemap, event listeners).
resources/views/partials/seo.antlers.html that contains only the addon tag plus any layout-local overrides, and include it from every layout. Never scatter SEO markup across templates.{{ seo_title or title }} style logic, otherwise half your entries ship with empty <title> tags.Article, products to Product, the homepage to Organization/WebSite. If the addon's schema selection is config-driven, encode the mapping there; if it's field-driven, expose a select field in the blueprint and default it by collection via the field's default value.robots.txt, and submit it in Search Console on every environment you care about. Exclude noindex entries — most SEO addons do this automatically, but verify by curling /sitemap.xml after adding a noindexed entry.hreflang. Verify localized entries point at their own URLs, not the origin site's.curl -s https://staging/sitemap.xml | grep -c '<url>' plus a grep for empty <title></title> catches the majority of regressions.null for every new field. Write template fallbacks, or run a one-off command to populate defaults before launch.<title> or <meta name="description">, you'll render two of each. Delete the hardcoded ones the moment you add the tag.php artisan config:clear locally after editing aardvark-seo.php; remember config:cache in production. A "my config change did nothing" bug is almost always this./sitemap.xml routes conflict silently — the last registered route wins. Run php artisan route:list | grep sitemap if the output looks wrong.noindex on non-production environments. The cleanest approach is an env check in the config file that globally forces noindex everywhere except production. Otherwise staging sites end up in Google's index.{{ ... | raw }} (or the addon's equivalent) or Google's validator will reject it.seo, seo_title, etc., the blueprint import will clash. Rename your existing field before adding the fieldset.php artisan cache:clear and, on older setups, stache:clear) before the CP reflects them.NOASSERTION, has a small star count, and the linked repo appears to be a fork. Confirm the canonical upstream (withcandour/aardvark-seo), read the LICENSE file in vendor/, and pin an exact version in composer.json. Treat the source as readable and forkable — you will likely need to patch it eventually.{{ seo }} renders nothing: the fieldset isn't on the blueprint, the entry was saved before the field existed, the layout isn't using the right layout file, or the tag name is wrong. Check those four in that order before filing anything upstream.vendor/. For anything more dynamic (e.g., SEO for a custom route), bind data into the view or use Statamic's Antlers view data rather than modifying the addon.How can I help you explore Laravel packages today?