SEO — three pillars: sitemap + IndexNow + JSON-LD
SEO — three pillars: sitemap + IndexNow + JSON-LD
Decision
Every chirag127/oriz family site ships all three SEO pillars, not a subset:
- Sitemap —
@astrojs/sitemapgeneratessitemap-index.xml+sitemap-0.xmlatastro buildtime. Submitted once per property to Google Search Console and Bing Webmaster Tools. - IndexNow —
/og-style POST hook fromoriz-omnipostfires the instant a new URL is published / edited / deleted. Notifies Bing- Yandex + Seznam + Naver in milliseconds.
- JSON-LD structured data —
<JsonLd type="..." data={{...}} />component in (forward reference — lands in oriz-kit's next release) emits schema.org markup forArticle,BreadcrumbList,Organization,WebSite, andPerson.
Submitted into both consoles — Google Search Console
- Bing Webmaster Tools — which together cover Google + Bing + DuckDuckGo + Yandex.
Why
Each pillar fixes a different failure mode; doing fewer than all three leaves a known gap.
- Without a sitemap, deep pages hide behind crawl-graph hops and can sit unindexed for weeks.
- Without IndexNow, new URLs wait for the next crawl (hours-days on Bing, days on Google) before they're discoverable through search.
- Without JSON-LD, pages don't qualify for rich-result UIs (article cards, breadcrumb chips, sitelink search box, knowledge-panel author boxes) and AI crawlers can't reliably identify what a page is.
All three pillars are free, no-card, and stack-cohesive with the family's existing setup:
@astrojs/sitemapis a one-line addition to every site'sastro.config.mjs.- IndexNow is a single POST inside
oriz-omnipost's existing publish-hook loop. <JsonLd>lives in oriz-kit, so a schema fix lands family-wide in one kit version bump.
Implications
- Per-site sitemap config:
astro.config.mjsdeclaressite:(canonical URL) + the sitemap integration. Thepages-mirror.ymlbuild mirrors thedist/output to GitHub Pages so the static-fallback mirror also has a sitemap. - Per-site IndexNow key: generated once, stored in
Doppler as
INDEXNOW_KEY_<sitename>, mirrored to GitHub Secrets + Cloudflare Worker secrets. The site hosts<key>.txtat the apex. oriz-omnipostadds anIndexNowAdapter: alongside the existing dev.to / hashnode / short-link adapters. Idempotent on RSS<guid>perdecisions/architecture/cross-post-engine.md.<JsonLd>ships in oriz-kit's next release as a forward reference. Today, the component does not exist; the decision locks the contract so the kit PR is small and the sites can adopt without a contract negotiation.- Five schema types are the family-wide canon:
Article,BreadcrumbList,Organization,WebSite,Person. Any additional types (e.g.Bookfororiz-books,SoftwareApplicationfor extensions) get added per site as one-off JSON-LD blocks using the same<JsonLd>component with customtype=. - Both consoles verified at the apex
oriz.inDomain property — one DNS TXT record covers every subdomain via Cloudflare DNS. - No card anywhere across the five layers. All five fit the no-card-on-file rule and the no-paid-tier rule.
Cross-refs
- services/monitoring/monitoring/seo/astrojs-sitemap.md
- services/monitoring/monitoring/seo/indexnow.md
- services/monitoring/monitoring/seo/json-ld-structured-data.md
- services/monitoring/monitoring/seo/google-search-console.md
- services/monitoring/monitoring/seo/bing-webmaster.md
- services/monitoring/monitoring/seo/index.md — bucket overview
- decisions/architecture/cross-post-engine.md — oriz-omnipost fires IndexNow
- — `
` component (forward reference) - No card-on-file rule