GEO: FAQPage/NGO/Event schema + autonomous generation for new projects

Generative Engine Optimization pass so AI answer engines (ChatGPT, Gemini,
Perplexity, AI Overviews) can confidently identify and cite MSOS.

Schema (tools/seo_inject.py, propagated to all 231 pages):
- FAQPage JSON-LD parsed from the /faq/ Q&A blocks (33 Q&A x EN/MK/SI)
- Organization upgraded to NGO with entity-disambiguation fields:
  alternateName (all spellings), description, areaServed Slovenia,
  knowsLanguage, and foundingDate 2023-03-05
- Event JSON-LD on all 9 /projects/ recap pages (date + real location)

Autonomous for future content (no code edits to add a project):
- Event/Article dates auto-read from the English page's publish date;
  event city auto-detected from the body (Slovenian-city whitelist).
  ARTICLE_DATES/PROJECT_LOCATIONS are now optional overrides only.
  (Auto-detect corrected Paint & Wine to Nova Gorica.)
- build_listings.py: auto-date fallback so undated new content still lists
- pre-commit hook now runs seo_inject.py --all --sitemap first, then
  listings/botlinks, and re-stages changed pages (idempotent)

Docs: docs/geo-offsite-worklist.md - copy-paste-ready off-site plan
(Wikidata, Wikipedia fixes, directories, Google Business, AI-visibility tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
popovskikandClaude Opus 4.8 committed 2026-08-07 22:17:03 +02:00
1 parent 43847ba935
commit 0d49293693
239 files changed
+825 -319

No files matched your search

+84
View File
@@ -85,6 +85,48 @@
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/"/>
</url>
<url>
<loc>https://msosorg.com/en/blog/ad-futura-scholarship-slovenia-2026/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/ad-futura-scholarship-slovenia-2026/"/>
</url>
<url>
<loc>https://msosorg.com/mk/blog/ad-futura-scholarship-slovenia-2026/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/ad-futura-scholarship-slovenia-2026/"/>
</url>
<url>
<loc>https://msosorg.com/si/blog/ad-futura-scholarship-slovenia-2026/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/ad-futura-scholarship-slovenia-2026/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/ad-futura-scholarship-slovenia-2026/"/>
</url>
<url>
<loc>https://msosorg.com/en/blog/how-i-coped-with-leaving-home/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/how-i-coped-with-leaving-home/"/>
</url>
<url>
<loc>https://msosorg.com/mk/blog/how-i-coped-with-leaving-home/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/how-i-coped-with-leaving-home/"/>
</url>
<url>
<loc>https://msosorg.com/si/blog/how-i-coped-with-leaving-home/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/how-i-coped-with-leaving-home/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/how-i-coped-with-leaving-home/"/>
</url>
<url>
<loc>https://msosorg.com/en/blog/how-to-open-slovenian-bank-account/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/how-to-open-slovenian-bank-account/"/>
@@ -148,6 +190,48 @@
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/study-in-north-macedonia-government-scholarship-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/study-in-north-macedonia-government-scholarship-2026-2027/"/>
</url>
<url>
<loc>https://msosorg.com/en/blog/welcome-days-slovenian-universities-2026-2027/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/welcome-days-slovenian-universities-2026-2027/"/>
</url>
<url>
<loc>https://msosorg.com/mk/blog/welcome-days-slovenian-universities-2026-2027/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/welcome-days-slovenian-universities-2026-2027/"/>
</url>
<url>
<loc>https://msosorg.com/si/blog/welcome-days-slovenian-universities-2026-2027/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/welcome-days-slovenian-universities-2026-2027/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/welcome-days-slovenian-universities-2026-2027/"/>
</url>
<url>
<loc>https://msosorg.com/en/blog/where-to-search-for-accommodation-in-slovenia/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/where-to-search-for-accommodation-in-slovenia/"/>
</url>
<url>
<loc>https://msosorg.com/mk/blog/where-to-search-for-accommodation-in-slovenia/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/where-to-search-for-accommodation-in-slovenia/"/>
</url>
<url>
<loc>https://msosorg.com/si/blog/where-to-search-for-accommodation-in-slovenia/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="mk" href="https://msosorg.com/mk/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="sl" href="https://msosorg.com/si/blog/where-to-search-for-accommodation-in-slovenia/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://msosorg.com/en/blog/where-to-search-for-accommodation-in-slovenia/"/>
</url>
<url>
<loc>https://msosorg.com/en/cookie-policy/</loc>
<xhtml:link rel="alternate" hreflang="en" href="https://msosorg.com/en/cookie-policy/"/>