Skip to content

Asset Management Strategy

Date: October 11, 2025
Status: βœ… Implemented
Related: Component Architecture

This document defines where assets (images, icons, fonts) should live in the monorepo and when to use each location.


1. packages/assets/ ← Monorepo-wide generic assets
2. apps/{division}/{brand}/shared/assets/ ← Brand-specific assets

Is this asset used by ALL divisions?
β”‚
β”œβ”€ YES ──→ Is it generic (not brand-specific)?
β”‚ β”‚
β”‚ β”œβ”€ YES ──→ packages/assets/
β”‚ β”‚ Examples: arrow icons, generic UI icons, CloudAlt logo
β”‚ β”‚
β”‚ └─ NO ──→ apps/{division}/{brand}/shared/assets/
β”‚ Each brand has their own version
β”‚
└─ NO ──→ apps/{division}/{brand}/shared/assets/
Brand-specific content

packages/assets/
β”œβ”€β”€ icons/
β”‚ β”œβ”€β”€ arrows/ # Navigation arrows
β”‚ β”œβ”€β”€ actions/ # Action icons (plus, trash, edit)
β”‚ β”œβ”€β”€ navigation/ # Nav icons (home, menu)
β”‚ └── social/ # Social media icons
β”œβ”€β”€ illustrations/ # Generic illustrations
└── brand/
└── logo/ # CloudAlt company logo
  • βœ… Asset is used across ALL divisions
  • βœ… Generic UI elements (not brand-specific)
  • βœ… Small file sizes (< 50KB ideally)
  • βœ… Company-wide branding (CloudAlt logo)
  • Generic arrow icons
  • Common action icons (plus, edit, delete)
  • Empty state illustrations
  • CloudAlt company logo

Assets here are bundled with every app. Keep this minimal!

// Web
import ArrowRight from '@cloudalt-frontend/assets/icons/arrows/arrow-right.svg';
// Mobile
import ArrowRight from '@cloudalt-frontend/assets/icons/arrows/arrow-right.svg';
import { SvgXml } from 'react-native-svg';

🎨 Brand-Specific Assets (apps/.../shared/assets/)

Section titled β€œπŸŽ¨ Brand-Specific Assets (apps/.../shared/assets/)”
apps/stay_match/pinkguest/
└── shared/
└── assets/
β”œβ”€β”€ images/
β”‚ β”œβ”€β”€ hero-background.png
β”‚ β”œβ”€β”€ hero-background@2x.png
β”‚ β”œβ”€β”€ logo.png
β”‚ └── feature-*.png
└── fonts/
└── CustomFont.woff2
apps/stay_match/orangeguest/
└── shared/
└── assets/
β”œβ”€β”€ images/
β”‚ β”œβ”€β”€ hero-background.png # Different from pinkguest!
β”‚ └── logo.png
└── fonts/
  • βœ… Asset is unique to this brand
  • βœ… Shared between brand’s web and mobile apps
  • βœ… Brand identity assets (logos, hero images)
  • βœ… Any size (only bundled with this brand)
  • Hero background images
  • Brand-specific logos
  • Feature screenshots
  • Brand photos
  • Custom fonts
  • Only bundled with specific brand
  • Independent updates per brand
  • Clear ownership
  • Better performance
// Web
import heroImage from '../../shared/assets/images/hero-background.png';
// Mobile
const heroImage = require('../../shared/assets/images/hero-background.png');

Asset TypeLocationReason
Generic arrow iconpackages/assets/icons/arrows/Used everywhere
Generic edit iconpackages/assets/icons/actions/Used everywhere
CloudAlt company logopackages/assets/brand/logo/Company-wide
Empty state illustrationpackages/assets/illustrations/Used everywhere
Pinkguest hero imageapps/stay_match/pinkguest/shared/assets/images/hero/Brand-specific
Pinkguest logoapps/stay_match/pinkguest/shared/assets/images/logos/Brand-specific
Feature screenshotapps/{division}/{brand}/shared/assets/images/features/Brand-specific
Onboarding tutorialapps/{division}/{brand}/shared/assets/images/onboarding/Brand-specific
Default avatarapps/{division}/{brand}/shared/assets/images/avatars/Brand-specific
Custom brand fontapps/{division}/{brand}/shared/assets/fonts/Brand-specific

All brand-specific images are organized into folders by function within apps/{division}/{brand}/shared/assets/images/. This structure makes it easy to find images, manage them by category, and maintain consistency across teams.

apps/{division}/{brand}/shared/assets/images/
β”œβ”€β”€ hero/ # Hero/banner images for landing pages
β”œβ”€β”€ logos/ # Brand logos and wordmarks
β”œβ”€β”€ features/ # Feature showcase images
β”œβ”€β”€ onboarding/ # Tutorial and onboarding flow images
β”œβ”€β”€ avatars/ # Default avatars and placeholders
└── misc/ # Other brand-specific images
  • Target size: < 300KB
  • Max size: 500KB
  • Format: WebP for web, PNG/JPG for mobile
  • Naming: hero-background.png, hero-background@2x.png
  • Usage: Landing pages, section headers, marketing material
  • Responsive: Provide @2x, @3x variants for mobile
  • Target size: < 25KB
  • Max size: 50KB
  • Format: PNG with transparency or SVG (preferred)
  • Provide sizes: logo.png, logo@2x.png, logo@3x.png
  • Examples: logo.png, logo-white.png, logo-icon.png
  • Target size: < 100KB
  • Max size: 200KB
  • Format: WebP for web, PNG/JPG for mobile
  • Optimization: Always compress before adding
  • Examples: feature-search.png, feature-messaging.png
  • Tip: Consider lazy loading for below-the-fold images
  • Target size: < 100KB each
  • Format: WebP for web, PNG/JPG for mobile
  • Naming: Use sequential numbering for multi-step flows
  • Examples: onboarding-step-1.png, welcome.png
  • Target size: < 50KB each
  • Dimensions: Consistent sizes (e.g., 200x200)
  • Examples: default-avatar.png, placeholder-user.png
  • Images that don’t fit other categories
  • Use descriptive names
  • Viewbox: 24Γ—24 or 16Γ—16
  • Color: Use currentColor for fill/stroke
  • Optimization: Run through SVGO
  • Size: < 5KB each
  • Naming: kebab-case (arrow-right.svg)
  • Format: WOFF2 for web, TTF for mobile
  • Size: < 100KB per weight
  • Licensing: Ensure proper licensing
  • Recommendation: Use system fonts when possible

❌ packages/assets/images/pinkguest-hero.png
❌ packages/assets/images/orangeguest-hero.png
Problem: All brands bundle all images!
βœ… apps/stay_match/pinkguest/shared/assets/images/hero-background.png
βœ… apps/stay_match/orangeguest/shared/assets/images/hero-background.png
Benefit: Each brand only bundles its own images
❌ apps/stay_match/pinkguest/shared/assets/icons/arrow-right.svg
Problem: Duplicated across all brands!
βœ… packages/assets/icons/arrows/arrow-right.svg
Benefit: Single source of truth, shared by all

monorepo/
β”œβ”€β”€ packages/
β”‚ └── assets/ # Monorepo-wide
β”‚ β”œβ”€β”€ icons/
β”‚ β”‚ β”œβ”€β”€ arrows/
β”‚ β”‚ β”œβ”€β”€ actions/
β”‚ β”‚ β”œβ”€β”€ navigation/
β”‚ β”‚ └── social/
β”‚ β”œβ”€β”€ illustrations/
β”‚ └── brand/
β”‚ └── logo/
β”‚
└── apps/
└── {division}/
└── {brand}/
β”œβ”€β”€ web/
β”‚ └── src/ # Uses shared assets
β”œβ”€β”€ mobile/
β”‚ └── src/ # Uses shared assets
└── shared/ # Brand-specific
β”œβ”€β”€ assets/
β”‚ β”œβ”€β”€ images/
β”‚ └── fonts/
β”œβ”€β”€ constants/
β”‚ └── content.ts
└── config/
└── theme.ts

  1. Determine if truly generic (used by ALL divisions)
  2. Choose appropriate category (icons/illustrations/brand)
  3. Optimize asset (compress, remove metadata)
  4. Add to packages/assets/{category}/
  5. Update category README with asset details
  6. Import and use in any app
  1. Determine brand owner
  2. Optimize asset (compress, appropriate format)
  3. Add to apps/{division}/{brand}/shared/assets/{type}/
  4. Use relative imports in brand’s web/mobile apps
  5. Document in brand’s assets README


  1. Assets are brand-specific β†’ each app has its own shared/assets/ folder

Last Updated: October 11, 2025
Maintained By: Engineering Team