DevPrep
  • Interview Prep
  • Projects
  • Resources
  • Pricing
  • About Us
Submit Question
DevPrep
  • Pricing
  • About Us
Submit Question
  1. Home
  2. Articles
  3. Frontend Engineering
  4. Progressive Web Apps: From Zero to Production
XLinkedInReddit
MediumFrontend Engineering

Progressive Web Apps: From Zero to Production

D
DevPrep Team
February 10, 2026·1 min read·0
Table of Contents
  • What Makes a PWA?
  • The Manifest
  • Installability Criteria
  • Offline Strategies
  • App Shell Model
  • Offline-First Data
  • Push Notifications
  • Performance Tips

PWAs bridge the gap between web and native apps. At Google, we're big believers — many of our products are PWAs.

What Makes a PWA?

  1. Web App Manifest: Metadata for "Add to Home Screen"
  2. Service Worker: Offline support and caching
  3. HTTPS: Required for Service Workers

The Manifest

{
  "name": "DevPrep - Interview Preparation",
  "short_name": "DevPrep",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#1a1a2e",
  "theme_color": "#0f3460",
  "icons": [
    { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" },
    { "src": "/icon-maskable.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
  ]
}

Installability Criteria

  • Valid web app manifest with required fields
  • Served over HTTPS
  • Registered Service Worker with a fetch handler
  • Icons in correct sizes (192px and 512px minimum)

Offline Strategies

App Shell Model

Cache the application shell (HTML, CSS, JS) and load dynamic content from the network. Users see the app structure immediately.

Offline-First Data

// IndexedDB for offline data
import { openDB } from "idb";

const db = await openDB("app", 1, {
  upgrade(db) {
    db.createObjectStore("articles", { keyPath: "id" });
  }
});

// Save for offline
await db.put("articles", article);

// Read offline
const cached = await db.get("articles", articleId);

Push Notifications

// Request permission
const permission = await Notification.requestPermission();

// Subscribe to push
const subscription = await registration.pushManager.subscribe({
  userVisibleOnly: true,
  applicationServerKey: vapidPublicKey
});

// Send subscription to server
await fetch("/api/push/subscribe", {
  method: "POST",
  body: JSON.stringify(subscription)
});

Performance Tips

  • Precache critical resources during SW install
  • Use navigation preload to avoid SW startup delay
  • Lazy-load non-critical resources
  • Use Workbox for production-grade caching

Related Articles

MediumFrontend Engineering

System Design #12: Design a Multi-Step Form Wizard

7 min read
MediumFrontend Engineering

Mastering Senior-Level JavaScript Interview Concepts

2 min read
MediumFrontend Engineering

System Design #9: Design a Collaborative Text Editor

9 min read

Comments (0)

Sign in to leave a comment.

No comments yet. Be the first to comment.

Table of Contents

  • What Makes a PWA?
  • The Manifest
  • Installability Criteria
  • Offline Strategies
  • App Shell Model
  • Offline-First Data
  • Push Notifications
  • Performance Tips

Series

View all Frontend Engineering articles →

Practice

  • JavaScript
  • DSA
  • Machine Coding
  • System Design

Resources

  • Learning Tracks
  • Articles
  • Roadmaps
  • Compare Concepts
  • Glossary
  • Developer Tools
  • All Questions

Company

  • About
  • Pricing

Legal

  • Privacy Policy
  • Terms of Service
DevPrep

© 2026 DevPrep. All rights reserved.