Search

PythonReactSEOPDF
GitHub Skill

verify-sitemap

Validate sitemap.xml generation, ensure all URLs are reachable, check for localhost references, and verify proper lastmod dates. Triggered when asked to verify sitemap, check sitemap URLs, or audit sitemap generation.

renedeanda☆ 2 Repository stars1 Repository forks

Installation

Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.

View source ↗Guides

Skill instructions

Sitemap Verification Skill

Purpose

Validate the dynamic sitemap generation for the PM Philosophy Map, ensuring all 303 episodes and static pages are properly indexed with correct URLs and metadata.

When to Use This Skill

  • User asks to "verify sitemap"
  • User wants to "check sitemap URLs"
  • User requests to "validate sitemap.xml"
  • User asks to "audit sitemap generation"
  • Before production deployments or after adding new episodes

Context

  • Sitemap file: app/sitemap.ts
  • Dynamic generation: Next.js MetadataRoute.Sitemap
  • Expected entries: 306 total (3 static pages + 303 episodes)
  • Domain: https://lenny.productbuilder.net

What to Check

1. Sitemap Configuration

File: app/sitemap.ts

Validate:

  • ✅ Uses correct baseUrl (process.env.NEXT_PUBLIC_BASE_URL || 'https://lenny.productbuilder.net')
  • ✅ No localhost fallback
  • ✅ Imports allEpisodes correctly
  • ✅ Generates MetadataRoute.Sitemap type
2. Static Pages

Expected entries:

[
  { url: '/', priority: 1, changeFrequency: 'weekly' },
  { url: '/quiz', priority: 0.9, changeFrequency: 'weekly' },
  { url: '/explore', priority: 0.8, changeFrequency: 'daily' }
]

Validate:

  • ✅ All static pages included
  • ✅ Correct priority values (1.0 for home is highest)
  • ✅ Appropriate changeFrequency
  • ✅ lastModified dates present
3. Episode Pages

Expected: 303 episode URLs

Validate:

  • ✅ All episodes from allEpisodes.ts included
  • ✅ URL format: {baseUrl}/episodes/{slug}
  • ✅ No duplicate slugs
  • ✅ Valid slugs (no spaces, special chars)
  • ✅ lastModified uses episode.publishDate or fallback to new Date()
  • ✅ Appropriate priority (0.6 for episodes)
  • ✅ changeFrequency set to 'monthly'
4. URL Validation

Check for issues:

  • ❌ localhost URLs (http://localhost:3000)
  • ❌ Malformed URLs (missing protocol, trailing slashes inconsistency)
  • ❌ 404s (episodes that don't have pages)
  • ❌ Redirects (old slugs, renamed episodes)
  • ❌ Duplicate URLs
5. XML Output

After build, validate:

  • ✅ Valid XML structure
  • ✅ Proper <urlset> namespace
  • ✅ All <url> entries have <loc>, <lastmod>, <changefreq>, <priority>
  • ✅ Dates in ISO 8601 format (YYYY-MM-DD)
  • ✅ Proper escaping of special characters

Verification Process

Step 1: Read Sitemap Source
# Read the sitemap generator
Read app/sitemap.ts
# Check for localhost references
Grep "localhost" in app/sitemap.ts
Step 2: Validate Episode Count
# Count episodes in allEpisodes
Read lib/allEpisodes.ts
# Verify count matches 303 episodes
Step 3: Build and Generate Sitemap
# Build the app to generate sitemap
npm run build
# Access sitemap (dev or production)
curl http://localhost:3000/sitemap.xml
# Or check .next/server/app/sitemap.xml
Step 4: Validate XML Structure
# Check XML is valid
xmllint --noout sitemap.xml 2>&1 || echo "Valid XML"
# Count URL entries
grep -c "<loc>" sitemap.xml
# Should be 306 (3 static + 303 episodes)
Step 5: Check for Issues
# Find localhost URLs
grep "localhost" sitemap.xml
# Find duplicate URLs
grep "<loc>" sitemap.xml | sort | uniq -d
# Check for malformed URLs
grep -E "<loc>.*[^/]</loc>" sitemap.xml

Quick Commands

Generate and view sitemap:
npm run build && curl http://localhost:3000/sitemap.xml | head -50
Count sitemap entries:
grep -c "<url>" sitemap.xml
# Expected: 306
Find localhost references:
grep -i "localhost" app/sitemap.ts
Validate all episode pages exist:
# Check if all episodes have transcript files
ls episodes/*/transcript.md | wc -l
# Should be 303

Sample Output Format

Healthy Sitemap Entry:
<url>
  <loc>https://lenny.productbuilder.net/episodes/brian-chesky</loc>
  <lastmod>2024-01-15T00:00:00.000Z</lastmod>
  <changefreq>monthly</changefreq>
  <priority>0.6</priority>
</url>
Issue - Localhost URL:
<url>
  <loc>http://localhost:3000/episodes/brian-chesky</loc> <!-- ❌ BAD -->
  ...
</url>

Verification Report

Output format:

# Sitemap Verification Report - [Date]

## Summary
- **Total URLs**: 306 / 306 ✅
- **Static Pages**: 3 / 3 ✅
- **Episode Pages**: 303 / 303 ✅
- **Domain Issues**: 0 ✅

## ✅ Passed Checks
- All 303 episodes included
- Correct domain (lenny.productbuilder.net)
- Valid XML structure
- No duplicate URLs
- Proper lastModified dates

## ⚠️ Issues Found
None

## 📋 Details
- Home page priority: 1.0 ✅
- Quiz page priority: 0.9 ✅
- Explore page priority: 0.8 ✅
- Episode pages priority: 0.6 ✅
- All URLs use HTTPS ✅

## Testing
Test sitemap submission:
1. Google Search Console: https://search.google.com/search-console
2. Bing Webmaster Tools: https://www.bing.com/webmasters
3. Sitemap validator: https://www.xml-sitemaps.com/validate-xml-sitemap.html

Common Issues & Fixes

Issue: Localhost URLs in sitemap

Fix:

// app/sitemap.ts
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL || 'https://lenny.productbuilder.net';
// Remove 'http://localhost:3000' fallback
Issue: Missing episodes

Fix: Check lib/allEpisodes.ts and ensure all episode folders are scanned:

ls episodes/ | wc -l  # Should be 303
Issue: Duplicate slugs

Fix:

# Find duplicate slugs in allEpisodes.ts
grep "slug:" lib/allEpisodes.ts | sort | uniq -d
Issue: Invalid lastModified dates

Fix:

// Use valid ISO date or new Date()
lastModified: episode.publishDate ? new Date(episode.publishDate) : new Date()

Success Criteria

  • ✅ 306 total URLs (3 static + 303 episodes)
  • ✅ All URLs use production domain (lenny.productbuilder.net)
  • ✅ No localhost references
  • ✅ Valid XML structure
  • ✅ Proper priority and changeFrequency values
  • ✅ All lastModified dates valid
  • ✅ No 404s or broken links

Related Skills

  • verify-seo - Full SEO audit including metadata
  • update-og-images - Ensure all episodes have OG images

Examples

Read the usage examples in the source repository.

View source ↗

Source history

Indexed on
2026-03-11
Index updated
2026-03-11
Branch
main

Index and sync dates describe this directory. View the source repository for code history.

GitHub ↗

chat Comments (0)

chat_bubble_outline

No comments yet. Be the first to share your thoughts!