* feat(seo): BlogPosting schema, FAQPage JSON-LD, author system, AI crawler welcome
Blog structured data:
- Change @type Article to BlogPosting for all blog posts
- Author: Organization to Person with extensible default (Elie Habib)
- Add per-post author/authorUrl/authorBio/modifiedDate frontmatter fields
- Auto-extract FAQPage JSON-LD from FAQ sections in all 17 posts
- Show Updated date when modifiedDate differs from pubDate
- Add author bio section with GitHub avatar and fallback
Main app:
- Add commodity variant to middleware VARIANT_HOST_MAP and VARIANT_OG
- Add commodity.worldmonitor.app to sitemap.xml
- Shorten index.html meta description to 136 chars (was 161)
- Remove worksFor block from index.html author JSON-LD
- Welcome all bots in robots.txt (removed per-bot blocks, global allows)
- Update llms.txt: five variants listed, all 17 blog post URLs added
* fix(seo): scope FAQ regex to section boundary, use author-aware avatar
- extractFaqLd now slices only to the next ## heading (was: to end of body)
preventing bold text in post-FAQ sections from being mistakenly extracted
- Avatar src now derived from DEFAULT_AUTHOR_GITHUB constant (koala73)
only when using the default author; custom authors fall back to favicon
so multi-author posts show a correct image instead of the wrong profile
* fix(seo): add all blog post URLs to sitemap.xml, fix /pro trailing slash
* fix(seo): align /pro sitemap entry with page canonical (no trailing slash)
public/pro/index.html declares https://www.worldmonitor.app/pro as the
canonical and hreflang URL. The sitemap had /pro/ which sent conflicting
signals to crawlers. Reverted to /pro to match the page metadata.
- Add IndexNow verification key file (public/a7f3e9d1b2c44e8f9a0b1c2d3e4f5a6b.txt)
- Update sitemap.xml lastmod to 2026-03-19 to signal freshness to crawlers
- Add lastmod dates to blog sitemap via @astrojs/sitemap serialize()
- Add scripts/seo-indexnow-submit.mjs to resubmit all 23 URLs to IndexNow
(run after deploy: node scripts/seo-indexnow-submit.mjs)
* feat(blog): SEO optimization, OG images, favicon fix, and site footer
- Add JSON-LD structured data (Article + Blog schemas) to all pages
- Add OG image, twitter:image, article:published_time/modified_time meta
- Auto-generate branded 1200x630 OG images via satori + sharp at build time
- Stagger blog post dates (Feb 10 - Mar 11) to avoid batch-publish penalty
- Enhance RSS feed with atom:link, language tag, and keyword categories
- Replace blog-specific favicon with main site's /favico/ set
- Add site footer to main dashboard with Blog, Pro, and GitHub links
- Add blog entry to root sitemap.xml and llms.txt
* feat(pro): add Blog link to Pro and Enterprise page footers
Pro page (/pro):
- Shorten title to ≤60 chars for SERP visibility
- Fix canonical + all URLs to www.worldmonitor.app
- Fix multiple H1 (Enterprise modal H1→H2)
- Fix heading hierarchy (H2→H4 jumps → proper H2→H3→H4)
- Sync FAQPage JSON-LD with all 8 visible FAQs
- Add twitter:title, twitter:description, og:locale, og:image:alt
- Add hreflang tags for all 21 supported languages
- Add <noscript> fallback with key SEO content
- Add SSG prerender script (injects text into built HTML)
- Self-host WIRED logo SVG (was loading from Wikipedia)
- Add aria-labels on footer links and CTAs
- Fix i18n to read ?lang= query parameter (was only localStorage + navigator)
Main page:
- Fix canonical + OG/Twitter URLs to www.worldmonitor.app
- Update twitter:site/creator to @worldmonitorai
- Add <noscript> with H1, description, features, and /pro link
- Add hreflang tags for all 21 languages
- Add og:image:alt meta tag
- Add @worldmonitorai to JSON-LD sameAs
- Align title with variant-meta.ts
Shared:
- Update sitemap.xml URLs to www.worldmonitor.app
- Update robots.txt sitemap reference to www
- Update variant-meta.ts full variant URL to www
Remove 'unsafe-inline' from script-src in both index.html and vercel.json,
replacing it with SHA-256 hashes of the two static inline theme-detection
scripts. Add security.txt, sitemap.xml, and Sitemap directive in robots.txt
to improve scanner reputation. Fix stale variant-metadata test that was
reading vite.config.ts instead of the extracted variant-meta.ts module.