Add canonical Person schema and social links to layouts

- Add SOCIAL_LINKS import to BaseLayout and BlogPost
- Add Master Person schema to BaseLayout
- Reference Person @id in BlogPost article schema

Hubert The Eunuch
This commit is contained in:
Nicholai 2025-12-21 01:46:53 -07:00
parent 5b9d4b3a14
commit 861263437c
2 changed files with 49 additions and 13 deletions

View File

@ -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`
}
}
};
---
<!DOCTYPE html>
@ -40,14 +74,18 @@ const {
document.documentElement.setAttribute('data-theme', theme);
})();
</script>
<BaseHead
title={title}
description={description}
<BaseHead
title={title}
description={description}
image={image}
type={type}
publishedTime={publishedTime}
modifiedTime={modifiedTime}
/>
<!-- Master Person Schema - Canonical Identity -->
<script type="application/ld+json" set:html={JSON.stringify(personSchema)} />
<slot name="head" />
</head>

View File

@ -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",