Delivering change
Turning boundaries into build speed
Affected graphs and computation caching turn package architecture into fast, reliable CI feedback.
Decoupled packages keep code understandable, but their real payoff is speed. Once our repository has an explicit dependency graph, our build tools can calculate exactly what changed—and skip everything else.
Run only what was touched
In a monolithic codebase without boundaries, every pull request pays the same tax: a change to a button label triggers the entire test suite, runs all linters, and rebuilds the whole application. As the project grows, CI times climb from five minutes to forty, and pull requests stack up in review queues.
Whether we work in a monorepo using tools like Nx and Turborepo, or coordinate across repositories with tools like Meta and Renovate, task runners calculate what to execute by tracing dependencies upward from modified code:
- Editing an isolated feature: Only that feature's tests and build tasks run. Sibling features, design system packages, and unrelated end-to-end suites are bypassed completely. A flaky test in an unrelated area can never block a merge.
- Editing shared UI infrastructure: The runner verifies the shared library and only the downstream packages that import it, ensuring regressions don't slip into consumers.
CI stops being an all-or-nothing bottleneck. The test surface scales with the scope of the change, not the size of the repository.
Computation caching eliminates repeat work
Affected execution skips untouched projects; computation caching skips repeated tasks.
Modern task runners hash the inputs for every task: source files, package dependencies, toolchain versions, and environment variables. If a task's inputs match an existing record in the cache, the runner replays the stored terminal output and artifact files in milliseconds instead of running the process again.
When we share this cache remotely across the team, the benefits compound:
- CI runs once for everyone: When CI verifies a commit on
main, every developer's local machine gets immediate cache hits for those builds and tests. - Pulling latest is instant: We can pull
mainand immediately start working without waiting for local rebuilds.
The architectural payoff
Frontend architecture often gets dismissed as theoretical polish or unnecessary indirection.
Ports, adapters, domain boundaries, and isolated packages do require discipline to set up. But this is where that investment pays off. They transform a codebase from a tangled monolith where every change is risky and slow into a system where changes are isolated, builds are fast, and delivery speed remains high as the team grows.