Laravel Head is a new first-party package from the Laravel open-source team, introduced by Taylor Otwell during his day-one keynote at Laracon US 2026. It provides a fluent API for everything in a document's <head>: titles, meta descriptions, canonical URLs, Open Graph tags, robots directives, JSON-LD structured data, and resource hints, resolved per request for Blade, Livewire, and Inertia applications.

Metadata resolves through five layers, from lowest to highest priority: page defaults, route group metadata, route metadata, runtime metadata, and error metadata. Higher layers replace lower ones field by field, so a runtime title overrides a route title without touching its description. Site-wide defaults are registered in a service provider via Head::defaults(); a title suffix registered there carries into higher layers, so Head::title('About') renders "About - Laravel", unless exact: true is passed. Calling canonical() without arguments uses the current request URL normalized to https (disable with forceHttps: false). Robots directives accept raw strings, RobotsRule enum cases, or mixed lists, with searchableByRobots() and hiddenFromRobots() shorthands.

For metadata known ahead of time, withHead() attaches it directly to route definitions, groups, resources, and singletons — e.g. Route::view('/contact', 'contact')->withHead(title: 'Contact Us', description: 'Get in touch.'). Under the hood it writes plain arrays through Laravel's native route metadata API, so route caching keeps working. Named arguments are limited to built-in properties so static analysis catches typos; custom builder data goes through an extensions array. Runtime metadata is set through the facade inside controllers, including conditionals like Head::when($post->isDraft(), fn ($head) => $head->hiddenFromRobots()). Single-value fields take the last call; repeatable fields like ogImage() merge by key.

Document title and description automatically fill missing og:title and og:description. Registering a Twitter card type in defaults derives X card tags from the same values, with twitter() and twitterImage() available for page-specific social copy. Structured data uses a separate Schema facade with nestable builders for article, blogPosting, product, offer, brand, breadcrumbs, faq, organization, person, webPage, and webSite. Breadcrumbs and FAQs accept bulk arrays; unknown factory methods produce a generic schema, and custom typed classes can be registered with a #[SchemaType] attribute. Invalid JSON-LD throws in non-production and logs a warning in production.

For rendering, Blade and Livewire use a @head directive in the layout, rendered synchronously, so metadata must be defined before the layout renders. Livewire needs no extra configuration since the resolver is request-scoped. Inertia gets the deepest integration: the package shares the resolved head as an array of rendered element strings under a head prop, and enabling Inertia's serverHead option (Inertia 3.5+) lets Inertia adopt each element via a stable data-inertia key and keep it synchronized across visits and back/forward navigation. Because @head puts tags in the initial HTML, crawlers and link-preview bots read them without JavaScript, and no client-side <Head> component is needed. Session-static tags can be registered with Head::inertiaGlobals(). Existing Inertia apps should remove title callbacks and migrate <Head> component content.

Laravel Head requires PHP 8.3 and Laravel 13.17 or later, installed via composer require laravel/head. Applications wanting metadata as data rather than markup can call Head::toArray(). Documentation is at laravel.com/docs/13.x/head, source at github.com/laravel/head.