Angular 20 to 22 Migration: Why We Stopped Going Incremental
The OctoPerf web application is a large Angular workspace: 7,786
TypeScript files, around 381,000 lines of code, 1,166 components and 2,738 test files. We have
just taken it from Angular 20 to Angular 22, deleted zone.js, and replaced Karma and Jasmine with
Vitest.
The interesting part of this story is not the version number. It is that we got the strategy wrong first. We spent months migrating the codebase component by component, drowned in manual regression testing, and still let bugs reach production. What unblocked us was not a better migration technique. It was realising that our bottleneck was validation, not transformation, and building an automated safety net before touching the framework again.
So this post is the thought process rather than the changelog, with the numbers we measured rather than the ones we hoped for. It ends on a question we cannot dodge: this migration would not have happened in this timeframe without an LLM. So are we now dependent on one?


