{
  "id": 8004382,
  "title": "Reduce Expo Monorepo CI Build Time",
  "url": "https://urgent.news/2026/09/17/reduce-expo-monorepo-ci-build-time",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-09-17T10:14:54.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/makeitrun/reduce-expo-monorepo-ci-build-time-2hna"
  },
  "original_language": "en",
  "account": "Expo's monorepo CI builds were suffering from slowness and unreliability. The issue stemmed from treating all caches as a single entity. When builds commenced from the repository's root, issues arose as one app's Metro state or native cache would impact another app's dependency installation. Consequently, a pipeline that appeared swift soon began generating untrustworthy failures. The solution lies in establishing clear boundaries for each layer. EAS commands should be executed from the app directory, not the monorepo's root, ensuring the build employs the correct app configuration and scope. Restoring the pnpm store prior to pnpm install is crucial, as this cache pertains to dependency content, not app behavior. Each app should possess a distinct Metro cache, specified by an explicit cacheVersion, preventing shared transform cache from leaking across apps in the monorepo. Furthermore, EAS cache should be treated as an independent native layer, allowing the restoration and saving of controls selectively, without affecting pnpm or Metro. The key to this approach is understanding that every cache requires both a boundary and an owner. By knowing what defines a cache and who is authorized to write it, pinpointing build failures becomes more straightforward, and cache speedups remain secure. However, this method does necessitate more explicit setup. Keys must be versioned deliberately, and cache state cannot be loosely shared across apps or untrusted CI jobs. For a comprehensive understanding, refer to the complete article available on make-it.run.",
  "summary": "Expo monorepo CI gets slow and flaky for the same reason: we treat all caches as one thing. Then builds run from the repo root, one app reuses another app’s Metro state, or native cache is blamed for a problem in dependency install. The result is a pipeline that looks fast until it starts failing in ways you cannot trust. The fix is to give each layer a clear boundary. Run EAS commands from the…",
  "key_points": [
    "Establish clear boundaries for each cache layer in Expo monorepo CI builds",
    "Execute EAS commands from app directory, not monorepo root",
    "Restore pnpm store and Metro cache per app for independent speedups"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}