diff --git a/scripts/sync-brand.js b/scripts/sync-brand.js
index aa145e4..457a469 100644
--- a/scripts/sync-brand.js
+++ b/scripts/sync-brand.js
@@ -20,6 +20,7 @@ const logos = [
"wavekat-tight-light.svg",
"wavekat-tight-dark.svg",
"wavekat-icon-light.svg",
+ "wavekat-icon-dark.svg",
];
// Initialise submodule if vendor directory is empty (Cloudflare Pages shallow clone)
diff --git a/src/components/VoiceDownload.astro b/src/components/VoiceDownload.astro
index deb8b06..777e8c5 100644
--- a/src/components/VoiceDownload.astro
+++ b/src/components/VoiceDownload.astro
@@ -114,3 +114,22 @@ const primaryCls =
document.addEventListener('DOMContentLoaded', resolve);
})();
+
+
diff --git a/src/layouts/Base.astro b/src/layouts/Base.astro
index 31bc88b..c44fc42 100644
--- a/src/layouts/Base.astro
+++ b/src/layouts/Base.astro
@@ -6,16 +6,58 @@ interface Props {
title?: string;
description?: string;
ogImage?: string;
+ ogImageAlt?: string;
+ ogType?: 'website' | 'article';
+ noindex?: boolean;
+ article?: {
+ publishedTime?: Date;
+ modifiedTime?: Date;
+ author?: string;
+ tags?: string[];
+ };
}
const {
title = 'WaveKat — Open-Source AI Voice Tools for Small Business',
description = 'WaveKat builds open-source, AI-powered tools that give small businesses enterprise-grade voice capabilities — phone answering, conversations, and 24/7 presence.',
ogImage = '/og.png',
+ ogImageAlt = 'WaveKat — open-source AI voice tools for small business',
+ ogType = 'website',
+ noindex = false,
+ article,
} = Astro.props;
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
const ogImageURL = new URL(ogImage, Astro.site);
+
+// Sitewide Organization + WebSite structured data. Emitted on every page so
+// search engines can build a consistent entity for WaveKat (logo, social
+// profiles) and surface the site name in results.
+const orgSchema = {
+ '@context': 'https://schema.org',
+ '@graph': [
+ {
+ '@type': 'Organization',
+ '@id': 'https://wavekat.com/#organization',
+ name: 'WaveKat',
+ url: 'https://wavekat.com',
+ logo: 'https://wavekat.com/og.png',
+ description:
+ 'WaveKat builds open-source, AI-powered voice tools that give small businesses enterprise-grade phone capabilities.',
+ sameAs: [
+ 'https://github.com/wavekat',
+ 'https://www.linkedin.com/company/wavekat/',
+ ],
+ },
+ {
+ '@type': 'WebSite',
+ '@id': 'https://wavekat.com/#website',
+ name: 'WaveKat',
+ url: 'https://wavekat.com',
+ publisher: { '@id': 'https://wavekat.com/#organization' },
+ },
+ ],
+};
---
@@ -24,6 +66,9 @@ const ogImageURL = new URL(ogImage, Astro.site);
+
+
+
@@ -32,19 +77,34 @@ const ogImageURL = new URL(ogImage, Astro.site);
-
+
+
+
+
+ {article?.publishedTime && (
+
+ )}
+ {article?.modifiedTime && (
+
+ )}
+ {article?.author && }
+ {article?.tags?.map((tag) => )}
+
+
+
+
diff --git a/src/layouts/Post.astro b/src/layouts/Post.astro
index 8fa883b..435e625 100644
--- a/src/layouts/Post.astro
+++ b/src/layouts/Post.astro
@@ -17,9 +17,18 @@ const { title, description, date, updated, author, tags = [], ogImage } = Astro.
const formatDate = (d: Date) =>
d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
+
+const canonicalURL = new URL(Astro.url.pathname, Astro.site);
---
-