← knowledge.oriz.in

Legal pages package: @chirag127/astro-chrome/legal/* mounted in-domain per app

decision decisionlegalpackageapprovaladsenseplay-store

Legal pages package — in-domain mount

Decision

@chirag127/astro-chrome/legal/* exports 8+ Astro page components. Each app mounts them as in-domain routes:

Route Component Why required
/privacy Privacy.astro AdSense + Play Store + MS Store + GDPR + DPDP all require
/terms Terms.astro AdSense + Razorpay + most app stores
/contact Contact.astro (uses <ContactForm /> from oriz-ui) AdSense + Play Store
/about About.astro (slot for app-specific copy) AdSense
/refunds Refunds.astro (7-day money-back policy) Razorpay
/disclaimer Disclaimer.astro (financial/health/educational) AdSense + Play Store
/sitemap-index.xml generated by @chirag127/oriz-seo SEO
/security.txt SecurityTxt.astro (well-known route) Security best practice

Why in-domain (not external legal.oriz.in)

AdSense's policy explicitly checks that privacy/terms links resolve to same-origin URLs during review. External links count for low-risk approval, but in-domain is the universally safe path.

Also: Play Store + MS Store reviewers crawl the privacy URL declared in the manifest; if it points to a different domain than the app, some reviewers flag it for manual review.

Content shape

Mounting pattern in each app

---
// src/pages/privacy.astro
import Privacy from '@chirag127/astro-chrome/legal/Privacy.astro';
import BaseLayout from '~/layouts/BaseLayout.astro';
---
<BaseLayout title="Privacy Policy">
  <Privacy
    appName="Oriz NCERT"
    appDomain="ncert.oriz.in"
    contactEmail="privacy@oriz.in"
    jurisdiction="India"
  />
</BaseLayout>

~12 LOC per legal page per app × 8 pages × 26 apps = ~2,500 LOC of mount boilerplate. Acceptable — single-write per app, then auto-updated as package version bumps.

Initial draft via Termly/iubenda

First-draft legal text generated via Termly free, refined manually, committed to package source. Subsequent updates manual. No iframe embed.

Cross-refs