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 →Modern Angular
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
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.
Deep dives on Signals, RxJS, zoneless, SSR, testing, and patterns with code that can survive review.
Decision matrices, review gates, and migration plans for evolving mature Angular codebases without rewrite campaigns.
A clear view of my work: frontend modernization with lower risk, clearer architecture, and delivery confidence.
I'm André Ramos, a Senior Software Engineer available for remote roles (UTC−3). I help teams modernize production Angular without rewrites.
★ Start here
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.
Adoption decisions
· 8 articlesA production boundary for Signals, computed values, RxJS streams, and interop, with no cosmetic rewrite of architecture that already works.
Read article →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 →A readiness checklist for testing zoneless in an existing Angular app without confusing a compatibility spike with a rollout plan.
Read article →A modernization plan for teams that need audit, low-risk changes, isolated spikes, and decisions that can survive code review.
Read article →A practical rule for using standalone components, route providers, and remaining NgModules in mature Angular applications.
Read article →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 →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 →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 →Testing and Vitest
· 9 articlesVitest 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 →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 →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 →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 →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 →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 →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 →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 →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 →Angular + AI
· 10 articlesA production checklist for using Angular CLI MCP, ai-config, and human review around AI-generated Angular code.
Read article →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 →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 →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 →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 →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 →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 →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 →A production filter for daily AI-agent work: what I delegate, what I keep, and where review remains the engineering boundary.
Read article →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 →Deep technical guides
· 3 articlesA code-heavy guide to Angular HTTP state boundaries with HttpClient, RxJS, toSignal, and cautious httpResource experiments.
Read article →A code-heavy review guide for timers, subscriptions, forms, third-party callbacks, and tests before a zoneless Angular spike.
Read article →A practical Angular rendering guide with server routes, hydration configuration, @defer boundaries, incremental hydration, and browser-only DOM safeguards.
Read article →Angular errors, decoded
· 5 articlesWhy 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 →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 →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 →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 →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 →Design Patterns with Angular
· 3 articlesA 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 →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 →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 →