К основному содержанию
скилл CX Codex

pwa-expert — скилл для Claude Code: PWA, Service Worker, офлайн

Помогает сделать веб-приложение устанавливаемым и работающим офлайн: манифест, Service Worker, стратегии кеширования, свой экран установки.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add curiositech/some_claude_skills --skill pwa-expert -a claude-code
Открыть на GitHub

Что делает pwa-expert

Скилл включается, когда в проекте нужен PWA: манифест с иконками и режимом standalone, регистрация Service Worker, обработка beforeinstallprompt для собственной кнопки установки, фоновая синхронизация и офлайн-страница. Внутри — разбор того, что делает приложение устанавливаемым: HTTPS, манифест с обязательными полями, Service Worker с обработчиком fetch и иконки 192×192 и 512×512.

Отдельная часть — стратегии кеширования. Cache-First для статики, Network-First для API, Stale-While-Revalidate для баланса между свежестью и скоростью. Для каждой указана цена: статика отдаётся из кеша, пока его не обновят, а Network-First без сети просто не работает. Детали реализации лежат в references/service-worker-patterns.md, references/install-prompt.md и references/offline-handling.md.

Скилл не для нативной разработки, не для общей производительности веба и не для серверного рендеринга — для этого авторы отправляют к другим инструментам. Для простого статического сайта накладные расходы PWA могут не окупиться, это повод проверить, нужен ли вам Service Worker вообще. Скилл даёт доступ к Read, Write, Edit, Bash, Grep и Glob, так что он может и читать ваш код, и править файлы.

Какие задачи решает

  • сделать веб-приложение устанавливаемым на телефон и десктоп
  • настроить Service Worker и не сломать обновления
  • выбрать стратегию кеширования под статику и под API
  • показать свою кнопку установки вместо браузерной
  • отдать офлайн-страницу, когда сеть пропала

Примеры запросов агенту

  • Добавь в проект manifest.json и Service Worker, чтобы приложение ставилось на телефон
  • Настрой кеширование: статику через cache-first, API через network-first
  • Поймай beforeinstallprompt и покажи свою кнопку установки

Как установить pwa-expert

1Через Skills CLI (Vercel)

npx skills add curiositech/some_claude_skills --skill pwa-expert -a claude-code

2Вручную: положить файлы

~/.claude/skills/pwa-expert/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/pwa-expert/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о pwa-expert

Как установить pwa-expert в Claude?

Выполните npx skills add curiositech/some_claude_skills --skill pwa-expert -a claude-code. После этого файл скилла окажется в ~/.claude/skills/pwa-expert/SKILL.md.

Что делает pwa-expert?

Помогает собрать устанавливаемое веб-приложение: манифест, Service Worker, стратегии кеширования, обработка beforeinstallprompt, офлайн-режим и фоновая синхронизация.

Для каких задач скилл не подходит?

Для нативной разработки, общей производительности веба и серверного рендеринга — там авторы советуют другие инструменты. Для простого статического сайта накладные расходы PWA могут быть лишними.

Исходный текст

SKILL.md · MIT
---
name: pwa-expert
description: Progressive Web App development with Service Workers, offline support, and app-like behavior. Use for caching strategies, install prompts, push notifications, background sync. Activate on "PWA",
  "Service Worker", "offline", "install prompt", "beforeinstallprompt", "manifest.json", "workbox", "cache-first". NOT for native app development (use React Native), general web performance (use performance
  docs), or server-side rendering.
allowed-tools:
- Read
- Write
- Edit
- Bash
- Grep
- Glob
metadata:
  category: Design & Creative
  tags:
  - pwa
  - service-worker
  - offline
  - caching
  - installable
  - workbox
  - manifest
  pairs-with:
  - skill: mobile-ux-optimizer
    reason: PWAs target mobile users requiring touch optimization and responsive layout patterns
  - skill: caching-strategies
    reason: Service Worker cache strategies (stale-while-revalidate, cache-first) are core PWA patterns
  - skill: react-performance-optimizer
    reason: PWA performance budgets require aggressive React optimization for fast initial loads
---

# Progressive Web App Expert

Build installable, offline-capable web apps with Service Workers, smart caching, and native-like experiences.

## When to Use This Skill

- Making a web app installable on mobile/desktop
- Implementing offline functionality
- Setting up Service Worker caching strategies
- Handling install prompts (`beforeinstallprompt`)
- Background sync for offline-first apps
- Managing PWA update flows
- Creating web app manifests

## When NOT to Use This Skill

- **Native app development** → Use React Native, Flutter, or native SDKs
- **General web performance** → Use Lighthouse/performance auditing tools
- **Server-side rendering issues** → Use Next.js/framework-specific docs
- **Push notifications only** → Consider dedicated push notification services
- **Simple static sites** → PWA overhead may not be worth it

## Core Concepts

### What Makes a PWA Installable

1. **HTTPS** (or localhost for dev)
2. **Web App Manifest** with required fields
3. **Service Worker** with fetch handler
4. **Icons** (192×192 and 512×512 minimum)

### The PWA Stack

```
┌─────────────────────────────────────────┐
│           Your App (React/Next.js)      │
├─────────────────────────────────────────┤
│         Service Worker (sw.js)          │
│  ┌─────────────┐  ┌─────────────────┐   │
│  │   Cache     │  │  Network Fetch  │   │
│  │   Storage   │  │    Handling     │   │
│  └─────────────┘  └─────────────────┘   │
├─────────────────────────────────────────┤
│          manifest.json                  │
│  (App identity, icons, display mode)    │
└─────────────────────────────────────────┘
```

## Web App Manifest

### Complete manifest.json

```json
{
  "name": "Junkie Buds 4 Life",
  "short_name": "JB4L",
  "description": "Recovery support app",
  "start_url": "/",
  "scope": "/",
  "display": "standalone",
  "orientation": "portrait-primary",
  "background_color": "#1a1410",
  "theme_color": "#1a1410",
  "icons": [
    {
      "src": "/icons/icon-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icons/icon-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icons/icon-maskable-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    }
  ],
  "shortcuts": [
    {
      "name": "Find Meetings",
      "short_name": "Meetings",
      "url": "/meetings?source=shortcut",
      "icons": [{ "src": "/icons/meetings-96.png", "sizes": "96x96" }]
    }
  ]
}
```

### Display Modes

| Mode | Description |
|------|-------------|
| `fullscreen` | No browser UI, full screen |
| `standalone` | App-like, no URL bar (recommended) |
| `minimal-ui` | Some browser controls |
| `browser` | Normal browser tab |

### Link in HTML

```html
<head>
  <link rel="manifest" href="/manifest.json" />
  <meta name="theme-color" content="#1a1410" />
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
  <link rel="apple-touch-icon" href="/icons/apple-touch-icon.png" />
</head>
```

## Service Worker Basics

### Registration

```typescript
// lib/pwa.ts
export async function registerServiceWorker() {
  if ('serviceWorker' in navigator) {
    try {
      const registration = await navigator.serviceWorker.register('/sw.js', {
        scope: '/',
      });
      return registration;
    } catch (error) {
      console.error('SW registration failed:', error);
    }
  }
}

// Call on app mount
useEffect(() => {
  registerServiceWorker();
}, []);
```

### Basic Service Worker Structure

```javascript
// public/sw.js
const CACHE_NAME = 'myapp-v1';
const STATIC_ASSETS = ['/', '/offline', '/manifest.json'];

// Install: Cache static assets
self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME).then((cache) => cache.addAll(STATIC_ASSETS))
  );
  self.skipWaiting();
});

// Activate: Clean old caches
self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then((keys) =>
      Promise.all(keys.filter((k) => k !== CACHE_NAME).map((k) => caches.delete(k)))
    )
  );
  self.clients.claim();
});

// Fetch: Handle requests (see references for strategies)
self.addEventListener('fetch', (event) => {
  event.respondWith(handleFetch(event.request));
});
```

> **See:** `references/service-worker-patterns.md` for caching strategy implementations

## Caching Strategies

| Strategy | Best For | Tradeoff |
|----------|----------|----------|
| Cache-First | Static assets, fonts, images | Stale until cache updated |
| Network-First | API data, user content | Slower, needs connectivity |
| Stale-While-Revalidate | Balance freshness/speed | Background updates |
| Network-Only | Auth, real-time data | No offline support |
| Cache-Only | Versioned assets | Never updates |

> **See:** `references/service-worker-patterns.md` for full implementations

## Install Prompts

Handle the `beforeinstallprompt` event to show a custom install UI:

```typescript
// Basic pattern
const [deferredPrompt, setDeferredPrompt] = useState(null);

useEffect(() => {
  window.addEventListener('beforeinstallprompt', (e) => {
    e.preventDefault();
    setDeferredPrompt(e);
  });
}, []);

const handleInstall = async () => {
  if (deferredPrompt) {
    deferredPrompt.prompt();
    const { outcome } = await deferredPrompt.userChoice;
    // outcome: 'accepted' or 'dismissed'
  }
};
```

> **See:** `references/install-prompt.md` for full `usePWAInstall` hook and component

## Offline Experience

Key patterns:
- Offline page fallback for navigation failures
- `useOnlineStatus` hook to detect connectivity
- Offline banner to inform users

> **See:** `references/offline-handling.md` for implementations

## Background Sync

Queue actions while offline, execute when connectivity returns:

```javascript
// In Service Worker
self.addEventListener('sync', (event) => {
  if (event.tag === 'sync-data') {
    event.waitUntil(syncPendingData());
  }
});

// In App - trigger sync
const registration = await navigator.serviceWorker.ready;
await registration.sync.register('sync-data');
```

> **See:** `references/background-sync.md` for full IndexedDB integration

## Update Flow

Notify users when a new version is available:

```typescript
// Basic pattern
registration.addEventListener('updatefound', () => {
  const newWorker = registration.installing;
  newWorker?.addEventListener('statechange', () => {
    if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
      // New version available - show update prompt
    }
  });
});
```

> **See:** `references/update-flow.md` for `usePWAUpdate` hook and update strategies

## Next.js Integration

Options for Next.js PWA:

1. **next-pwa** - Works with standard Next.js server
2. **Custom SW** - Required for `output: 'export'` (static sites)
3. **Workbox CLI** - Generate SW after build

> **See:** `references/nextjs-integration.md` for detailed configurations

## Quick Reference

| Task | Solution |
|------|----------|
| Check if installed | `window.matchMedia('(display-mode: standalone)').matches` |
| Force SW update | `registration.update()` |
| Clear all caches | `caches.keys().then(keys => keys.forEach(k => caches.delete(k)))` |
| Check online | `navigator.onLine` |
| Get SW registration | `navigator.serviceWorker.ready` |
| Skip waiting | `self.skipWaiting()` in SW |
| Take control | `self.clients.claim()` in SW |

## Testing PWA

### Chrome DevTools

1. **Application tab** → Manifest, Service Workers, Cache Storage
2. **Lighthouse** → PWA audit
3. **Network** → Offline checkbox to simulate

### Debug Checklist

- [ ] Manifest loads (Application → Manifest)
- [ ] SW registered (Application → Service Workers)
- [ ] Cache populated (Application → Cache Storage)
- [ ] Install prompt fires (Console for beforeinstallprompt)
- [ ] Offline page works (Network → Offline)
- [ ] Update flow works (trigger update, verify prompt)

## References

Detailed implementations in `/references/`:

- `service-worker-patterns.md` - Caching strategy implementations
- `install-prompt.md` - `usePWAInstall` hook and install component
- `offline-handling.md` - Offline page, status hooks, banners
- `background-sync.md` - Background sync with IndexedDB
- `update-flow.md` - Update detection and user prompts
- `nextjs-integration.md` - Next.js PWA configuration options

© curiositech · MIT · curiositech/some_claude_skills

Похожие скиллы

Всё по теме «Фронтенд и UI» →
pwa-development alinaqi Скилл для сборки Progressive Web App: манифест, service worker, стратегии кэширования и офлайн-режим. Пригодится, когда приложение должно ставиться на телефон и открываться без сети. CX Codex +1 4 100установок progressive-web-app aj-geddes Помогает собрать прогрессивное веб-приложение: манифест, service worker, работа без сети и установка на телефон. CX Codex +1 522установок web-performance-optimization secondsky Скилл для оптимизации загрузки веб-приложений: разбивка бандла, ленивая загрузка, кэширование и мониторинг Core Web Vitals. CX Codex +1 557установок mobile-native emilkowalski Убирает мелочи, из-за которых веб-приложение на телефоне выдаёт себя: залипающий hover, вспышку при тапе, ошибку с 100vh. CX Codex +1 86 600установок webapp-to-capacitor Cap-go Планирует и выполняет превращение веб-приложения, PWA или SPA в приложение под iOS и Android на Capacitor, которое проходит ревью магазинов. CX Codex +1 665установок chrome-extension samber Помогает создавать и дорабатывать Chrome-расширения на Manifest V3. Пригодится для manifest.json, content scripts, фоновой логики и API браузера. CX Codex +1 4 500установок

Из того же набора20

interior-design-expert Скилл помогает планировать расстановку мебели, рассчитывать освещение по стандартам IES и подбирать палитры Манселла. Пригодится для обустройства комнат и генерации интерьерных рендеров. CX Codex +1 1 100установок cv-creator Собирает резюме под проверку ATS в форматах PDF, DOCX, LaTeX, Markdown и JSON. Пригодится для откликов на вакансии без лишнего визуального шума. CX Codex +1 774установок personal-finance-coach Скилл проводит расчёты пенсионных сценариев FIRE, помогает распределять активы и выбирать безопасные нормы изъятия капитала. Пригодится при планировании личных инвестиций. CX Codex +1 769установок photo-composition-critic Скилл для критики фотографий: оценивает композицию, цвет и эстетику, даёт конкретные замечания. Пригодится, когда нужно разобрать снимок, а не отретушировать его. CX Codex +1 643установок metal-shader-expert Помогает писать и оптимизировать шейдеры Metal под Apple GPU: MSL, PBR, tile-based deferred rendering, трассировка лучей. Пригодится, когда проект упирается в производительность графики на Apple Silicon. CX Codex +1 512установок mobile-ux-optimizer Скилл помогает адаптировать веб-интерфейсы под смартфоны: настраивает safe area, переводит вёрстку на dvh и увеличивает области клика под тач-экраны. CX Codex +1 498установок web-design-expert Проектирует веб-интерфейсы, айдентику бренда и палитры в формате OKLCH. Помогает продумать визуальную иерархию и сетку сайта до передачи макетов в вёрстку. CX Codex +1 439установок color-theory-palette-harmony-expert Скилл для подбора цветовых палитр и последовательностей фото: перцептивные пространства LAB и OKLCH, расстояние землекопа, чередование тёплых и холодных тонов. CX Codex +1 430установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой