status: active
timestamp: 2026-06-22
tags: [decision, legal, package, approval, adsense, play-store]
Legal pages package: @chirag127/astro-chrome/legal/* mounted in-domain per app
8+ legal pages in domain package /sitemap /security.txt) shipped as Astro page components in `@chirag127/astro-chrome/legal/`. Every app mounts them at its own domain (not external legal.oriz.in) so AdSense + Play Store + MS Store + Razorpay approval gates are satisfied. Single source of legal text; same content everywhere; design adapts to each app's theme.
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
- One canonical text in the package (single source of truth)
- Theme adapts to each app’s CSS variables (privacy page on paisa-finance uses paisa’s palette, etc.)
- Per-app variables: app name, app domain, contact email, jurisdiction
- Last-updated date auto-stamped from git commit time of the package
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
- Shared-vs-divergent matrix ? [[decisions/ops/shared-vs-divergent-matrix]]
- Single pricing page ? [[decisions/packages/single-pricing-page-package]]
- Per-app distinctive design ? [[rules/per-app-distinctive-frontend-design]]