Thanks for the kind words and the great breakdown!
On the HTTP choice - I touched on this a bit in my reply above, but to expand on your specific question: you’re right that HTTP is more predictable and durable as a transport. That was definitely part of the reasoning. The bigger driver though was that WebSockets forced me into distributed state for cookies and sessions - I had a CRDT-based cookie store syncing across nodes, and while it worked, it was a debugging nightmare. Cookies and sessions just work naturally with request-response. And then the practical stuff adds up - firewalls, no HTTP caching, mobile reconnection being flakier with persistent sockets, and each WebSocket holding a persistent process and connection state per client which eats more memory. The key insight was that Hologram doesn’t need WebSockets the way LiveView does - since the code runs in the browser, the server only gets hit for page fetching and commands, not every interaction. HTTP persistent connections are plenty for that, and it maps nicely onto offline queuing for local-first too.
On your wishlist - good news on the zero-latency interactivity front - Hologram already gives you that! Since the code runs directly in the browser, clicks and touches are handled on the client in step with the browser’s event loop - no server round-trip needed.
Near real-time updates on the client is definitely on the list too - that’s where the sync layer comes in.
As for offline resilience - the seconds/minutes case is definitely the most common scenario. Ideally I’d love for it to work offline indefinitely on the existing schema - that way we don’t have to make compromises. Not sure yet if that’s fully achievable, but it’s worth aiming high and seeing where the constraints actually bite.
On conflict strategies - First One Wins is clean and covers most cases, I agree. Throw Both Away feels more niche - curious if you have a specific use case in mind for that one? But the priority-based example is what really caught my eye - in-store terminal beating a shopping cart is a great real-world scenario. That’s essentially a “trust hierarchy” where some clients are more authoritative than others. I could see this being a declarative per-resource policy rather than a global setting.
Actually, quick follow-up on that: when the in-store terminal wins over the shopping cart, what should happen on the cart client? Silent override, a notification, something else? Curious what you’d want as a developer there.
On ordering - good call on this. Single-client ordering is something you get for free with WebSockets, but with HTTP separate requests can arrive out of order, so it needs to be handled explicitly. Cross-client ordering adds another layer on top of that. Both are on my radar - haven’t settled on the exact approach yet, there are a few directions I’m exploring.
Great timing with your upcoming project btw - would love to hear more about it as the design evolves!























