An independent tool for Angular developers, one component at a time
Angular ClinicSee what modern Angular would change in your component - then have it rewritten and re-checked.
Paste a component's TypeScript and its template. Free in your browser: every legacy API and real defect, with the line, the fix and the official schematic - *ngIf to @if, @Input to input(), constructor injection to inject(), an effect() that copies state, a @for without track - gated by your Angular version. A run writes the review, or rewrites the component; the page then re-scans the rewrite and checks your selector, inputs and outputs survived.
1 Your component free
2 The scan free
Against the rules of Angular's own skill, for the version above. Nothing leaves your browser for this part.
API areas
Findings
Schematics, in Angular's order
3 The review or the rewrite metered
The reply, as it came
Findings
The scan's calls
Migration order
Already right
Caveats
Changes
Kept on purpose
Diff
The rewritten files
Schematics
Update elsewhere
Caveats
Checked against the scan
Saved components
How it works
The scan reads the TypeScript and the template - inline or separate - with comments ignored, and applies the rules of the @angular/angular-developer skill from the Angular repository: built-in control flow with a required track, signal inputs, outputs and queries, inject(), the host property instead of @HostBinding, standalone components, computed or linkedSignal instead of an effect() that copies state, cleaned-up subscriptions, Signal Forms for new forms on v22, and the server-rendering and sanitizer hazards. A rule whose API your version lacks says "upgrade first" instead of a fix.
The review and the rewrite are written by a language model from your code and the scan's facts. The page holds the reply to the scan: every error and warning must be answered by its rule id, a schematic that does not exist is flagged, and a rewrite is re-scanned here - patterns still present are named, and a selector, input or output that disappeared is called out because it would break every parent. Nothing is compiled or run; check with ng build and your specs.
Long files: the scan covers the whole file; a run sends the head and the tail and says how many lines in the middle were left out.