type: decision
status: active
timestamp: 2026-06-22
tags: [decision, FINAL, shared, divergent, per-app, scrap, chrome, visual, behavior]

FINAL: Every visual surface per-app; only behavior/utility packages stay shared

Resolves shared-vs-divergent design sequence chrome. FINAL POLICY: every VISUAL surface (Header / Footer / Sidebar / BottomBar / Wordmark / token CSS variable NAMES) is FULLY per-app. NOTHING visual shipped from packages. Only behavioral / utility / non-visual packages stay shared (auth-core, astro-billing, oriz-seo, oriz-analytics, oriz-consent, oriz-ai-providers, oriz-rate-limit, astro-data, astro-pwa, astro-content, astro-forms, astro-distribute, astro-test-utils, omni-publish, oriz-book-build, oriz-ui ContactForm). Legal pages per-app (no shared LegalFooter). Every footer includes 6 standard legal links (/privacy /terms /contact /about /refunds /disclaimer) with per-app visual treatment. Triple-supersedes the on-again/off-again shared-chrome reversals from earlier same-day.

FINAL per-app visual, shared behavior

Resolution

After multiple same-day reversals on shared-vs-divergent chrome (sweeps #3, #4, #5 + 6+ knowledge supersessions), user locked the FINAL policy 2026-06-22 evening:

“Everything should be unique according to the [design]. Only combine them if there are really so everything is same into the everything. According to the design brief everything is same. If it is really same everything is same then only make a fully combined component. But I think that they are completely different for all of the apps or even if they are same, they are very less same.”

Translation: NOTHING visual is shipped from a shared package. Each app draws everything fresh per its design brief. Shared packages are utility/behavior only.

What’s SHARED (via npm packages, every app imports)

PackagePurposeWhy shared
@chirag127/auth-core (+ auth-wxt, auth-vsc, auth-cli)Firebase Auth config + sign-in flowCross-app SSO REQUIRES identical token handling
@chirag127/astro-billingPricing page component + Razorpay/Paddle integrationSingle payment ledger; same prices everywhere
@chirag127/oriz-seositemap + IndexNow + JSON-LD + OG image genSame SEO semantics across family
@chirag127/oriz-analyticsCF Web Analytics + GA4 + Clarity + Sentry wrapperOne init call per app
@chirag127/oriz-consentKlaro consent banner (EU + India DPDP + US GPC)Approval-gate uniformity
@chirag127/oriz-ai-providers20-provider LLM fallback chainSingle calling convention
@chirag127/oriz-rate-limitFree/Pro/Max tier usage capsSame caps everywhere
@chirag127/astro-dataFirebase + Firestore client + TanStack QuerySame data shape
@chirag127/astro-pwaPWA manifest + service worker helperSame offline pattern
@chirag127/astro-contentRSS / Atom / JSON Feed helpersSame feed semantics
@chirag127/astro-formsRHF + Zod + Web3Forms wrapperSame form validation
@chirag127/astro-distributePWABuilder CLI wrapperSame native distribution
@chirag127/astro-test-utilsVitest + MSW + Playwright fixturesSame testing surface
@chirag127/omni-publishCross-post engineSame release fan-out
@chirag127/oriz-book-buildPandoc wrapperSame book pipeline
@chirag127/oriz-ui<ContactForm /> stub componentSingle contact form

What’s PER-APP (zero sharing)

SurfaceEach app owns its…
Headerown src/components/Header.astro (or .tsx)
Footerown src/components/Footer.astro with 6 legal links inline
Sidebarown src/components/Sidebar.astro (or omit if app doesn’t need one)
BottomBarown src/components/BottomBar.astro (or omit if not mobile-heavy)
Wordmarkown src/components/Wordmark.astro
Layout wrapperown src/layouts/BaseLayout.astro
CSS tokensown src/styles/tokens.css (NAMES can differ — --paper here / --bg there)
Color paletteown
Type stackown
Hero compositionown
Signature elementown
Motion languageown
/privacy /terms /contact /about /refunds /disclaimer pagesown src/pages/<page>.astro with app-specific copy

Every app’s footer MUST include links to the 6 standard legal routes:

Each app’s footer designs these 6 links however fits its brief. The 6 routes themselves are per-app pages.

Packages reduced or deprecated

Migration sweep

Once the 5 in-flight agents land (env-sync + maximalist-footer + home-redesign + blog-layout + 16-tools-build), spawn the SCRAP-AND-MIGRATE agent:

For each of 5 priority apps (home, blog, ncert, janaushdhi, packages-catalog):

  1. Identify every import from @chirag127/astro-chrome for visual components
  2. Inline the equivalent into the app’s src/components/
  3. Customize per its design brief
  4. Remove the @chirag127/astro-chrome import (or downgrade to ContactForm-only)
  5. Move shared astro-shell/tokens.css into the app’s own src/styles/tokens.css
  6. Same migration for the 16 tools apps (once their v0 lands)

Total LOC migrated: roughly equal to the 4,000 LOC dedup’d in earlier sweeps. Per Rule 12 (=50 LOC threshold), grill BEFORE migrating — this decision file IS that grill.

Why this final shape

The shared-package experiment failed three times because the apps are genuinely different products, not skins of one product. Trying to share visual code FORCED the apps to look the same OR forced complex slot APIs that became LARGER than per-app code. Per the frontend-design Rule 13: each app needs its own distinctive identity — the brief calls for differentiation.

Shared utility/behavior packages remain because they encode TRUE family contracts (one Firebase project, one pricing model, one analytics stack, one AI fallback ladder). Those contracts don’t fight the visual brief.

Supersedes

This decision SUPERSEDES (entirely or in critical part):

Cross-refs


Edit on GitHub · Back to index