
Angular 22.1 introduces a major change to Angular’s release cycle, moving to one major release per year. Learn what this means for Angular upgrades, versioning, and the future of the framework.
Alain Chautard
August 18, 2026
Angular 22.1 landed on July 29th, 2026, and it’s a minor release. But it comes with an announcement that changes how all of us plan our upgrades: **Angular is switching to one major release per year.
Since Angular 4, we’ve had a major release every six months. That’s over, and here’s what it means concretely:
I’ve been teaching Angular upgrades for years now, and this is the change teams have been asking for.
The next release is v22.2, expected in September 2026.
Angular 22 introduced the new @Service() decorator, and the CLI has been generating services with it ever since. What was missing was a way to migrate the services already in your codebase. Angular v22.1 adds that schematic:
ng generate @angular/core:service
It converts this:
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class UserService {
// ...
}
Into this:
import { Service } from '@angular/core';
@Service()
export class UserService {
// ...
}
A bare @Injectable() becomes @Service().
The migration is conservative. It skips services that use constructor-based dependency injection, services passing options other than providedIn, and anything where providedIn isn't 'root'. Run it with the --dry-run option first to get an idea of how many files will get updated.
linkedSignal is what you reach for when you want a signal derived from another signal that you can also write to — something computed can't do:
readonly items = signal<Array<ItemModel>>([]);
protected readonly selectedItem = linkedSignal(() => this.items()[0]);
In v22.1, you can pass a custom set function to control what happens when you write to it:
protected readonly selectedItem = linkedSignal(() => this.items()[0], {
set: (item: ItemModel) => {
const items = this.items();
if (items.indexOf(item) < 0) {
this.items.set([item, ...items]);
}
}
});
Effects automatically track the signals they read, and that tracking used to extend into your HTTP interceptors. So an effect that triggered an HTTP request was silently depending on any signal your interceptors happened to read — an auth token signal, a locale signal, anything.
As of v22.1, interceptors run untracked. Your effects will now re-run only for the reasons you truly expect.
effect(() => {
const value = this.mySignal();
untracked(() => {
// do something with value
});
});
Devtools improvements Two small improvements in Angular DevTools:

Of course, and it should be painless if you’re already on Angular v22: ng update @angular/core @angular/cli
Ready to prove your Angular skills?
Get certified in AngularKeep learning Angular. Then get certified when you are ready.

Building Reusable Validators in Angular Signal Forms
Learn how to create reusable custom validators with Angular Signal Forms, with practical examples for building flexible and maintainable form validation.
Alain Chautard
Sep 29, 2026

How to create nested routes with Angular?
Learn how Angular nested routes and child routes work with multiple router outlets, and see how to use them to build navigable sections such as tabbed dashboards.
Alain Chautard
Sep 15, 2026

How to Add Async HTTP Validators to Angular Signal Forms
Learn how to implement asynchronous validation in Angular Signal Forms using validateHttp(). This guide shows how to validate user input with APIs for uniqueness checks, server-side rules, and other HTTP-based validation scenarios.
Alain Chautard
Jul 14, 2026