Live HTML Over SSE: Pushing Rendered Fragments With app.Render in Fiber v3.6
A support team works from a shared queue page. Every agent has it open all day, and the page polls the server every five seconds. Two things go wrong with that. The queue is never quite current, so two agents regularly click "Claim" on the same ticket within the same five seconds, and one of them finds out a few seconds later that their work was wasted. And the polling is mostly empty: thirty open tabs ask the server 360 times a minute whether anything happened, and the answer is nearly always no.
Server-Sent Events fix both. The server keeps one response open per tab and writes to it when something changes. The question is what to write. Sending JSON means a second rendering layer in the browser that has to produce the same markup as your Go templates. Sending HTML means you render the fragment on the server with the same template that renders the full page, and the browser only has to put it in the right place. With htmx and its SSE extension, that last part needs no JavaScript of your own.
Rendering a template used to be tied to a request in Fiber: c.Render
writes into the response of the request at hand. An update that one agent
triggers has to reach thirty other streams, and none of them is the request
that caused it. Fiber v3.6.0
added app.Render, which writes a template through the
configured view engine into any io.Writer, with no request involved. This
post builds the live queue around it: render each update once, number it,
fan it out to every subscriber, replay what a reconnecting browser missed and
send a full reset when replay is impossible. Everything was built and tested
against Fiber v3.6.1
with html/v3.1.0
of the template engine, htmx 2.0.11 and htmx-ext-sse 2.2.4. app.Render needs
Fiber v3.6.0 or later, which requires Go 1.26. The SSE middleware
has been there since v3.3.0.
