diff --git a/src/components/marketing/product-video.tsx b/src/components/marketing/product-video.tsx
new file mode 100644
index 0000000..895c8ea
--- /dev/null
+++ b/src/components/marketing/product-video.tsx
@@ -0,0 +1,53 @@
+import storyboard from "../../../scripts/product-video/storyboard.json";
+
+export function ProductVideo() {
+ return (
+
+
+
+
In Ruhe kennenlernen
+
Kita-Planer in zwei Minuten.
+
+
+ Ein Rundgang durch die sechs Bereiche mit echten App-Ansichten und Beispieldaten.
+ Deutsche Untertitel und markierte Hinweise erklären die Abläufe – ohne Ton und ohne Gesprächstermin.
+
+
+
+
+
2:00 Min. · Ohne Ton · Deutsche Untertitel
+
+
+
+ Videoinhalt als Text lesen
+
+ {storyboard.chapters.map((chapter, index) => (
+
+
{chapter.title}
+
+ {storyboard.scenes.filter((scene) => scene.chapter === index).map((scene) =>
{scene.subtitle.join(" ")}
)}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/lib/marketing/seo.ts b/src/lib/marketing/seo.ts
index 3078385..4c2bb37 100644
--- a/src/lib/marketing/seo.ts
+++ b/src/lib/marketing/seo.ts
@@ -1,7 +1,7 @@
import type { Metadata } from "next";
// Update when the public product copy changes, never on each request or build.
-export const marketingLastModified = "2026-10-13";
+export const marketingLastModified = "2026-10-14";
export const marketingTitle =
"Kita-Planer für Elterninitiativen und Kita-Vereine";
export const marketingDescription =
diff --git a/tests/marketing-seo-http.cjs b/tests/marketing-seo-http.cjs
index a7910e0..d288b4b 100644
--- a/tests/marketing-seo-http.cjs
+++ b/tests/marketing-seo-http.cjs
@@ -38,7 +38,7 @@ test('Social-Crawler erhält Canonical und Vorschaudaten direkt im HTML-Head', a
test('Ausgelieferte Sitemap enthält ausschließlich erreichbare kanonische öffentliche Seiten', async () => {
const response = await request('/sitemap.xml'); assert.equal(response.status, 200); const xml = await response.text();
const urls = [...xml.matchAll(/
(.*?)<\/loc>/g)].map(match => new URL(match[1]).href).sort(); assert.deepEqual(urls, paths.map(path => new URL(path, site).href).sort());
- assert.ok(xml.includes('2026-10-13')); assert.ok(!xml.includes('T00:'));
+ assert.ok(xml.includes('2026-10-14')); assert.ok(!xml.includes('T00:'));
});
test('Robots verwenden dieselbe Domain und halten Loginformulare zum Lesen von noindex offen', async () => {
const response = await request('/robots.txt'); assert.equal(response.status, 200); const text = await response.text();