diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
index 4b18c25..c13848c 100644
--- a/src/layouts/BaseLayout.astro
+++ b/src/layouts/BaseLayout.astro
@@ -5,7 +5,7 @@ import Footer from '../components/Footer.astro';
import GridOverlay from '../components/GridOverlay.astro';
import Navigation from '../components/Navigation.astro';
import CustomCursor from '../components/CustomCursor';
-import { HTML_MARKER, SITE_TITLE, SITE_DESCRIPTION } from '../consts';
+import { HTML_MARKER, SITE_TITLE, SITE_DESCRIPTION, SOCIAL_LINKS } from '../consts';
interface Props {
title?: string;
@@ -17,15 +17,49 @@ interface Props {
modifiedTime?: Date;
}
-const {
- title = SITE_TITLE,
- description = SITE_DESCRIPTION,
+const {
+ title = SITE_TITLE,
+ description = SITE_DESCRIPTION,
usePadding = true,
image,
type = 'website',
publishedTime,
modifiedTime,
} = Astro.props;
+
+// Master Person schema - establishes canonical identity across all pages
+const personSchema = {
+ "@context": "https://schema.org",
+ "@type": "Person",
+ "@id": `${SOCIAL_LINKS.website}/#person`,
+ "name": "Nicholai Vogel",
+ "url": SOCIAL_LINKS.website,
+ "email": SOCIAL_LINKS.email,
+ "jobTitle": "VFX Supervisor & Technical Artist",
+ "description": "VFX Supervisor specializing in both 2D and 3D VFX, AI and high-end technical visualization.",
+ "knowsAbout": [
+ "Houdini",
+ "Nuke",
+ "ComfyUI",
+ "Python",
+ "VFX Pipeline",
+ "Real-time VFX",
+ "Motion Graphics",
+ "Technical Art"
+ ],
+ "sameAs": [
+ SOCIAL_LINKS.linkedin,
+ "https://www.instagram.com/nicholai.exe"
+ ],
+ "affiliation": {
+ "@type": "Organization",
+ "name": "Biohazard VFX",
+ "url": "https://biohazardvfx.com",
+ "founder": {
+ "@id": `${SOCIAL_LINKS.website}/#person`
+ }
+ }
+};
---
@@ -40,14 +74,18 @@ const {
document.documentElement.setAttribute('data-theme', theme);
})();
-
+
+
+
+
diff --git a/src/layouts/BlogPost.astro b/src/layouts/BlogPost.astro
index cb6ef3d..f841954 100644
--- a/src/layouts/BlogPost.astro
+++ b/src/layouts/BlogPost.astro
@@ -8,6 +8,7 @@ import TableOfContents from '../components/TableOfContents.astro';
import PostNavigation from '../components/PostNavigation.astro';
import RelatedPosts from '../components/RelatedPosts.astro';
import { Image } from 'astro:assets';
+import { SOCIAL_LINKS } from '../consts';
interface NavPost {
title: string;
@@ -56,6 +57,7 @@ const {
} = Astro.props;
// Article structured data (JSON-LD)
+// References the canonical Person @id from BaseLayout for knowledge graph linking
const articleSchema = {
"@context": "https://schema.org",
"@type": "Article",
@@ -64,14 +66,10 @@ const articleSchema = {
"datePublished": pubDate.toISOString(),
"dateModified": (updatedDate || pubDate).toISOString(),
"author": {
- "@type": "Person",
- "name": "Nicholai Vogel",
- "url": "https://nicholai.work"
+ "@id": `${SOCIAL_LINKS.website}/#person`
},
"publisher": {
- "@type": "Person",
- "name": "Nicholai Vogel",
- "url": "https://nicholai.work"
+ "@id": `${SOCIAL_LINKS.website}/#person`
},
"mainEntityOfPage": {
"@type": "WebPage",