Skip to content
Agentmart
Submit a tool

frontend-patterns

Angular frontend development patterns, conventions, and best practices.

Skill by galorr

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/galorr-frontend-patterns

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Angular frontend development patterns, conventions, and best practices. Use when building Angular components, services, directives, pipes, or routing. Covers standalone components, signals, RxJS patterns, NgRx, forms, and team-specific conventions.

Use cases: frontend

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/frontend-patterns

Tools it pre-approves 6

From allowed-tools in SKILL.md: the agent may use these without asking you each time.

  • Read,
  • Edit,
  • Write,
  • Glob,
  • Grep,
  • Bash

What's inside

Skill name
frontend-patterns
Description
Angular frontend development patterns, conventions, and best practices. Use when building Angular components, services, directives, pipes, or routing. Covers standalone components, signals, RxJS patterns, NgRx, forms, and team-specific conventions.
License
MIT
Allowed tools
Read,, Edit,, Write,, Glob,, Grep,, Bash
Instructions
281 lines in SKILL.md · view on GitHub

Before installing

  • Pre-approves any shell command

Files (1)

  • SKILL.md

SKILL.md (first lines)

# Angular Frontend Patterns

Best practices and conventions for Angular development.

## Component Architecture

### Prefer Standalone Components
```typescript
@Component({
  selector: 'app-my-component',
  standalone: true,
  imports: [CommonModule, RouterModule, MyOtherComponent],
  templateUrl: './my-component.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class MyComponent {}
```

- Always use `standalone: true` for new components
- Always set `changeDetection: ChangeDetectionStrategy.OnPush`
- Import only what the template needs — no `SharedModule` catch-alls

### Smart vs Dumb Components
- **Smart (container)**: Inject services, manage state, handle side effects
- **Dumb (presentational)**: Accept inputs, emit outputs, no service injection
- Keep dumb components pure — same inputs → same rendered output

### Component File Structure
```
my-feature/
├── my-feature.component.ts
├── my-feature.component.html
├── my-feature.component.scss
├── my-feature.component.spec.ts
└── index.ts   ← public API barrel export
```

---

## Signals (Angular 17+)

Prefer signals over BehaviorSubject for local component state:

```typescript
// ✅ Signals
export class MyComponent {
  count = signal(0);
  doubled = computed(() => this.count() * 2);

  increment() {
    this.count.update(c => c + 1);
  }
}

// ❌ Avoid for simple local state
private count$ = new BehaviorSubject(0);
```

Use `toSignal()` to bridge observables into signals:
```typescript
data = toSignal(this.service.getData$(), { initialValue: [] });
```

---

## RxJS Patterns

### Async Pipe — Always Prefer Over Manual Subscribe
```html
<!-- ✅ -->
<div *ngIf="data$ | async as data">{{ data.name }}</div>

<!-- ❌ Avoid manual subscribe in components -->
```

### Unsubscription
```typescript
// ✅ takeUntilDestroyed (Angular 16+)
this.service.data$.pipe(
  takeUntilDestroyed(this.destroyRef)
).subscribe(data => this.data = data);

// ✅ async pipe (preferred — no manual sub needed)
```

### Error Handling in Streams
```typescript
this.service.load().pipe(
  catchError(err => {
    this.error.set(err.message);
    return EMPTY;
  })
).subscribe();
```

### Common Operators Cheatsheet
| Goal | Operator |
|------|----------|
| Map + flatten one active at a time | `switchMap` |
| Map + flatten all, preserve order | `concatMap` |
| Map + flatten all in parallel | `mergeMap` |
| Ignore new while processing | `exhaustMap` |
| Deduplicate rapid emissions | `debounceTime` |
| Suppress duplicate values | `distinctUntilChanged` |

---

## Services

```typescript
@Injectable({ providedIn: 'root' })
export class MyService {
  private http = inject(HttpClient);

  getData(): Observable<MyData[]> {
    return this.http.get<MyData[]>('/api/data').pipe(
      shareReplay(1)
    );
  }

From galorr/claude-code-starter, MIT.

More from galorr/claude-code-starter

Signals

Stars
0
Forks
0
Open issues
0
Last commit (this folder)
Apr 17, 2026 (6 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from galorr

Cite this page

frontend-patterns skill. Agent Mart. https://agentmart.dev/skills/galorr-frontend-patterns (last updated 2026-10-24)