Skip to content
← Back to Blog
· Kersten Lorenz

The renaissance of Angular

I was building single-page applications with jQuery before anyone called them that.

Then I moved into enterprise — Flex frontends backed by Java EE. Declarative component templates in MXML, Spicefactory’s Parsley for dependency injection and messaging, a proper IoC container in a world that did not know it needed one. I loved that stack. MXML’s declarative approach to UI felt right in a way that imperative DOM manipulation never did.

Then Flash died.

And AngularJS was the only thing in the browser that felt remotely familiar — components, DI, two-way binding, templates as a declarative layer over behaviour. Version 1, $scope, the whole messy, magical thing.

Angular logo

jQuery taught me what SPAs could be. MXML taught me what they should be. Angular was the first browser framework that agreed.

I watched the rewrite to Angular 2 split the community in half. I stuck with it through the years when every conference talk started with “why we migrated to React” and every Hacker News thread asked whether Angular was dead.

For a while, the question was fair. Angular had become the framework you chose because your enterprise already chose it — not because you wanted to. Heavy developer experience. Steep learning curve. Talent bleeding to leaner alternatives. I kept building with it because it solved real problems at scale — and because in the German enterprise market, Angular was everywhere. Banks, insurers, automotive suppliers. Walking away from it meant walking away from most of the projects on my desk.

But I stopped recommending it with enthusiasm.

That has changed. Not because of marketing or a new logo. Because the Angular team systematically removed every legitimate complaint.

What went wrong

The criticisms were earned.

NgModules added ceremony to every component. RxJS was threaded through everything, including places where a simple function call would have sufficed — developers spent hours wrestling with Observables for HTTP requests they could have written as Promises. Constructor injection was verbose. Zone.js intercepted every async operation to trigger change detection, which was clever engineering and terrible debugging.

The bundle sizes reflected all of this weight.

Meanwhile, React offered a simpler mental model. Vue offered a gentler learning curve. Svelte compiled away the framework entirely.

Angular felt like the tool you tolerated, not the one you chose.

What changed

Starting with version 14 and accelerating through versions 17 to 21, Angular shed its worst qualities without losing its best ones.

Signals replaced the RxJS-for-everything pattern. A signal() is a reactive wrapper around a value — fine-grained, synchronous, composable with computed() and effect(). By version 19, signal-based inputs, outputs, and view queries reached stable. Version 21 introduced experimental Signal Forms, combining the simplicity of template-driven forms with the power of reactive ones. RxJS is still there for the cases where streams genuinely make sense. It is no longer forced on everything else.

Standalone components eliminated NgModules. Introduced in version 14, default by version 19, and adopted by 90% of Angular developers within two years. A component declares its own imports. No module ceremony. No boilerplate obituary.

New control flow@if, @for, @switch — replaced the structural directive syntax that made Angular templates look like a different language. @defer blocks enabled lazy-loading of template sections with triggers like on viewport or on interaction, laying the groundwork for incremental hydration.

Zoneless change detection removed Zone.js entirely. Experimental in version 18, stable in version 20, default in version 21. The single biggest source of Angular’s “magic behaviour” debugging frustration — gone.

esbuild and Vite replaced webpack as the default build system. Faster builds, faster rebuilds, fewer dependencies, a dev server that does not make you question your career choices.

Vitest replaced Karma and Jasmine as the default test runner in version 21. Faster execution, native ESM support, and a watch mode that actually works. Angular’s testing story went from “tolerable if you squint” to genuinely pleasant.

Angular 21 ships with signals, standalone by default, zoneless by default, Vite-based builds, and Signal Forms. It is a different framework from the one people left in 2019.

The framework AI agents actually want

Here is where the story connects to something larger than developer ergonomics.

When an AI agent generates frontend code, it faces a problem that has nothing to do with model quality: it has to decide how to build, not just what to build. In the React ecosystem, that means choosing between Zustand, Jotai, Redux, or MobX for state management. React Router or TanStack Router. Formik or React Hook Form. Each combination creates different patterns, different imports, different conventions. The industry response has been AGENTS.md files — explicit documents telling AI agents which libraries to use and which patterns to follow.

Angular does not need an AGENTS.md for library selection. Routing, forms, HTTP, dependency injection, internationalization — all built in, all canonical. An agent generating Angular code follows one set of conventions, not a project-specific combination of third-party opinions. The surface area for mistakes shrinks. The generated code looks like every other Angular project, which is exactly what you want in a large codebase.

AGENTS.md is the React ecosystem retrofitting the opinionated guidance that Angular provides out of the box.

The Angular team understood this early. angular.dev/ai ships curated LLM prompts, system instructions for AI IDEs, and an llms-full.txt file describing the framework for LLM consumption. The Angular CLI MCP server — stable since version 21 — gives AI assistants direct access to Angular tooling: documentation search, code generation with current best practices, workspace-aware schematics. Google’s Web Codegen Scorer, built by the Angular team, evaluates AI-generated code for build success, accessibility, security, and best practices.

This is not an afterthought bolted on. It is a strategic bet that the next generation of developers will write code with agents, and that the framework best positioned for that future is the one where conventions are built in rather than documented in a side file.

TypeScript became the #1 language on GitHub in 2025. Angular has been TypeScript-first since 2016. That nine-year head start is now a structural advantage for AI-assisted development.

A 2025 study from ETH Zurich and UC Berkeley found that 94% of LLM-generated compilation errors are type-check failures. Strong types catch almost exactly the class of errors AI introduces. Angular’s strict TypeScript is not just a developer preference — it is a safety net for every line an agent writes.

Earned, not announced

Angular’s v17 launch came with a new logo and a new documentation site. The team called it a renaissance. But the renaissance was not the rebrand. The rebrand was the acknowledgment that the hard work was already done — that signals, standalone components, and zoneless change detection had fundamentally changed what Angular felt like to use.

I build complex applications with Angular again, not out of legacy obligation but because it is the right tool. The framework that was too heavy became the framework that is precisely heavy enough — opinionated where opinions save time, flexible where rigidity would hurt, and increasingly optimised for a future where humans and agents write code side by side.

The people who left Angular in 2019 left a different framework. The one that exists today deserves a second look.


Building modern Angular applications with AI-assisted workflows? Let’s talk.