SEO Optimization: Meta Tags, Sitemaps & Structured Data
Make your Jekyll site discoverable with meta tags, sitemaps, structured data, and jekyll-seo-tag.
Your choice is remembered across quests and rewrites the commands below to match.
Greetings, brave adventurer! Welcome to SEO Optimization - the quest where you light a beacon so the search engines of the realm can find your work. You can forge the most beautiful site in the kingdom, but if no crawler can read it and no result links to it, it stands silent in the fog. Search Engine Optimization is the craft of making your pages discoverable, understandable, and shareable.
Whether you are publishing a portfolio, a blog, or documentation, this adventure will teach you the technical foundations - titles, descriptions, sitemaps, structured data, and the jekyll-seo-tag plugin - that help your pages rank and appear correctly when shared.
📖 The Legend Behind This Quest
Search engines send out tireless crawlers that read pages, follow links, and build an index of the web. When someone searches, the engine ranks pages from that index. For years people chased tricks, but the durable truth emerged: write good content and make it easy for machines to read. That means a clear <title>, a compelling meta description, a sitemap listing your pages, a robots.txt granting access, and structured data that spells out, in a format machines parse, exactly what a page is about. Get these right and your work surfaces where people are looking.
This quest teaches the technical SEO that static-site authors control, and how Jekyll plugins automate most of it.
🎯 Quest Objectives
By the time you complete this journey, you will have mastered:
Primary Objectives (Required for Quest Completion)
- Titles & Meta Descriptions - Write the snippets that appear in search results
- Meta & Open Graph Tags - Control how pages look in search and social shares
- Sitemaps & robots.txt - Tell crawlers what to read and where to find it
- Jekyll-seo-tag - Automate metadata generation across a whole site
Secondary Objectives (Bonus Achievements)
- Structured Data - Add JSON-LD so engines understand your content type
- Canonical URLs - Prevent duplicate-content confusion
- Search Console - Verify your site and watch how it is indexed
- Performance & Accessibility - Audit Core Web Vitals and WCAG basics that lift rank
Mastery Indicators
You’ll know you’ve truly mastered this quest when you can:
- Write a title and description that earn a click
- Explain what a sitemap and robots.txt each do
- Add JSON-LD structured data for an article
🗺️ Quest Prerequisites
📋 Knowledge Requirements
- Familiarity with HTML and YAML frontmatter
- Basic command line navigation (
cd,ls) - Recommended: completion of Advanced Markdown
🛠️ System Requirements
- Modern operating system (Windows 10+, macOS 10.14+, or Linux)
- A Jekyll site (or any static site) to edit
- A text editor or IDE (VS Code recommended)
- Internet connection for verification tools
🧠 Skill Level Indicators
This 🟢 Easy quest expects:
- Beginner-friendly - some exposure to Jekyll helps but is not required
- Willingness to inspect a page’s
<head>in DevTools - Ready for 45-60 minutes of focused learning
🌍 Choose Your Adventure Platform
SEO lives in your site’s HTML and config. You will edit files and check the output. Pick your setup.
🍎 macOS Kingdom Path
Click to expand macOS instructions
# In an existing Jekyll site, add the SEO and sitemap plugins
cd ~/my-site
bundle add jekyll-seo-tag jekyll-sitemap
# `bundle add` only edits the Gemfile — Jekyll won't load the plugins until you
# also add them to the `plugins:` list in _config.yml (see Chapter 2). Without
# that step, /sitemap.xml is never generated.
bundle exec jekyll serve
# View the generated metadata
open http://127.0.0.1:4000/
macOS-Specific Notes:
- Open DevTools (
Cmd + Option + I) and inspect the<head>to see generated tags. - Visit
/sitemap.xmland/robots.txtonce the plugins are active.
🪟 Windows Empire Path
Click to expand Windows instructions
# In an existing Jekyll site, add the SEO and sitemap plugins
cd $HOME\my-site
bundle add jekyll-seo-tag jekyll-sitemap
# `bundle add` only edits the Gemfile — Jekyll won't load the plugins until you
# also add them to the `plugins:` list in _config.yml (see Chapter 2). Without
# that step, /sitemap.xml is never generated.
bundle exec jekyll serve
Start-Process http://127.0.0.1:4000/
Windows-Specific Notes:
- View source (
Ctrl + U) to confirm the<meta>and<title>tags are present. - Browse to
/sitemap.xmlto see every page the crawler will discover.
🐧 Linux Territory Path
Click to expand Linux instructions
# In an existing Jekyll site, add the SEO and sitemap plugins
cd ~/my-site
bundle add jekyll-seo-tag jekyll-sitemap
# `bundle add` only edits the Gemfile — Jekyll won't load the plugins until you
# also add them to the `plugins:` list in _config.yml (see Chapter 2). Without
# that step, /sitemap.xml is never generated.
bundle exec jekyll serve
xdg-open http://127.0.0.1:4000/
Linux-Specific Notes:
curl -s http://127.0.0.1:4000/sitemap.xml | headshows the generated sitemap.curl -s http://127.0.0.1:4000/ | grep -i '<meta'lists your meta tags.
☁️ Cloud Realms Path
Click to expand Cloud/Container instructions
# No local Jekyll? Edit on GitHub and let GitHub Pages build the site.
# GitHub Pages whitelists jekyll-seo-tag and jekyll-sitemap by default.
# Add them to _config.yml plugins and push; Pages builds with SEO enabled.
Cloud-Specific Notes:
- Use Google’s Rich Results Test and the Facebook Sharing Debugger on the live URL.
- GitHub Pages includes both SEO plugins, so no extra build setup is required.
🧙♂️ Chapter 1: Titles, Descriptions & Meta Tags - The Search Snippet
The blue link and gray summary you see in search results come straight from your page’s <title> and meta description. These also drive how a link looks when shared on social media.
⚔️ Skills You’ll Forge in This Chapter
- Writing effective titles and descriptions
- The essential
<head>meta tags - Open Graph tags for social sharing
🏗️ The Tags That Matter
A search snippet is built from two tags in your <head>:
<head>
<!-- The clickable blue headline; aim for ~50-60 characters -->
<title>SEO for Jekyll Sites: A Practical Beginner Guide</title>
<!-- The gray summary under it; aim for ~150-160 characters -->
<meta
name="description"
content="Learn the technical SEO every Jekyll author needs: meta tags, sitemaps, structured data, and the jekyll-seo-tag plugin."
/>
<!-- Tells search engines which URL is the master copy of this page -->
<link rel="canonical" href="https://example.com/seo-guide/" />
</head>
For social sharing, Open Graph tags control the preview card on platforms like LinkedIn and Slack:
<meta property="og:title" content="SEO for Jekyll Sites" />
<meta property="og:description" content="A practical beginner guide." />
<meta property="og:image" content="https://example.com/preview.png" />
<meta property="og:type" content="article" />
Good titles are specific and front-load the keyword; good descriptions read like a one-sentence pitch, not a keyword stuffing. The description is not a ranking factor by itself, but it heavily influences whether someone clicks.
🔍 Knowledge Check: Titles & Meta
- What two tags form the snippet shown in search results?
- What does a canonical URL prevent?
- Which tags control how a link looks when shared on social media?
⚡ Quick Wins and Checkpoints
- Wrote a title: A concise, keyword-forward
<title>is set - Wrote a description: A compelling ~155-character description is set
🧙♂️ Chapter 2: Sitemaps, robots.txt & Jekyll-seo-tag - Helping the Crawler
Crawlers need a map and a key. A sitemap lists your URLs; robots.txt grants or restricts access. And jekyll-seo-tag generates most of Chapter 1’s tags for every page automatically.
⚔️ Skills You’ll Forge in This Chapter
- Generating a sitemap with a plugin
- Writing a sensible robots.txt
- Wiring up Jekyll-seo-tag site-wide
🏗️ Automating Metadata
Enable the plugins in _config.yml. These are on GitHub Pages’ allowlist, so they work even without local builds:
# _config.yml
title: My Quest Site
description: A static site forged in the Web Fundamentals tier
url: https://example.com # full host, no trailing slash
author:
name: Your Name
twitter: yourhandle
plugins:
- jekyll-seo-tag
- jekyll-sitemap
- jekyll-feed # generates /feed.xml so readers and aggregators can subscribe
These three plugins forge your site’s discoverability assets automatically - each is on GitHub Pages’ allowlist:
| Plugin | Generates | Where |
|---|---|---|
jekyll-seo-tag |
Meta, Open Graph & JSON-LD tags | <head> of every page |
jekyll-sitemap |
XML sitemap | /sitemap.xml |
jekyll-feed |
RSS feed | /feed.xml |
Then place a single tag in your layout’s <head>. It reads your _config.yml and each page’s frontmatter and emits the title, description, canonical link, Open Graph, and JSON-LD all at once:
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
{% seo %}
</head>
jekyll-sitemap automatically generates /sitemap.xml - no work beyond adding the plugin. Add a robots.txt at your site root to point crawlers to it:
User-agent: *
Allow: /
Sitemap: https://example.com/sitemap.xml
User-agent: * addresses all crawlers; Allow: / permits the whole site; the Sitemap: line tells them where the map lives.
🔍 Knowledge Check: Sitemaps & Plugins
- What does the
{% seo %}tag generate? - What is the purpose of a sitemap versus robots.txt?
- Why are these two plugins safe to use on GitHub Pages?
⚡ Quick Wins and Checkpoints
- Sitemap live:
/sitemap.xmllists your pages - SEO tag working: Page source shows generated meta tags
🧙♂️ Chapter 3: Structured Data & Verification - Speaking the Machine’s Language
Beyond plain meta tags, structured data (JSON-LD using schema.org vocabulary) tells engines precisely what a page is - an article, a recipe, a product - which can earn rich results.
⚔️ Skills You’ll Forge in This Chapter
- Adding JSON-LD structured data
- Validating it with Google’s tools
- Verifying ownership in Search Console
🏗️ JSON-LD for an Article
jekyll-seo-tag emits basic JSON-LD for you, but you can add richer data by dropping a script into your page’s head:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "SEO for Jekyll Sites",
"description": "A practical beginner guide to technical SEO.",
"author": { "@type": "Person", "name": "Your Name" },
"datePublished": "2026-06-14",
"image": "https://example.com/preview.png"
}
</script>
The @type tells the engine this is an Article; the fields map to schema.org’s vocabulary. Search engines can use this to show a richer result with an author, date, and image.
To confirm everything works:
- Paste the live URL into Google’s Rich Results Test to validate your structured data.
- Add the site to Google Search Console, verify ownership (a meta tag or DNS record), and submit your sitemap so Google indexes you faster.
🔍 Knowledge Check: Structured Data
- What format and vocabulary does structured data use here?
- What does the
@typefield communicate to a search engine? - Which tool validates structured data, and which monitors indexing?
🧙♂️ Chapter 4: Performance & Accessibility - Signals That Lift the Rank
Discoverability is only half the beacon. Search engines now weigh how fast a page loads (Core Web Vitals) and how usable it is. A slow or inaccessible page is demoted in results - and turns away the visitors your tags worked to attract. These signals are ranking factors and good craft at once.
⚔️ Skills You’ll Forge in This Chapter
- Trimming page weight for Core Web Vitals
- Auditing with Lighthouse
- Meeting baseline accessibility standards
🏗️ Make Pages Fast
Heavy images are the most common drag on a static site. Resize and compress them before they ship:
# Resize to a sane max width (macOS built-in)
sips --resampleWidth 1200 assets/images/large-photo.jpg
# Or compress in place across a folder with ImageOptim CLI
brew install imageoptim-cli
imageoptim assets/images/
Then tighten the rest of the page:
- Lazy-load below-the-fold images with
loading="lazy" - Build for production so Jekyll minifies output:
JEKYLL_ENV=production - Ship only the JavaScript you need - every extra script blocks render
- Serve static assets from a CDN when self-hosting
- Audit with Lighthouse - Chrome DevTools → Lighthouse tab - and chase the score up
🏗️ Make Pages Accessible
Accessible pages rank better, read better in screen readers, and are simply correct. Run this checklist over a page:
- Every image has descriptive
alttext - Text meets WCAG AA contrast (4.5:1 ratio)
- Interactive elements are keyboard-navigable with visible focus
- Heading hierarchy is logical (h1 → h2 → h3, no skips)
- Links use descriptive text, never “click here”
- The page sets a language attribute:
<html lang="en">
Verify with a dedicated checker beyond Lighthouse:
| Tool | Type | Where |
|---|---|---|
| Lighthouse | Browser built-in | Chrome DevTools |
| axe DevTools | Browser extension | deque.com/axe |
| WAVE | Online checker | wave.webaim.org |
| Pa11y | CLI | npm install -g pa11y |
🔍 Knowledge Check: Performance & Accessibility
- Which build environment makes Jekyll minify its output?
- What contrast ratio does WCAG AA require for body text?
- Name one tool that audits both performance and accessibility.
⚡ Quick Wins and Checkpoints
- Lighthouse run: You have a baseline score for a key page
- Alt text pass: Every image on one page has descriptive
alttext
🎮 Mastery Challenges
🟢 Novice Challenge: A Perfect Snippet
Objective: Give one page an optimized title and description.
Requirements:
- A
<title>of roughly 50-60 characters - A meta description of roughly 150-160 characters
- A canonical URL
Validation: View source and confirm all three tags render correctly.
🟡 Intermediate Challenge: Crawlable Site
Objective: Make a whole site crawlable and self-describing.
Requirements:
- Enable
jekyll-seo-tagandjekyll-sitemap - Add the
{% seo %}tag to your layout - Add a
robots.txtpointing at your sitemap
Validation: /sitemap.xml and /robots.txt both load and the head shows generated tags.
🔴 Advanced Challenge: Rich Results
Objective: Add and validate structured data.
Requirements:
- Add JSON-LD
Articledata to a page - Validate it with Google’s Rich Results Test
- Verify the site in Search Console and submit the sitemap
Validation: The Rich Results Test reports no errors for your structured data.
🟡 Bonus Challenge: Audit Speed & Access
Objective: Prove a page is fast and accessible.
Requirements:
- Run Lighthouse on a key page and record the Performance and Accessibility scores
- Add
alttext to every image andloading="lazy"below the fold - Fix the highest-impact issue Lighthouse or axe DevTools reports
Validation: A re-run of Lighthouse shows the score improve after your fix.
🏆 Quest Rewards & Achievements
🎖️ Badges Earned:
- 🏆 Beacon Keeper - You made a site search engines can find and understand
- 🌱 Sprout of Discoverability - Meta tags and structured data are second nature
🛠️ Skills Unlocked:
- Technical SEO for Static Sites - Titles, sitemaps, and crawl control
- Structured Data & Metadata - Help machines understand your content
🔓 Unlocked Quests:
- Analytics Integration - Measure the traffic your SEO earns
- Jekyll Plugins - Automate more of your site’s metadata
📊 Progression Points: +50 XP
🗺️ Next Steps in Your Journey
Continue the Main Story:
- 🎯 Analytics Integration - Measure the visitors SEO brings
Explore Side Adventures:
- ⚔️ Jekyll Plugins - The plugins that power SEO automation
- ⚔️ Advanced Markdown - Author the content you optimize
Character Class Recommendations
💻 Software Developer: Continue to Jekyll Plugins
🏗️ System Engineer: Explore Analytics Integration
🎨 Frontend Specialist: Advance to Analytics Integration
📚 Resources
Official Documentation
- Google Search Central: SEO Starter Guide - The canonical guidance
- Jekyll-seo-tag - The metadata plugin
- Jekyll-sitemap - Automatic sitemap generation
Community Resources
- schema.org - The structured-data vocabulary
- Google Rich Results Test - Validate JSON-LD
- Open Graph protocol - The social-sharing meta standard
Learning Materials
- Google Search Console - Monitor indexing and performance
- Moz Beginner’s Guide to SEO - A thorough primer
Performance & Accessibility
- Google Lighthouse - Audit performance, accessibility, and SEO
- WCAG Guidelines - The accessibility standard
- axe DevTools - In-browser accessibility checker
🤝 Quest Completion Checklist
- ✅ Completed all primary objectives
- ✅ Optimized a page’s title, description, and structured data
- ✅ Answered all knowledge check questions
- ✅ Completed at least one mastery challenge
- ✅ Explored the resource library
- ✅ Identified your next quest in the journey
🕸️ Knowledge Graph
Structured wiki-links connect this quest to the IT-Journey knowledge graph. Open the Obsidian Graph View to explore connections.
Level hub: [[Level 0001 - Web Fundamentals]] Overworld: [[🏰 Overworld - Master Quest Map]] Unlocks: [[Analytics Integration]] · [[Jekyll Plugins]] Obsidian docs: [[Obsidian Knowledge Graph and Wiki Links]]
🎁 Rewards
Badges
- 🏆 Beacon Keeper - Made a site search engines can find and understand
- 🌱 Sprout of Discoverability - Internalized meta tags and structured data
Skills unlocked
- 🛠️ Technical SEO for Static Sites
- 🧠 Structured Data & Metadata
Features unlocked
- Access to the measurement quests of Level 0001 Web Fundamentals
🕸️ Quest Network
Click a node to open the quest · ⌘/Ctrl-click for a new tab · drag to reposition · scroll to zoom.
Referenced by
- Loading…