Progressive Enhancement
Build so the core job works with plain HTML, then layer JavaScript on top for the nicer version. If scripts fail, it still works.
See it
What it is
Progressive enhancement builds in layers. Layer one is semantic HTML that already does the job: a real form with method and action, real links with hrefs, a server route that handles the plain submit. Layer two is CSS. Layer three is JavaScript that intercepts and upgrades: inline validation, optimistic UI, no full page reload. Steven Champeon named it in 2003 as the inverse of graceful degradation, which starts rich and falls back.
The reason it keeps coming back (Remix, server actions, HTMX) is that JavaScript fails more often than people assume: CDN blips, a bundle that 404s after a deploy, an extension conflict, a browser on hotel wifi that timed out at 40%. Enhancement means the checkout, the search, and the login still complete instead of showing a blank div.
Gotcha: for most apps the goal is not 'fully usable with JS off', it is that the critical path degrades to something usable instead of nothing. The two tells that a UI was not built this way: buttons with href='#' and divs with onClick doing navigation. Also, working without JS is not the same as being accessible; a script-free page can still be a mess for a screen reader.
Ask AI for it
Rebuild this feature with progressive enhancement, in three layers. Layer 1: semantic HTML that completes the task with zero JavaScript, a real form with method='post' and a real action URL, anchors with real hrefs, and a server route that handles the plain submit and redirects with a status message. Layer 2: CSS for the visual design, including styling for the server-rendered error state. Layer 3: JavaScript that progressively upgrades it, intercepting submit with event.preventDefault(), doing the fetch, and adding inline validation plus optimistic UI. No href='#' buttons and no div onClick navigation. Then verify by disabling JavaScript in devtools and confirming the task still completes end to end.