
Chrome is shipping something the web platform has needed for twenty years: a native way to stream HTML into specific DOM slots as server data resolves — no JavaScript library required. Announced at Google I/O 2026 and testable now in Chrome 148 behind a flag, Declarative Partial Updates gives developers two new APIs that finally make server-side partial rendering a browser primitive rather than a framework feature.
Every major web framework has been reinventing this wheel independently. React Server Components, HTMX, Hotwire Turbo Streams, Astro’s island architecture — they all solve a variation of the same problem: send a page shell fast, then fill in the slow parts later. Declarative Partial Updates moves that logic into the browser itself, where it arguably always belonged.
How Out-of-Order HTML Streaming Works
The first API introduces processing instruction placeholders into the HTML stream and a <template for> element that fills them. Here is the minimal pattern:
<!-- Server sends this immediately -->
<body>
<header>My Store</header>
<?product-details>
<footer>Terms</footer>
</body>
<!-- Server sends this when the database query resolves -->
<template for="product-details">
<section>
<h1>Widget Pro — $49</h1>
<p>In stock. Ships in 2 days.</p>
</section>
</template>
The <?product-details> processing instruction is a placeholder. When the browser encounters the matching <template for="product-details"> later in the stream, it patches that slot with the template content. The footer renders immediately. The product details appear when the server sends them. No fetch, no JavaScript, no loading state management in userland.
There is a deliberate security constraint: <template for> can only update processing instructions within the same parent element by default. Attach it directly to <body> if you need full-document access, including <head>. This prevents third-party content from patching arbitrary DOM locations.
A Cleaner HTML Insertion API
innerHTML is 25 years old and shows it. It has no sanitization, no streaming support, and a naming convention that belongs in a different era. The second part of this proposal replaces it with a consistent, safe family of insertion methods:
- setHTML(html) — sanitized replacement; strips
<script>tags, event handler attributes, and other XSS vectors by default - setHTMLUnsafe(html) — unsanitized, for trusted server-rendered content
- appendHTML(html) / appendHTMLUnsafe(html) — insert at end of element
- streamHTML(readableStream) — streaming replacement, integrates directly with the Fetch and Streams APIs
- streamAppendHTML(readableStream) — streaming append
The safe variants are the default path. Strip dangerous elements automatically; opt into unsanitized only when you control the source. Firefox 148 already ships setHTML() in stable. Chrome 148 has it behind a flag. The Mozilla Hacks writeup on setHTML() covers the security details for teams migrating from innerHTML.
What This Means for Your Stack
This is not an HTMX replacement. HTMX handles user-triggered interactions — a button click that fetches HTML and swaps a component. Declarative Partial Updates handles server-push streaming on initial load. They solve different problems and can coexist.
React Server Components is a different comparison. RSC requires the React runtime, its own serialization protocol, and ties you to the React ecosystem. Declarative Partial Updates is pure HTML, works with any backend language (Go, Ruby, Python, PHP, Node.js), and requires no client-side runtime. For applications that are predominantly server-rendered with minimal client-side interaction, this removes a significant JavaScript dependency.
Hotwire Turbo Streams is the closest analogue. Turbo also does server-pushed HTML updates, but requires the Turbo JavaScript library. Declarative Partial Updates is what Turbo Streams was trying to be — only without shipping a library.
The most significant adoption signal comes from Drupal. The Drupal community is actively working to replace BigPipe’s JavaScript shim with Declarative Partial Updates. BigPipe is Drupal’s server-streaming implementation used across millions of production sites. When enterprise PHP follows, the standard is serious.
How to Try It Today
Enable the flag in Chrome 148: navigate to chrome://flags/#enable-experimental-web-platform-features and restart. Both APIs are available for testing.
For the insertion methods, the html-setters-polyfill package on npm works in browsers that don’t yet support the new methods. You are not blocked on Chrome’s stable release to start integrating.
Standardization is progressing. The WICG/declarative-partial-updates repository is active, W3C process started in late 2025, and other browser vendors have signaled positive interest. Stable cross-browser support could arrive by 2027 if feedback holds.
The official Chrome developer blog post covers both APIs in full detail. This landed as one of 15 featured updates in Chrome’s Google I/O 2026 recap — which means Google considers it a priority, not a side experiment.
Streaming HTML into specific DOM slots has always been possible. Frameworks just made you pay for it in JavaScript. That cost is now optional.













