.agents/skills/angular-ssr/SKILL.md
Angular SSR with @angular/ssr, hydration, and prerendering. Covers server-side rendering setup, transfer state, and deployment. USE WHEN: user mentions "Angular SSR", "server-side rendering", "Angular Universal", "@angular/ssr", "hydration", "prerendering", "Angular SEO" DO NOT USE FOR: Next.js SSR - use `nextjs`, Nuxt SSR - use `vue-composition`, SvelteKit SSR - use `svelte`
npx skillsauth add d-subrahmanyam/deno-fresh-microservices angular-ssrInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Deep Knowledge: Use
mcp__documentation__fetch_docswith technology:angular, topic:ssrfor comprehensive documentation.
# Add SSR to existing project
ng add @angular/ssr
This creates:
server.ts - Express server entry pointsrc/app/app.config.server.ts - Server-specific providersangular.json with server builder// app.config.server.ts
import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
import { provideServerRendering } from '@angular/platform-server';
import { provideServerRoutesConfig } from '@angular/ssr';
import { appConfig } from './app.config';
import { serverRoutes } from './app.routes.server';
const serverConfig: ApplicationConfig = {
providers: [
provideServerRendering(),
provideServerRoutesConfig(serverRoutes),
]
};
export const config = mergeApplicationConfig(appConfig, serverConfig);
// app.routes.server.ts
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
{ path: '', renderMode: RenderMode.Prerender }, // Static at build time
{ path: 'dashboard', renderMode: RenderMode.Server }, // SSR per request
{ path: 'profile/**', renderMode: RenderMode.Client }, // Client-only (SPA)
{ path: '**', renderMode: RenderMode.Server }, // Default: SSR
];
// app.config.ts - Hydration is enabled by default with @angular/ssr
export const appConfig: ApplicationConfig = {
providers: [
provideClientHydration(), // Included automatically
]
};
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
import { PLATFORM_ID, inject } from '@angular/core';
@Component({ ... })
export class MyComponent {
private platformId = inject(PLATFORM_ID);
ngOnInit() {
if (isPlatformBrowser(this.platformId)) {
// Browser-only code (localStorage, window, DOM manipulation)
window.addEventListener('scroll', this.onScroll);
}
}
}
// Or use afterNextRender for one-time browser init
import { afterNextRender } from '@angular/core';
@Component({ ... })
export class ChartComponent {
constructor() {
afterNextRender(() => {
// Runs only in browser after first render
this.initChart();
});
}
}
| Anti-Pattern | Why It's Bad | Correct Approach |
|--------------|--------------|------------------|
| Direct window/document access | Breaks SSR | Use isPlatformBrowser() |
| No hydration | Full page re-render | Enable provideClientHydration() |
| SSR for auth-only pages | Wasted server resources | Use RenderMode.Client |
| Ignoring transfer state | Double data fetch | Hydration handles this automatically |
| Issue | Likely Cause | Solution |
|-------|--------------|----------|
| Hydration mismatch | DOM changed before hydration | Avoid DOM manipulation in ngOnInit |
| window is not defined | Server-side access | Guard with isPlatformBrowser() |
| Slow SSR | Heavy computation | Move to client with @defer |
| SEO not working | Client-only rendering | Use RenderMode.Server or Prerender |
development
Guidelines for building high-performance APIs with Fastify and TypeScript, covering validation, Prisma integration, and testing best practices
development
FastAPI modern Python web framework. Covers routing, Pydantic models, dependency injection, and async support. Use when building Python APIs. USE WHEN: user mentions "fastapi", "pydantic", "async python api", "python rest api", asks about "dependency injection python", "python openapi", "python swagger", "async endpoints", "python api validation", "fastapi middleware" DO NOT USE FOR: Django apps - use `django` instead, Flask apps - use `flask` instead, synchronous Python APIs without type hints, GraphQL-only APIs
tools
FastAPI integration testing specialist. Covers synchronous TestClient, async httpx AsyncClient, dependency injection overrides, auth testing (JWT, OAuth2, API keys), WebSocket testing, file uploads, background tasks, middleware testing, and HTTP mocking with respx, responses, and pytest-httpserver. USE WHEN: user mentions "FastAPI test", "TestClient", "httpx async test", "dependency override test", "respx mock", asks about testing FastAPI endpoints, authentication in tests, or HTTP client mocking. DO NOT USE FOR: Django - use `pytest-django`; pytest internals - use `pytest`; Container infrastructure - use `testcontainers-python`
development
Expert in FastAPI Python development with best practices for APIs and async operations