ALWAYS use when working with Angular PWA, service workers, offline support, manifest, or web app installation in Angular applications.
Scanned 9/9/2026
Install to Claude Code
npx -y skills add Lord1Egypt/awesome-skill-forge --skill skills-sh_oguzhan18_angular-ecosystem-skills_angular-pwa --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Skills Sh Oguzhan18 Angular Ecosystem Skills Angular Pwa?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/lord1egypt-skills-sh-oguzhan18-angular-ecosystem-skills-angul-88151660)More formats (shields.io, HTML) on the badges page.
---
name: angular-pwa
description: "ALWAYS use when working with Angular PWA, service workers, offline support, manifest, or web app installation in Angular applications."
metadata:
version: 21.0.0
generated_by: oguzhancart
generated_at: 2026-02-19
---
# @angular/pwa
**Version:** Angular 21 (2025)
**Tags:** PWA, Service Worker, Offline, Web App Manifest
**References:** [PWA Guide](https://angular.dev/guide/pwa) • [ngsw-config](https://angular.io/guide/service-worker-config)
## API Changes
This section documents recent version-specific API changes.
- NEW: Angular Service Worker v2 — Improved caching strategies
- NEW: esbuild PWA support — Faster builds
- NEW: @angular/build:application — Modern PWA building
## Best Practices
- Add PWA to project
```bash
ng add @angular/pwa
```
- Configure ngsw-config.json
```json
{
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
"index": "/index.html",
"assetGroups": [
{
"name": "app",
"installMode": "prefetch",
"resources": {
"files": [
"/favicon.ico",
"/index.html",
"/*.css",
"/*.js"
]
}
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"resources": {
"files": [
"/assets/**",
"/*.(svg|cur|jpg|jpeg|png)"
]
}
}
],
"dataGroups": [
{
"name": "api-freshness",
"urls": ["/api/**"],
"cacheConfig": {
"strategy": "freshness",
"maxSize": 100,
"maxAge": "1h",
"timeout": "10s"
}
}
]
}
```
- Use network-first for API calls
```json
{
"dataGroups": [
{
"name": "api",
"urls": ["/api/**"],
"cacheConfig": {
"strategy": "freshness",
"maxSize": 50,
"maxAge": "1h"
}
}
]
}
```
- Use cache-first for static assets
```json
{
"assetGroups": [
{
"name": "static",
"installMode": "prefetch",
"updateMode": "prefetch",
"resources": {
"files": ["/*.js", "/*.css"]
}
}
]
}
```
- Handle offline state
```ts
import { SwPush } from '@angular/service-worker';
constructor(private swPush: SwPush) {}
subscribeToNotifications() {
if (this.swPush.isEnabled) {
this.swPush.requestSubscription({
serverPublicKey: 'VAPID_PUBLIC_KEY'
});
}
}
```
- Check service worker updates
```ts
import { SwUpdate } from '@angular/service-worker';
constructor(private updates: SwUpdate) {
this.updates.versionUpdates.subscribe(event => {
if (event.type === 'VERSION_READY') {
// Reload to get new version
window.location.reload();
}
});
}
```
- Customize manifest
```json
{
"name": "My PWA",
"short_name": "MyPWA",
"theme_color": "#1976d2",
"background_color": "#ffffff",
"display": "standalone",
"scope": "/",
"start_url": "/",
"icons": [
{
"src": "assets/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
}
]
}
```
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!