Modern Angular for teams that already ship.

I help teams modernize mature Angular applications without turning technical evolution into a risky rewrite: Signals and RxJS boundaries, zoneless readiness, rendering strategy, tests, and architecture decisions.

I use these pieces as public notes for the kind of work I do and want to keep deepening: migration scope, review gates, CI confidence, browser-only dependencies, architecture boundaries, and adoption decisions that survive more than one release.

Modern Angular Playbook

Want the condensed map?

The Modern Angular Playbook collects the diagnostic, the adoption matrix, eleven plays, and a 30-day plan. Free, in English and Portuguese.

You get both PDFs by email, through the Dojo IA list.

Open playbook →

For developers

Deep dives on Signals, RxJS, zoneless, SSR, testing, and patterns with code that can survive review.

For tech leads

Decision matrices, review gates, and migration plans for evolving mature Angular codebases without rewrite campaigns.

For CTOs and recruiters

A clear view of my work: frontend modernization with lower risk, clearer architecture, and delivery confidence.

Hiring, or need Angular help?

I'm André Ramos, a Senior Software Engineer available for remote roles (UTC−3). I help teams modernize production Angular without rewrites.

Email →LinkedIn ↗

  • Bradesco Seguros
  • AB-InBev
  • OdontoPrev
  • Bit Health

★ Start here

Angular 22: What Actually Changed, and What to Do in a Production App

A senior, production-first guide to Angular 22: the OnPush default, the stabilized Signal Forms and async-signal APIs, the testing migrations, the smaller default flips that bite on upgrade, and a deliberate plan for adopting it.

11 min · Jun 3, 2026

· 8 articles

Guide · 7 min · May 12, 2026

Signals Without the RxJS War

A production boundary for Signals, computed values, RxJS streams, and interop, with no cosmetic rewrite of architecture that already works.

Read article →

Note · 6 min · May 30, 2026

What to Adopt, Spike, or Wait On in Angular 21

An adoption filter for Angular 21: what belongs in code already changing, what deserves a branch, and what should stay away from critical flows.

Read article →

Note · 5 min · May 20, 2026

A Small Checklist Before Trying Zoneless

A readiness checklist for testing zoneless in an existing Angular app without confusing a compatibility spike with a rollout plan.

Read article →

Guide · 10 min · May 30, 2026

A 30-Day Modernization Plan for Mature Angular Apps

A modernization plan for teams that need audit, low-risk changes, isolated spikes, and decisions that can survive code review.

Read article →

Guide · 7 min · May 15, 2026

Standalone Without Turning NgModules Into a Villain

A practical rule for using standalone components, route providers, and remaining NgModules in mature Angular applications.

Read article →

Guide · 7 min · May 16, 2026

Control Flow Is Not Just Cleaner Syntax

A production review lens for Angular control flow: when to migrate touched templates, how to choose `track`, and where `@switch` helps state modeling.

Read article →

Note · 6 min · May 31, 2026

How I Would Adopt Signal Forms Now That They Are Stable in Angular 22

A production adoption filter for Signal Forms now that they are stable in Angular 22: use them for new forms, keep reactive forms where they already work.

Read article →

Guide · 8 min · Jun 3, 2026

OnPush Is the Default in Angular 22: What Breaks and What to Do

Why Angular 22 makes OnPush the default, what actually breaks, the two ways to fix it, and how the migration's Eager additions double as your cleanup backlog.

Read article →
· 9 articles

Guide · 6 min · May 13, 2026

When to Move an Angular Test Suite to Vitest

Vitest is the Angular CLI default, but migrating an existing suite is still experimental: which specs to pilot first, what fakeAsync breaks, and how to keep CI trustworthy.

Read article →

Guide · 9 min · Jun 1, 2026

fakeAsync and the ProxyZone Error: Fixing Angular Tests Under Vitest

Why fakeAsync, tick, and waitForAsync throw the ProxyZone error under Angular's Vitest runner, and the two fixes: the experimental zone testing patch, or a rewrite to Vitest fake timers.

Read article →

Guide · 7 min · Jun 1, 2026

Karma to Vitest in Angular: The Config That Actually Runs

What the Angular v21 Vitest test target actually is (one line), where polyfills and styles come from, the install that drops Karma, and the few options worth adding.

Read article →

Guide · 7 min · Jun 2, 2026

Vitest Fake Timers in Angular: The Mental Model After fakeAsync

How to think about Vitest fake timers in Angular after fakeAsync: the two jobs fakeAsync fused, the API map, the Angular-specific parts (effects, change detection, RxJS), and when not to use fake timers at all.

Read article →

Guide · 6 min · Jun 2, 2026

Why Your Async Validator Stays PENDING Under Vitest Fake Timers

The silent Vitest timing failure: why an Angular async validator stays PENDING after a fakeAsync migration, why advanceTimersByTime is not enough, and the precise line between a Promise (needs the async advance) and RxJS plus HttpClient (does not).

Read article →

Guide · 8 min · Jun 7, 2026

Component Testing in Angular with Vitest: TestBed, jsdom, and Browser Mode

How Angular component tests actually behave under Vitest: TestBed is unchanged, the DOM is jsdom (no layout, no real CSS), and the specs that need a real browser are the ones to move to Vitest browser mode.

Read article →

Guide · 8 min · Jun 8, 2026

Mocking Services and HttpClient in Angular Vitest: vi.fn, Spies, and DI

The Jasmine-to-Vitest spy map for Angular tests (vi.fn, vi.spyOn, mockReturnValue), why a DI provider mock beats vi.mock for services, and how HttpTestingController still works with provideHttpClientTesting.

Read article →

Guide · 8 min · Jun 8, 2026

Vitest Coverage and CI for Angular: Providers, Thresholds, and the Karma Gap

How coverage and CI work with the Angular Vitest builder: the ng test --coverage flag, coverageThresholds that fail the build, junit reporters for CI, and the one thing the builder does not expose that karma-coverage did.

Read article →

Guide · 7 min · Jun 12, 2026

Choosing an Angular Test Runner in 2026: Vitest, Jest, or Karma

A decision map for the Angular test runner question, by where your suite actually starts, and why 'Cypress vs Vitest' is the wrong question.

Read article →
· 10 articles

Guide · 7 min · May 17, 2026

Angular CLI MCP and AI-Generated Angular Code

A production checklist for using Angular CLI MCP, ai-config, and human review around AI-generated Angular code.

Read article →

Guide · 7 min · May 25, 2026

An AGENTS.md That Makes AI Write Modern Angular

A production guide to writing an Angular agent rules file that names the version, the state boundary, the template syntax, and the traps that make AI write stale code.

Read article →

Guide · 12 min · May 27, 2026

WebMCP in Angular: How to Expose Tools to the Browser's AI Agent (and When to Wait)

How Angular exposes WebMCP tools to a browser AI agent (bootstrap, routes, services, and Signal Forms), plus the security surface that opens and where I would still wait before shipping.

Read article →

Note · 6 min · May 28, 2026

WebMCP vs the Angular CLI MCP Server: Runtime Tools vs Dev-Time Help

Which Angular MCP you actually want: the dev-time CLI MCP server that helps an assistant write your code, or runtime WebMCP that lets a browser agent call your shipped app.

Read article →

Guide · 7 min · May 29, 2026

Turning Signal Forms into AI Agent Tools

How Angular turns a Signal Form into an agent-callable tool, what its schema inference needs from your model, and where I would use it before it leaves experimental status.

Read article →

Guide · 7 min · Jun 4, 2026

A CLAUDE.md for Modern Angular: Memory, Not Just Rules

How Claude Code's memory system works for an Angular codebase: where CLAUDE.md lives, why you import AGENTS.md instead of duplicating it, and how path-scoped rules keep component, state, and testing guidance out of one stale file.

Read article →

Guide · 8 min · Jun 5, 2026

WebMCP Security in Angular: The Agent Calling Your Tools Can Be Hijacked

A security guide for Angular's WebMCP: why an exposed tool acts with the user's authority, why the JSON schema is not a trust boundary, and the defenses before you expose anything that mutates.

Read article →

Guide · 8 min · Jun 9, 2026

The Angular CLI MCP Server: Setup, Tools, and Wiring It to Your AI Assistant

How to set up the Angular CLI MCP server: the exact start command, the client config shape, the tools it exposes, and how to wire it to Claude Code, Cursor, and VS Code.

Read article →

Guide · 8 min · Jun 19, 2026

How I Use AI Agents Day to Day Without Handing Them the Wheel

A production filter for daily AI-agent work: what I delegate, what I keep, and where review remains the engineering boundary.

Read article →

Guide · 10 min · Jun 19, 2026

Spec-Driven Development With Claude, Codex, and the Superpowers Plugin

A working model for using Claude Code, Codex, and Superpowers around a spec, so agents implement decisions instead of inventing them mid-diff.

Read article →
· 3 articles

Guide · 9 min · May 18, 2026

HTTP State Without Turning Everything Into Signals

A code-heavy guide to Angular HTTP state boundaries with HttpClient, RxJS, toSignal, and cautious httpResource experiments.

Read article →

Guide · 10 min · May 24, 2026

The Code That Breaks When Angular Goes Zoneless

A code-heavy review guide for timers, subscriptions, forms, third-party callbacks, and tests before a zoneless Angular spike.

Read article →

Guide · 10 min · May 26, 2026

SSR, Hydration, and @defer Without Guesswork

A practical Angular rendering guide with server routes, hydration configuration, @defer boundaries, incremental hydration, and browser-only DOM safeguards.

Read article →
· 5 articles

Error · 8 min · Jun 5, 2026

NG0100 ExpressionChangedAfterItHasBeenCheckedError: Why It Surfaces in Zoneless Angular

Why NG0100 ExpressionChangedAfterItHasBeenCheckedError surfaces after a move to zoneless or Angular 22, what it now means, the test trap with fixture.detectChanges(), and the fixes by where the change came from.

Read article →

Error · 8 min · Jun 6, 2026

NG0500 Hydration Node Mismatch: the Real Fix Is Not ngSkipHydration

What NG0500 Hydration Node Mismatch means, the short list of real causes (direct DOM manipulation, invalid HTML the browser normalizes, third-party DOM libraries, HTML altered in transit), why ngSkipHydration is a tourniquet, and the fix for each.

Read article →

Error · 8 min · Jun 8, 2026

NG0200 Circular Dependency in DI: Reading the Chain and Breaking It

What NG0200 Circular Dependency in DI means, how to read the A -> B -> A chain Angular prints, the three causes that produce it, and the fixes ranked from restructuring down to forwardRef as a last resort.

Read article →

Error · 9 min · Jun 9, 2026

NG0203: Why inject() Fails Outside an Injection Context

Why Angular throws NG0203 when inject() runs outside an injection context, the exact window where inject() is valid, the common traps, and the fixes ranked from field initializer to runInInjectionContext.

Read article →

Error · 7 min · Jun 9, 2026

NG0950: Reading a Required Input Before Angular Sets It

Why Angular's NG0950 fires when a required signal input is read before binding, when inputs actually become available, and the three fixes: read it in ngOnInit / computed / effect, give it a default, or bind it in the parent.

Read article →
· 3 articles

Guide · 9 min · May 21, 2026

Facade Pattern in Angular: When Components Know Too Much

A production Angular guide to the Facade Pattern: when to create one, what it should own, what it should not hide, and how to test the boundary.

Read article →

Guide · 9 min · May 22, 2026

Adapter Pattern in Angular: Isolating APIs and Browser-Only Libraries

A production Angular guide to the Adapter Pattern: where to translate external contracts, how to keep components clean, and when a wrapper is not worth creating.

Read article →

Guide · 10 min · May 23, 2026

Strategy Pattern in Angular: Swapping Rules Without Spreading Switches

A production Angular guide to the Strategy Pattern: when a switch becomes a boundary, how to select implementations with DI, and how to keep the pattern from becoming decorative indirection.

Read article →