GitLab

Angular Migration Demo

Watch GitLab Duo Chat migrate an entire Angular app across 5 major versions, from analysis to merge request, in a single conversation.

Angular 15 Angular 20

💬 Two Prompts. Five Major Versions.

🔎

Prompt 1: Analyze & Plan

You: Analyze the project and plan a migration to Angular 20, create a migration plan issue

Duo Chat reads every file, inventories 11 components, 3 services, 13 Material modules, and creates a GitLab Issue with 6 phases and ~80 checkboxes.

⚙️

Prompt 2: Execute

You: Implement the migration plan, commit and verification in each phase

Duo Chat runs ng update, refactors code, migrates templates, switches builders, verifies builds, commits each phase, pushes, and creates a merge request.

📅 Migration Timeline

Phase 1: Angular 16

  • Updated core, CLI, Material, CDK to v16
  • TypeScript 4.9 ➔ 5.1, zone.js 0.12 ➔ 0.13
  • Removed deprecated useDefineForClassFields
✅ 901 KB

Phase 2: Angular 17

  • Converted all 11 components to standalone
  • Removed AppModule and AppRoutingModule
  • Migrated templates: *ngIf@if, *ngFor@for
  • Switched to esbuild application builder
  • Updated styleUrlsstyleUrl
✅ 873 KB

Phase 3: Angular 18

  • Replaced constructor DI with inject() in all components
  • Converted NavbarComponent to signals (toSignal())
  • Removed AsyncPipe dependency
✅ 864 KB

Phase 4: Angular 19

  • Enabled zoneless change detection
  • Removed zone.js from dependencies and polyfills
  • Removed Karma, Jasmine, and test runner devDependencies
  • Switched to Material 3 theme (azure-blue)
✅ 849 KB

Phase 5: Angular 20

  • Updated to Angular 20, TypeScript 5.8, Node.js 22
  • Stable provideZonelessChangeDetection()
  • Removed experimentalDecorators, downlevelIteration
  • Updated moduleResolution to bundler
✅ 851 KB

📈 Bundle Size Reduction

Angular 15
909 KB
Angular 16
901 KB
Angular 17
873 KB
Angular 18
864 KB
Angular 19
849 KB
Angular 20
851 KB

🔄 Before vs After

CategoryAngular 15Angular 20
BootstrappingplatformBrowserDynamic().bootstrapModule()bootstrapApplication()
Components@NgModule({ declarations })Standalone (default)
Templates*ngIf, *ngFor@if, @for
Dependency Injectionconstructor(private svc: Service)inject(Service)
ReactivityBehaviorSubject + async pipesignal() + toSignal()
Change DetectionZone.jsZoneless
Build SystemWebpack (browser builder)esbuild (application builder)
ThemeMaterial 2 (indigo-pink)Material 3 (azure-blue)
Node.js18.x22.x
TypeScript4.95.8

💡 Key Takeaways

🧠

Context-Aware

Duo Chat reads and understands every file in the project before making any changes. It knows the component structure, DI patterns, and template syntax.

🛠️

Error Recovery

When styleUrl (singular) failed on Angular 16, Duo Chat detected the build error, understood it was a v17 feature, and reverted the change automatically.

Verified at Every Step

Each phase runs ng build to verify the migration succeeded before committing. No broken intermediate states.

🚀

End-to-End Automation

From project analysis to GitLab Issue creation, code migration, git commits, branch push, and merge request creation, all in one conversation.

👉 Explore the Results

See the actual GitLab artifacts produced by this demo.

📋 Migration Plan Issue 📦 Merge Request