angular
Skill33 starsChanged 34 days agoMITView on GitHub
Use when building Angular applications. Covers standalone components, signals, RxJS discipline, change detection, dependency injection, and the patterns that keep large Angular codebases fast. Trigger on "subscription memory leak", "migrate to standalone components", "change detection is slow", "signals or rxjs for this state". Do not use for app-wide folder and state structure — see the frontend-architecture skill.
15 other projects use a version of this.
Adopted by
Most recently taken up by
- Lukk17/agent-standardstheir own version, first seen Nov 7, 2026
- gingerminds/claude-skillstheir own version, first seen Nov 1, 2026
- xfstudio/skillstheir own version, first seen Oct 13, 2026
- G1Joshi/Agent-Skillstheir own version, first seen Oct 13, 2026
- kid-sid/claude-spellbooktheir own version, first seen Oct 9, 2026
- Mindrally/skillstheir own version, first seen Oct 8, 2026
Other versions15 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 15
- Mindrally/skills★ 275same name
- kid-sid/claude-spellbook★ 190same name
- dylantarre/design-system-skills★ 50same name
- kumaran-is/claude-code-onboarding★ 35same name
- G1Joshi/Agent-Skills★ 15same name
- xfstudio/skills★ 9same name
- lucavb/skills★ 3same name
- ai4brands-design/claude-skills★ 2same name
- ffsshhttiikk/opencode-agents-skills★ 2same name
- gingerminds/claude-skills★ 2same name
5 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository137 other files it gives its agents.
- agent-instructionsSkill
- agent-memorySkill
- hooksSkill
- plugin-developmentSkill
- skill-authoringSkill
- skill-reviewSkill
- slash-commandsSkill
- subagentsSkill
- agent-designSkill
- context-engineeringSkill
- fine-tuningSkill
- llm-cost-optimizationSkill
- llm-evaluationSkill
- llm-integrationSkill
- mcp-serverSkill
- ml-pipelineSkill
- model-selectionSkill
- prompt-engineeringSkill
- ragSkill
- structured-outputSkill
- api-designSkill
- background-jobsSkill
- cachingSkill
- djangoSkill
- event-driven-architectureSkill
- fastapiSkill
- graphqlSkill
- microservicesSkill
- nestjsSkill
- realtime-websocketsSkill
- spring-bootSkill
- competitive-analysisSkill
- lead-researchSkill
- product-analysisSkill
- resumeSkill
- user-researchSkill
- database-performanceSkill
- data-modelingSkill
- data-qualitySkill
- pandasSkill
- postgresSkill
- sparkSkill
- brand-guidelinesSkill
- generative-artSkill
- themingSkill
- ui-reviewSkill
- visual-designSkill
- architecture-decisionsSkill
- bug-fix-protocolSkill
- cli-developmentSkill
- code-reviewSkill
- debuggingSkill
- design-patternsSkill
- domain-modelingSkill
- git-workflowSkill
- legacy-modernizationSkill
- refactoringSkill
- repository-explorationSkill
- simple-designSkill
- system-designSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 1 is distinctive, and 1 is very specific to this project.
0
Common
Most of the 14 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 41
No manual subscriptions without a matching teardown.
- Very specific: line 53
Do not call methods from the template ({{ getTotal() }}).
“Common” is measured: kept by at least 6 in 10 of the 14 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Angular
Purpose
Build modern Angular — standalone components, signals for state, RxJS only where streams genuinely help — and keep change detection from becoming the bottleneck it becomes by default.
When to Use
- Building or reviewing an Angular 17+ application.
- Migrating from NgModules to standalone components, or from RxJS state to signals.
- Diagnosing performance problems caused by change detection.
- Preventing subscription leaks.
Capabilities
- Standalone components, directives, and functional route guards.
- Signals:
signal,computed,effect, andtoSignalinterop with RxJS. - Change detection:
OnPush, zoneless, and what triggers a check. - RxJS operators for the cases where a stream is the right model.
- Dependency injection with
inject()and provider scoping.
Inputs
- The component or feature, and its data sources.
- Angular version, and whether zone.js is still in use.
- The performance symptom, if any.
Outputs
- Standalone components with
OnPushchange detection. - State in signals; asynchronous events in observables, converted at the boundary.
- No manual subscriptions without a matching teardown.
Workflow
- Go standalone — NgModules are legacy. Standalone components with explicit
importsmake the dependency graph readable. - Use signals for state — Synchronous, glitch-free, and integrated with change detection. Reserve RxJS for genuine streams: HTTP, WebSockets, user-input debouncing.
- Set
OnPusheverywhere — Default change detection re-checks the entire component tree on every event.OnPushlimits it to inputs that actually changed. - Convert at the boundary —
toSignal(this.http.get(...))brings an observable into the signal world. Do not maintain state in aBehaviorSubjectand mirror it into a signal. - Never subscribe manually without teardown —
takeUntilDestroyed()or theasyncpipe. A subscription without an unsubscribe is a leak with a component attached.
Best Practices
- Do not call methods from the template (
{{ getTotal() }}). They run on every change-detection cycle. Use acomputedsignal. subscribe()insidesubscribe()is a nested-subscription bug. Flatten withswitchMap,mergeMap, orconcatMap— chosen for the cancellation semantics you actually want.switchMapcancels the previous request, which is correct for typeahead and wrong for saving a form. Pick deliberately.- Provide services at the component level when the state is component-scoped;
providedIn: 'root'makes it a singleton shared by every consumer. effect()is for side effects only. Writing to a signal inside an effect creates a loop that Angular will warn about, and it usually means you wantedcomputed.- Zoneless change detection (Angular 18+) removes zone.js entirely and requires signals throughout. It is worth targeting for new applications.
Examples
Signal state with an RxJS boundary:
@Component({
selector: "app-order-list",
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [OrderCardComponent],
template: `
@if (orders.isLoading()) {
<app-skeleton />
} @else {
@for (order of visibleOrders(); track order.id) {
<app-order-card [order]="order" />
} @empty {
<p>No orders match this filter.</p>
}
}
`,
})
export class OrderListComponent {
private readonly api = inject(OrderApi);
readonly status = signal<OrderStatus>("open");
readonly orders = rxResource({
request: () => ({ status: this.status() }),
loader: ({ request }) => this.api.list(request.status),
});
// Derived state, recomputed only when its dependencies change.
readonly visibleOrders = computed(() =>
(this.orders.value() ?? []).filter((o) => !o.archived),
);
}Subscription teardown without ceremony:
export class SearchComponent {
private readonly destroyRef = inject(DestroyRef);
constructor() {
this.searchControl.valueChanges
.pipe(
debounceTime(300),
distinctUntilChanged(),
switchMap((q) => this.api.search(q)), // cancels the in-flight request
takeUntilDestroyed(this.destroyRef), // unsubscribes on destroy
)
.subscribe((results) => this.results.set(results));
}
}Notes
- The new control-flow syntax (
@if,@for,@switch) is not sugar — it compiles to more efficient code than*ngIfand*ngFor, andtrackis mandatory in@for, which eliminates a whole class of list-diffing bugs. OnPushwith mutable objects will not update: it compares references. Either treat inputs as immutable or use signals, which notify explicitly.- A
computedsignal that reads anothercomputedis fine and does not recompute unnecessarily — the graph is lazy and memoized.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

