studio1902/statamic-peak-seo
An SEO addon for Statamic, built for the Peak starter kit. It helps you manage meta tags, Open Graph data, sitemaps, and other search-engine essentials so your content is easier to discover, index, and share.
This package is not a self-contained SEO addon in the way statamic/seo-pro is. It is a fieldset + partial bundle extracted from the Peak starter kit: YAML field definitions you attach to your blueprints, and Antlers partials that render the resulting meta tags. Treat it as a reference implementation you adopt, not a black box you configure.
Minimal path in:
composer require studio1902/statamic-peak-seoresources/fieldsets/ first — that is the actual contract. You will find fields for title, meta description, canonical/redirect behaviour, Open Graph image, and JSON-LD/schema toggles.<head> in your layout. If the views are not auto-registered, publish or copy them into resources/views/ in your site — see Gotchas.First use case to validate end-to-end: a single Page entry. Fill the SEO tab, view source, confirm <title>, <meta name="description">, canonical, and OG tags appear. If they do not, the fieldset handle and the partial's variable expectations are misaligned — that mismatch is the single most common failure with this package.
Compose, don't duplicate. The intended workflow is to include the SEO fieldset in every blueprint that renders a public page, then let a single shared partial in your layout handle output. One partial, many collections. Duplicating render logic per template is the anti-pattern this package exists to prevent.
Site-wide fallbacks. Peak-style setups typically resolve SEO values in a cascade: entry field → parent page → global/site defaults (set in a Globals set or config/statamic/ site config). Wire your Antlers with fallback chains (seo_title ?? title ?? site:name). The package supplies fields, not cascade logic — you own that resolution order, so write it down before you have five collections behaving differently.
Override-by-copy is the extension point. Because these are plain partials, the sustainable pattern is to copy the shipped partial into your own resources/views/partials/ and edit there. Never edit inside vendor/ — composer update will silently revert you. If the package supports view publishing (php artisan vendor:publish), prefer that; otherwise document the copy in your README so the next developer knows.
Pair with sitemap and robots. This package handles per-page meta, not the XML sitemap or robots.txt. Expect to enable Statamic's sitemap separately. The redirect/canonical fields here only take effect if your routing layer actually honours them — a canonical field that nothing reads is a trap.
Blueprint-first change management. Since SEO fields live in YAML, changes are diffable and reviewable. Commit blueprint changes alongside template changes so a field rename and the partial consuming it land in the same PR. This is the main day-to-day discipline the package rewards.
Structured data. JSON-LD in these bundles is usually a per-entry toggle plus a type selector. Model it as a small enum of supported types rather than a free-text field, or you will get invalid schema in production with no validation anywhere in the pipeline.
statamic/seo-pro behaviour, you will be disappointed. Score the adoption decision accordingly.vendor/studio1902/statamic-peak-seo/src/ServiceProvider.php, register the namespace manually if needed, or copy views into your app.<head> contains a title and description on a fixture entry — that catches silent breakage on every upgrade.</head> and not swallowed by a caching layer? Antlers {{ if }} around meta output is the classic cause of "tags randomly missing" — dump the raw field values with {{ dump }} in dev before blaming the package.<meta property="og:image" content="">. Guard every tag with a conditional and treat empty-string as absent.site:has:… vs bare variable resolution. Cross-site leakage in canonical URLs is easy to introduce and hard to spot until Search Console complains.How can I help you explore Laravel packages today?