htmx 0.4.0 has been released!

htmx 0.4.0 Release I’m pleased to announce the 0.4 release (https://unpkg.com/browse/htmx.org@0.4.0/) of htmx. Changes New Features • Now support the HX-Redirect and HX-Refresh response headers

htmx 0.4.0 Release I’m pleased to announce the 0.4 release (https://unpkg.com/browse/htmx.org@0.4.0/) of htmx.

Changes New Features

• Now support the HX-Redirect and HX-Refresh response headers for redirecting client side and triggering a page refresh, respectively

• hx-vars now overrides input values

tags in responses will be used to update page titles</p> <p>• All uses of eval() have been removed in favor of Function</p> <p>• hx-vals is available as a save alternative to hx-vars. It uses JSON.parse() rather than evaluation, if you wish to safely pass user-provided values through to htmx.</p> <p>Bug Fixes</p> <p>• Eliminated perf issues around hx-boost in large pages that are not using that attribute</p> <p>• Fixed bug which prevented evaluation when a script tag was the leading content in a response</p> <p>Enjoy!</p> </div> <section class="article-references-section p-0"> <ul class="reference-list list-unstyled"> <li> Reference: <a href="https://htmx.org/posts/2020-11-16-htmx-0-4-0-is-released/" target="_blank" rel="noopener noreferrer">https://htmx.org/posts/2020-11-16-htmx-0-4-0-is-released/</a> </li> </ul> </section> </div> <div class="flex flex-row gap-2 flex-wrap mb-2"> <details class="comment-form-toggle"> <summary class="btn btn-primary comment-form-toggle__cta">Write a comment</summary> <form data-controller="nostr--nostr-comment" data-nostr--nostr-comment-publish-url-value="/comments/publish" data-nostr--nostr-comment-csrf-token-value="b8dbe8e3511d41deb5f7d8.tX00s6-Hx8KEgkl5E7HK9Gz20oi5k8wCqlUbO81uql0.jCVz0fWzl7vg83o9W_S-vAChvcbR14k2_Tp0Q7oh5G_zHmLh3rX1lsDHDA" data-nostr--nostr-comment-root="{"tag":"A","value":"30023:247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90:htmx-040-has-been-released","relay":null,"pubkey":"247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90","kind":30023}" data-nostr--nostr-comment-parent="{"tag":"a","value":"30023:247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90:htmx-040-has-been-released","relay":null,"pubkey":"247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90","kind":30023}" data-action="submit->nostr--nostr-comment#publish" class="nip22-comment-form"> <div data-nostr--nostr-comment-target="status"></div> <div class="mb-2"> <label for="comment_content_nip22_comment_6a2f72b7add7d" class="form-label hidden">Comment</label> <textarea id="comment_content_nip22_comment_6a2f72b7add7d" name="comment[content]" class="form-control" rows="3" required placeholder="Write your comment"></textarea> </div> <input type="hidden" name="comment[root]" value='{"tag":"A","value":"30023:247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90:htmx-040-has-been-released","relay":null,"pubkey":"247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90","kind":30023}'> <input type="hidden" name="comment[parent]" value='{"tag":"a","value":"30023:247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90:htmx-040-has-been-released","relay":null,"pubkey":"247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90","kind":30023}'> <div class="actions"> <button type="submit" data-nostr--nostr-comment-target="publishButton" class="btn btn-primary mt-2">Publish Comment</button> </div> </form> </details> <div class="tip-button-component d-inline" data-controller="live" data-live-name-value="Molecules:TipButton" data-live-url-value="/_components/Molecules:TipButton" id="live-1304649733-0" data-live-props-value="{"recipientPubkey":"247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90","recipientLud16":null,"recipientLud06":null,"open":false,"phase":"idle","selectedTargetKey":"","amount":21,"comment":"","bolt11":"","qrSvg":"","paytoUri":"","paytoQrSvg":"","error":"","resolvedTargets":[],"targetsHydrated":false,"@attributes":{"id":"live-1304649733-0"},"@checksum":"mH9XMrlEsO07hCF0E0vQ3psTlDA0NUohqbH4NYjmH9M="}"> </div> </div> <div data-content--comments-mercure-target="loading" data-controller="content--comments-mercure live" data-content--comments-mercure-coordinate-value="30023:247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90:htmx-040-has-been-released" data-live-name-value="Organisms:Comments" data-live-url-value="/_components/Organisms:Comments" id="live-3570020799-0" data-live-props-value="{"payloadJson":" ","current":"30023:247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90:htmx-040-has-been-released","authorPubkey":null,"rootContext":{"tag":"A","value":"30023:247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90:htmx-040-has-been-released","relay":null,"pubkey":"247fb701c5654ff95867d56889c7734539c7195f6c9bc117374a8a649afaea90","kind":30023},"replyPublishUrl":"\/comments\/publish","replyCsrfToken":"6555c439d8063ec.jl9Ott9XNMFu_yt88hvxCbq2rmubnq7yncfwYUWZV3k.twcJ1IVjZLgKjhg4ul6FQdbhwSXz2uvGyqifGTLWGUvIPBjkrmUGlSq6bg","list":[],"@attributes":{"id":"live-3570020799-0"},"@checksum":"hMVLfMK8KFrT+cGbb\/4RcyB5DuzV0W+bnvukPLB+0wM="}" class="comments" > <div class="comments-list" data-content--comments-mercure-target="list" > <div class="no-comments">No comments yet.</div> </div> </div> </article> </main> <div> <aside id="rightNav"> <header> <button class="close" data-action="click->sidebar-toggle#close" aria-label="Close right sidebar">✕</button> </header> <div class="mt-3 mb-3"> <div class="journey-card" data-controller="utility--login-modal"> <h2>Log In to Get Started</h2> <p>Sign in with your Nostr identity to personalize your experience.</p> <div class="journey-login-actions"> <a class="btn btn-primary" data-action="utility--login-modal#openDialog"> Login</a> </div> <div data-utility--login-modal-target="dialog" class="iu-dialog" style="display:none;"> <div class="iu-backdrop" data-action="click->utility--login-modal#closeDialog"></div> <div class="iu-modal login-modal"> <div class="modal-header login-modal__header"> <h5>Sign in with Nostr</h5> <button type="button" class="close" data-action="click->utility--login-modal#closeDialog">×</button> </div> <div class="modal-body login-modal__body" data-panel="picker"> <p class="login-modal__subtitle">Choose how you want to sign in:</p> <div class="login-options"> <button class="login-option" data-action="click->utility--login-modal#showOption" data-utility--login-modal-option-param="extension" type="button"> <div class="login-option__body"> <div class="login-option__title">Browser Extension</div> <div class="login-option__hint">Alby, nos2x, Nostore, Flamingo & others</div> </div> <div class="login-option__arrow">›</div> </button> <button class="login-option" data-action="click->utility--login-modal#showOption" data-utility--login-modal-option-param="amber" type="button"> <div class="login-option__body"> <div class="login-option__title">Amber</div> <div class="login-option__hint">Android remote signer app</div> </div> <div class="login-option__arrow">›</div> </button> <button class="login-option" data-action="click->utility--login-modal#showOption" data-utility--login-modal-option-param="primal" type="button"> <div class="login-option__body"> <div class="login-option__title">Primal</div> <div class="login-option__hint">Primal wallet remote signer</div> </div> <div class="login-option__arrow">›</div> </button> <button class="login-option" data-action="click->utility--login-modal#showOption" data-utility--login-modal-option-param="remote" type="button"> <div class="login-option__body"> <div class="login-option__title">Remote Signer</div> <div class="login-option__hint">Connect with any NIP-46 compatible signer</div> </div> <div class="login-option__arrow">›</div> </button> </div> </div> <div class="modal-body login-modal__body" data-panel="extension" style="display:none;"> <button class="login-modal__back" type="button" data-action="click->utility--login-modal#backToPicker"> ← Back </button> <h6 class="login-modal__panel-title">Browser Extension</h6> <p class="text-muted">You need a NIP-07 compatible browser extension installed. Sign in with a single click once your extension is active.</p> <ul class="extension-list"> <li><a href="https://github.com/fiatjaf/nos2x" target="_blank" rel="noopener">nos2x</a> — Lightweight key extension (Chrome)</li> <li><a href="https://diegogurpegui.com/nos2x-fox/" target="_blank" rel="noopener">nos2x-fox</a> — Lightweight key extension (Firefox)</li> <li><a href="https://getalby.com/alby-extension" target="_blank" rel="noopener">Alby</a> — Bitcoin & Nostr wallet (Chrome, Firefox)</li> </ul> <div data-utility--login-modal-target="nostrError" class="login-modal__error" style="display:none;"></div> <button class="btn btn--primary" type="button" data-action="click->utility--login-modal#loginExtension"> Connect with Extension </button> </div> <div class="modal-body login-modal__body" data-panel="nip46" style="display:none;"> <button class="login-modal__back" type="button" data-action="click->utility--login-modal#backToPicker"> ← Back </button> <h6 class="login-modal__panel-title" data-nip46-title>…</h6> <p class="text-muted" data-nip46-hint></p> <div class="login-modal__status"> <span data-utility--login-modal-target="status">Initializing…</span> </div> <div class="login-modal__qr"> <div data-utility--login-modal-target="qr"></div> </div> <div class="login-modal__uri-row"> <input type="text" class="form-control font-monospace small" data-utility--login-modal-target="uriInput" readonly placeholder="Initializing…" /> <button class="btn" type="button" data-action="click->utility--login-modal#copyUri" data-utility--login-modal-target="copyButton"> Copy </button> </div> <p class="small text-muted mt-1 mb-0">Paste this into your signer app if it is on the same device.</p> <div data-utility--login-modal-target="amberDeepLink" class="mt-3" style="display:none;"> <a data-utility--login-modal-target="amberDeepLinkBtn" class="btn btn--primary" href="#" rel="noopener"> Open in Amber </a> </div> </div> <div class="modal-body login-modal__body" data-panel="remote" style="display:none;"> <button class="login-modal__back" type="button" data-action="click->utility--login-modal#backToPicker"> ← Back </button> <h6 class="login-modal__panel-title">Remote Signer</h6> <p class="text-muted">Paste your connection string from any NIP-46 compatible signer to connect.</p> <div class="login-modal__status"> <span data-utility--login-modal-target="status">Initializing…</span> </div> <div class="login-modal__qr"> <div data-utility--login-modal-target="qr"></div> </div> <div class="login-modal__uri-row"> <input type="text" class="form-control font-monospace small" data-utility--login-modal-target="uriInput" readonly placeholder="Initializing…" /> <button class="btn" type="button" data-action="click->utility--login-modal#copyUri" data-utility--login-modal-target="copyButton"> Copy </button> </div> <p class="small text-muted mt-1 mb-3">Paste this into your signer app if it is on the same device.</p> <hr class="login-modal__divider" /> <p class="small text-muted mt-3 mb-2">Already have an active signer session? Paste the connection string here:</p> <div class="login-modal__status"> <span data-utility--login-modal-target="remoteStatus"></span> </div> <div class="login-modal__uri-row"> <input type="text" class="form-control font-monospace small" data-utility--login-modal-target="bunkerInput" placeholder="bunker://…" /> <button class="btn btn--primary" type="button" data-action="click->utility--login-modal#connectBunker"> Connect </button> </div> <p class="small text-muted mt-1 mb-0">You can also paste a bunker:// string from an existing signer session.</p> </div> </div> </div> </div> </div> </aside> </div> <div data-controller="ui--back-to-top"> <button class="back-to-top-btn" data-ui--back-to-top-target="button" data-action="click->ui--back-to-top#scrollToTop" aria-label="Back to top" title="Back to top"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="18 15 12 9 6 15"></polyline> </svg> </button> </div> </div> <div data-controller="utility--install-prompt"> <div class="install-prompt-box hidden" data-utility--install-prompt-target="promptBox" > <p>Install this app on your device for quick access?</p> <button data-action="click->utility--install-prompt#install">Yes, install</button> <button data-action="click->utility--install-prompt#dismiss">No thanks</button> </div> </div> <div data-controller="utility--toast" class="toast-container" data-utility--toast-target="container"> </div> <footer> <div class="footer-grid"> <div class="footer-col"> <div class="footer-section"> <ul class="footer-list"> <li><a href="/about">About</a></li> <li><a href="/pricing">Pricing</a></li> <li><a href="/essayist">Essayist</a></li> <li><a href="/subscription/vanity">Vanity Name</a></li> <li><a href="/subscription/active-indexing">Active Indexing</a></li> <li><a href="/subscription/publication-subdomain">Publication Subdomain</a></li> <li><a href="/tos">Terms of Service</a></li> <li><a href="https://support.decentnewsroom.com" target="_blank" rel="noopener">Support</a></li> <li><a href="/feedback">Contact</a></li> <li><a href="/sitemap.xml">Sitemap</a></li> </ul> </div> </div> <div class="footer-col"> <div class="footer-section"> <ul class="footer-list"> <li><a href="/changelog">Changelog</a></li> <li><a href="/roadmap">Roadmap</a></li> <li class="footer-nostr-link"> <img class="footer-icon" src="/assets/icons/nostr-icon-purple-transparent-256x256-k-bX6RP.png" width="16" height="16" alt="Nostr"> <a href="/p/npub1ez09adke4vy8udk3y2skwst8q5chjgqzym9lpq4u58zf96zcl7kqyry2lz" data-turbo-frame="_top"><span> Decent Newsroom </span> </a> </li> <li> <a href="https://github.com/decentnewsroom/newsroom" target="_blank" rel="noopener"> <svg class="footer-icon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z"/></svg> GitHub </a> </li> </ul> </div> </div> </div> <div class="footer-bottom"> <p>© 2026 Decent Newsroom · v0.0.44 Preprint</p> </div> </footer> </body> </html>