diff --git a/resources/views/web/layouts/web-master.blade.php b/resources/views/web/layouts/web-master.blade.php
index fbbc913..93963e7 100644
--- a/resources/views/web/layouts/web-master.blade.php
+++ b/resources/views/web/layouts/web-master.blade.php
@@ -5,9 +5,38 @@
-
-
@yield('title', $domainName ?? config('app.name', 'Laravel'))
+ @php
+ $siteName = $domainName ?? config('app.name', 'Laravel');
+ $pageTitle = trim($__env->yieldContent('title')) ?: $siteName;
+ $pageDescription = trim($__env->yieldContent('meta_description')) ?: $siteName;
+ // Self-Canonical als Default aus der Portal-URL + Request-Pfad (ohne Query):
+ // pro Portal/Domain getrennt und unabhängig von URL::forceRootUrl – verhindert Cross-Portal-Duplicate.
+ $portalBase = rtrim($domainUrl ?? config('app.url'), '/');
+ $canonicalUrl = trim($__env->yieldContent('canonical')) ?: ($portalBase.request()->getPathInfo());
+ $ogType = trim($__env->yieldContent('og_type')) ?: 'website';
+ $ogImage = trim($__env->yieldContent('og_image'));
+ @endphp
+
+
+
+ {{ $pageTitle }}
+
+ {{-- Kanonische URL --}}
+
+
+ {{-- OpenGraph / Social --}}
+
+
+
+
+
+ @if ($ogImage)
+
+ @endif
+
+
+
diff --git a/resources/views/web/release-detail.blade.php b/resources/views/web/release-detail.blade.php
index b10a6d1..672ea4b 100644
--- a/resources/views/web/release-detail.blade.php
+++ b/resources/views/web/release-detail.blade.php
@@ -1,6 +1,9 @@
@extends('web.layouts.web-master')
@section('title', 'KI-Revolution in Deutschland - Business Portal 24')
+@section('meta_description', 'Neue Studie zeigt massive Investitionen deutscher Unternehmen in künstliche Intelligenz für 2025.')
+@section('og_type', 'article')
+@section('canonical', route('release.detail', ['slug' => $releaseSlug]))
@section('content')
diff --git a/tests/Feature/Web/CanonicalMetaTest.php b/tests/Feature/Web/CanonicalMetaTest.php
new file mode 100644
index 0000000..0c15e49
--- /dev/null
+++ b/tests/Feature/Web/CanonicalMetaTest.php
@@ -0,0 +1,29 @@
+get('https://businessportal24.test/release/ki-revolution')
+ ->assertSuccessful()
+ ->assertSee('', false)
+ ->assertSee('