Files
astro-website/openspec/changes/service-workers/design.md
Santhosh Janardhanan 8f1c0746a5
Some checks failed
ci / site (push) Has been cancelled
publish-image / publish (push) Has been cancelled
home page updated
2026-02-10 04:35:03 -05:00

3.0 KiB

Context

This change introduces a Service Worker to improve perceived load time and reduce network usage on repeat visits by caching critical assets in the browser.

The site is a static Astro build. That means:

  • The Service Worker should live at the site root (/sw.js) so it can control all routes.
  • Navigations (HTML documents) should not be cached in a way that causes indefinite staleness after new deploys.

Goals / Non-Goals

Goals:

  • Improve repeat-visit performance by pre-caching the critical site shell assets.
  • Add runtime caching for media assets (images) with bounded storage usage.
  • Ensure safe update behavior: cache versioning and cleanup on activate.
  • Keep local development predictable by not registering the Service Worker in dev by default.

Non-Goals:

  • Full offline-first experience for all routes/content.
  • Background sync, push notifications, or complex offline fallbacks.
  • Server-side caching (handled by separate changes, if desired).

Decisions

  1. Implement a lightweight, custom Service Worker (no Workbox) Rationale: The project already outputs static assets and the needed caching strategies are straightforward. A small custom /sw.js avoids adding a build-time dependency and keeps behavior explicit. Alternatives considered:
  • Workbox: powerful, but adds dependency surface area and build configuration overhead.
  1. Cache strategy by request type Rationale: Different resources have different freshness requirements.
  • Navigations (HTML documents): Network-first, fallback to cache on failure. This minimizes stale HTML risks while still helping resiliency.
  • Static shell assets (CSS/JS/fonts/icons): Pre-cache on install and serve from cache for speed.
  • Images/media: Cache-first with a size bound and eviction to avoid unbounded storage.
  1. Versioned caches + activation cleanup Rationale: Static sites frequently redeploy; versioning ensures updates can be picked up and old assets are not served after deploy. On activate, the SW deletes prior version caches. Implementation approach:
  • Use cache names like shell-v<version> and media-v<version>.
  • Update the version string on build (initially a constant; later can be automated).
  1. Disable SW registration in development by default Rationale: Service worker caching can confuse local iteration and cause stale assets during development. Implementation approach:
  • Register SW only when import.meta.env.PROD is true (Astro build-time flag) or an explicit runtime guard is met.

Risks / Trade-offs

  • [Stale or broken assets after deploy] → Use versioned caches and delete old caches during activation. Prefer network-first for navigations.
  • [Over-caching HTML causes outdated content] → Do not use cache-first for navigation; do not pre-cache HTML pages.
  • [Storage growth due to images] → Enforce a max-entry limit with eviction for media cache.
  • [Browser compatibility gaps] → Service worker is progressive enhancement; site must still function without it.