SEO & Discoverability¶
Homebase is optimized for search engines, AI answer engines (AEO), generative engine optimization (GEO), and social sharing out of the box.
Fields Reference¶
seo.title¶
The <title> tag and og:title. Keep under 60 characters.
seo.description¶
The <meta name="description"> and og:description. Keep 120-160 characters.
seo.canonical¶
The canonical URL for your site (no trailing slash). Used in <link rel="canonical">, og:url, JSON-LD, and sitemap.
seo.og_image¶
Open Graph image URL. Shown as the preview image when shared on social media. Recommended size: 1200×630px.
seo.og_image_auto / seo.og_image_brand_color¶
When og_image_auto: true, Homebase generates a 1200×630 PNG at build time and uses it for all og:image, twitter:image, and JSON-LD image references. The image composites your brand color background, a circular avatar (from profile.avatar), your name, tagline, and site URL.
seo:
og_image_auto: false # set true to enable; false by default
og_image_brand_color: "#1E2330" # optional background color override
| Field | Default | Description |
|---|---|---|
og_image_auto |
false |
Set to true to generate src/assets/og-image-auto.png before each build. |
og_image_brand_color |
"#1E2330" |
Hex background color for the generated image. |
Requires @napi-rs/canvas
The generator uses @napi-rs/canvas (a devDependency with prebuilt native bindings). It is triggered by Eleventy's eleventy.before event and works in GitHub Actions without extra setup. When auto mode is active, og:image dimensions are reported as 1200×630 (PNG).
seo.keywords¶
Array of keywords for <meta name="keywords">. Not heavily weighted by modern search engines but still included.
seo.person.correction_notes¶
Array of factual statements written into your llms.txt to anchor AI-generated answers. Use this to prevent LLMs from hallucinating wrong job titles, affiliations, or product attributions.
seo:
person:
correction_notes:
- "All content is independent and does not represent my employer's views."
- "My SaaS product is separate from my personal brand."
seo.person.wikidata_id¶
Your Wikidata entity ID (e.g. "Q12345678"). When set, appends https://www.wikidata.org/wiki/{wikidata_id} to the Person.sameAs[] array in your JSON-LD.
Highest-trust Knowledge Panel signal
Wikidata is the primary source Google's Knowledge Graph uses to verify real-world entities. Adding your Wikidata Q-ID is the highest-trust sameAs signal for triggering or enriching a Google Knowledge Panel. Most users will not have a Wikidata entry — this field is commented out by default. If you do have one, it is the single highest-value SEO addition you can make here.
What Gets Generated¶
| Tag / File | Source |
|---|---|
<title> |
seo.title |
<meta name="description"> |
seo.description |
<meta name="author"> |
profile.name |
<link rel="canonical"> |
seo.canonical |
<link rel="me"> |
All entries in socials (IndieAuth / Mastodon identity) |
og:title |
seo.title |
og:description |
seo.description |
og:image |
seo.og_image (or auto-generated PNG when seo.og_image_auto: true) |
og:image dimensions |
1200×630 when seo.og_image_auto: true |
og:url |
seo.canonical |
og:type |
profile (hardcoded) |
twitter:card |
summary_large_image (hardcoded) |
twitter:image |
Same as og:image |
| Schema.org JSON-LD | ProfilePage + Person + ItemList |
FAQPage JSON-LD |
integrations.faq.items (when enabled) |
BreadcrumbList JSON-LD |
Auto-generated for home and shop pages |
Speakable JSON-LD |
Marks profile bio and FAQ answers for voice assistants |
VideoObject JSON-LD |
One per video from youtube_channels feed or featured_videos |
aggregateRating + review[] on Person |
integrations.testimonials (when enabled and items exist) |
/sitemap.xml |
seo.canonical + all page URLs |
/robots.txt |
Auto-generated (see below) |
/llms.txt |
Auto-generated from site.yaml (see below) |
/llms-full.txt |
Auto-generated, full-text companion (see below) |
Identity Meta Tags¶
Every page emits author, creator, and publisher meta tags automatically from your profile and SEO config:
<meta name="author" content="Dev Leader" />
<meta name="creator" content="Dev Leader" />
<meta name="publisher" content="Dev Leader | Software Engineering" />
A <link rel="me"> tag is emitted for every URL in your socials array. This is used by Mastodon and IndieAuth to verify that your social profiles belong to the same identity.
JSON-LD Schemas¶
Homebase emits multiple structured data blocks per page. Google and other engines use these to generate rich results and knowledge graph entries.
ProfilePage + Person + ItemList¶
Always present. Describes you as a Person with your name, bio, social profiles, and links as ItemList. This is the primary schema that can populate a knowledge panel.
FAQPage¶
Emitted when integrations.faq.enabled: true. Eligible for expandable FAQ rich results in Google Search. Each question/answer pair in site.yaml becomes a Question + acceptedAnswer in the schema. See Configuration — FAQ Widget.
BreadcrumbList¶
Always present. Provides structured navigation hints (Home → Shop) to search engines.
Speakable¶
Marks the profile bio (.profile-bio) and FAQ answers (.integration-faq-answer) as the most voice-assistant-friendly content on the page. Used by Google Assistant and similar systems.
Speakable is in beta
Google's Speakable feature is currently in beta and primarily targets English-language news content. It is included because it is harmless to emit and may benefit future implementations. Source: Google Search Central
VideoObject¶
Emitted automatically — one VideoObject block per video from your youtube_channels live feed or featured_videos fallback. Includes all fields required for Google video rich results: name, description, thumbnailUrl, uploadDate, contentUrl, and embedUrl.
thumbnailUrl, contentUrl, and embedUrl are auto-derived from the video's youtube_id. The uploadDate is extracted from the YouTube Atom feed (Option A) or from the upload_date field you supply on each featured_videos entry (Option B). Falls back to the site build timestamp if neither is available.
See Configuration — Featured Videos for the description and upload_date fields.
Review + AggregateRating¶
Emitted automatically when integrations.testimonials.enabled: true and at least one testimonial item exists. Adds two things to the Person entity:
aggregateRating—ratingValue: "5",reviewCount: N(count of testimonial items)review[]— oneReviewentry per testimonial, using thequote,author, and optionalratingfields
This can surface star ratings alongside your name in Google Search results for personal brand pages. Source: Google Search Central
OG Image Auto Generation¶
When seo.og_image_auto: true, Homebase generates src/assets/og-image-auto.png (1200×630) before each build using scripts/generate-og-image.js. The image is then used everywhere og:image, twitter:image, and JSON-LD image references appear — you do not need to set seo.og_image separately.
The generated image composites:
- Brand color background (
seo.og_image_brand_color, default#1E2330) - Circular avatar from
profile.avatar - Display name from
profile.name - Tagline / bio text
- Site URL from
seo.canonical
seo:
og_image_auto: false # set true to enable
og_image_brand_color: "#1E2330" # optional background color override
Build-time only
The image is regenerated on every build. To preview it locally, run npm run build and open src/assets/og-image-auto.png. The generator runs as part of Eleventy's eleventy.before event, so it is always up to date before pages are rendered.
llms.txt (AEO/GEO)¶
llms.txt is a plain-text file (analogous to robots.txt) that AI crawlers and LLM-based answer engines read to understand your identity and content. It is auto-generated and served at /llms.txt.
What is AEO/GEO?
Answer Engine Optimization (AEO) and Generative Engine Optimization (GEO) are practices for ensuring your content appears in AI-generated answers from Perplexity, ChatGPT Browse, Bing Copilot, and similar tools. llms.txt is the emerging convention for signaling structured identity to these systems. Spec: llmstxt.org
The generated llms.txt includes these sections, all driven by site.yaml:
| Section | Source |
|---|---|
## Canonical Identity |
profile.name, profile.username, profile.location, profile.language, seo.canonical |
## Correction Notes |
seo.person.correction_notes[] + a default disclaimer |
## About |
seo.llms_about (falls back to seo.description) |
## Topics |
seo.llms_topics[] |
## Content Formats |
seo.llms_content_formats[] |
## Audience |
seo.llms_audience |
## Frequently Asked Questions |
integrations.faq.items[] (when enabled) |
## Links |
All links from sections |
## Social Profiles |
All visible entries in socials |
## Content Freshness |
buildMeta.iso (build timestamp) |
## Shop |
shop.collections (when shop is enabled) |
llms-full.txt (Full Content Companion)¶
A full-text companion to llms.txt served at /llms-full.txt. Per the llmstxt.org spec, this file provides the complete page content for AI systems that want to ingest more context — extended bio, full link descriptions, complete FAQ answers, and detailed shop item descriptions.
The ## Correction Notes, ## Canonical Identity, and ## Frequently Asked Questions sections are identical to llms.txt. Additional sections include:
| Section | Source |
|---|---|
## Full Bio |
profile.ai_summary + profile.extended_bio |
## All Links |
All sections and links with descriptions |
## Products & Services |
Full shop items with descriptions and pricing |
robots.txt¶
Auto-generated. Allows all standard crawlers and explicitly allows 14 AI-specific crawlers by name so they are never accidentally blocked by wildcard deny rules:
| Crawler | Operator |
|---|---|
GPTBot |
OpenAI |
OAI-SearchBot |
OpenAI |
ChatGPT-User |
OpenAI |
ClaudeBot |
Anthropic |
Claude-SearchBot |
Anthropic |
anthropic-ai |
Anthropic |
PerplexityBot |
Perplexity |
Google-Extended |
|
PhindBot |
Phind |
YouBot |
You.com |
Applebot-Extended |
Apple |
CCBot |
Common Crawl (LLM pre-training datasets) |
Bytespider |
ByteDance |
Amazonbot |
Amazon |
The robots.txt also includes a comment pointing crawlers to /llms.txt and /llms-full.txt for structured content.
sitemap.xml¶
Auto-generated from seo.canonical. Submitted to Google Search Console at /sitemap.xml.
Google Analytics¶
Set analytics.google_analytics_id in site.yaml. Leave blank to disable (no tracking code is injected).