I made this online planning poker tool after not being able to find a simple, free (or not ad-ridden), not buggy version elsewhere.<p>I wanted to explore using Go + HTMX to do a realtime app instead of the typical SPA + websocket approach and I was surprised at how easy it was in this simple use case A few features made this really nice to work with:<p>- Go channels to synchronize long-poll updates for clients of a room (nice that timeouts and request cancellations are also channels)<p>- Partial rendering of templates in Go + HTMX swapping out individual elements for really lightweight updates (<1KB compressed)<p>- Use (abuse?) browser caching mechanisms (Last-Modified + If-Modified-Since) to figure out if there was an update necessary (from the browser's perspective) compared to the room state<p>The most puzzling bit was figuring out how to use hx-sync so that any POST request (e.g. clicking on an estimate) should cancel any existing long polling request for updates, since the POST request itself should return an updated version of the room. The semantics are a little hard to grok (what does it mean to sync "on" an element, requests from parent / child elements with hx-sync don't interact the way I think they should, the examples for drop/abort/replace don't seem right).<p>It was also my first time using fly.io to deploy an app, and flyctl makes it amazingly simple to do it. "Horizontal scaling" is done via associating a room with a fly-machine-id, so you can "visit" different machines via the copied room URL, and I successfully avoided using a shared database.<p>Feel free to use it, ask me anything / give me feedback here / open an issue on GitHub!<p>Source: <a href="https://github.com/weiliddat/estimate-work">https://github.com/weiliddat/estimate-work</a>