01 — Purpose

Resilient by default

Progressive enhancement creates resilient interfaces — core functionality should work before enhancement.

Networks fail. JavaScript errors. Extensions block scripts. Progressive enhancement ships a working baseline — semantic HTML, server-rendered content, native forms — then layers interactivity for capable environments.

See semantic HTML and JS module architecture.

02 — Principles

Enhancement improves — it does not invent

Enhancement should improve functionality — not invent it entirely.

  • semantic HTML first — real links, buttons, forms, headings
  • layered enhancement — CSS, then unobtrusive JS, then richer client behaviour
  • resilient forms — submit and validate server-side; enhance client-side
  • accessible defaults — keyboard and AT work before JS runs

03 — Practice

Good progressive enhancement

Core paths work without JavaScript; enhancement adds speed and polish.

  • server-render or statically generate meaningful HTML — see static vs SSR vs CSR
  • hydrate only interactive islands — see islands architecture
  • use progressive hydration for non-critical widgets — see progressive hydration
  • enhance forms with validation and async UX — keep native submit as fallback
  • test with JavaScript disabled on critical journeys — checkout, sign-in, search

04 — Avoid

Fragile JS-only interfaces

When JS is required for basic tasks, resilience and accessibility suffer.

  • JS-only interfaces — blank shell until bundle loads
  • dependency-heavy rendering — entire app requires React/Vue to read a paragraph
  • fragile interaction assumptions — div buttons, custom routing with no href fallback
  • client-only data fetching for public content — SEO and no-JS users lose access
  • skipping server validation — client-only checks that fail open

05 — Close

Baseline first, enhance second

If the page fails with JS off, the architecture is wrong for the content.

Define critical paths that must work without script. Enhance them — do not replace them. This site follows that model: static content, a button-controlled mobile menu with links in nav, and targeted client scripts for nav polish and syntax highlighting. Do not use details / summary for the primary site navigation — it breaks desktop layout.

See hydration costs, dependency management, and JavaScript standard.