Add structured data, content artifacts, and improve SEO#48
Merged
Conversation
Replace the default Nuxt SEO Satori template with a branded layout matching the site's blue accent and Fabian Meyer's positioning. Standardise the component name as 'Default' so defineOgImage calls resolve unambiguously.
Talk detail pages now emit schema.org Event JSON-LD (with start/end date, location, performer, organizer, language, attendance mode) and a BreadcrumbList for rich-result eligibility. The buildTalkEventSchema helper maps the existing YAML fields and handles both online and in-person locations. Also unify defineOgImage() calls to the string component form so typing matches the OgImageComponents registry.
Lab detail pages now emit schema.org CreativeWork or SoftwareSourceCode JSON-LD (with author, dateCreated, codeRepository, keywords, status) and a BreadcrumbList. Labs and Speaking index pages emit BreadcrumbList plus an ItemList describing every entry — both improve rich-result eligibility and give LLM crawlers a clean entity graph.
Adds a Nitro close hook that reads YAML content directly and emits: - /llms.txt (concise URL + summary index, https://llmstxt.org) - /llms-full.txt (full prose body of every lab and talk) - /rss.xml (combined feed, RSS 2.0) These help LLM-powered search and AI answer engines surface labs and talks without having to render JavaScript. Also wires a <link rel='alternate' type='application/rss+xml'> hint in app.vue, moves the OG image registration into usePageSeo so every page gets a unique per-route preview with title/description props, and adds ogImageAlt / twitterImageAlt for accessibility on social platforms.
…ross-links Lab and talk detail pages now: - wrap their body in <article> for landmark clarity - render dates inside <time datetime> with ISO-8601 values - show a 'By Fabian Meyer · <date>' byline that links to the homepage #identity anchor (matches schema.org performer/author) - end with a 'Related labs' / 'More talks' section so crawlers and readers can pivot to neighbouring content A Nitro plugin overrides @nuxtjs/sitemap's autoLastmod (file mtime, always today) with the real publish date pulled from each entry's YAML, so search engines get accurate per-URL freshness signals.
…inks - theme-color now uses two <meta> tags scoped by prefers-color-scheme, which is the cross-browser standard and avoids running the color-mode computation in app.vue - rel='me' links to GitHub and LinkedIn enable identity verification on profiles that accept linked-back rel-me discovery
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR enhances SEO and content discoverability by adding comprehensive structured data (JSON-LD schema.org), generating content artifacts for LLM indexing and RSS feeds, and improving OG image handling. It also adds related content recommendations on detail pages.
Key Changes
buildLabCreativeWorkSchema()andbuildTalkEventSchema()utilities to generate schema.org JSON-LD for labs and talks, including breadcrumb navigation on all detail pagesgenerate-content-artifacts.ts) that generates:llms.txtandllms-full.txtfor LLM indexing (Claude, Perplexity, etc.)rss.xmlfeed for labs and speaking updatessitemap-lastmod.tsplugin to use actual YAML content dates instead of file modification times for accurate freshness signalsrelatedLabsandrelatedTalkscomputed properties that recommend similar content based on tag overlap and recencyNuxtSeoSatoritemplate with newDefault.satori.vuecomponent for cleaner, more consistent OG image generation<article>semantic tags<time>elements for better accessibilityusePageSeo()to includeogImageAltfor better OG image accessibilityyamlpackage for content parsing in build scriptsImplementation Details
@nuxtjs/sitemapto override auto-generated lastmod valueshttps://claude.ai/code/session_013i4bC4y9gm7nU8nmMwfCq4