bartblast
Hologram v0.9: Realtime and More
Hologram v0.9 is out! The headline is a realtime layer - your server can now push updates to connected clients with no polling: broadcast an action, and Hologram runs the matching handler on every subscribed client, all in pure Elixir. It was the most complex feature shipped to date. The release also brings the with special form, AI assistant support, a new mix holo task, and more.
Thanks to @prehnRA for the with special form, @ankhers for cutting dev-time memory usage, @mward-sudo for a Node.js fix, @0bvim for porting :erlang.binary_to_term/1, and @sodapopcan for optional page/component callbacks.
Thanks to our sponsors for making sustained development possible: Curiosum (Main Sponsor), Erlang Ecosystem Foundation (Milestones Sponsor), and our GitHub sponsors - Innovation Partner: @sheharyarn, Framework Visionaries: @absowoot, Oban, @Lucassifoni, @robertu, Moss Piglet, and all other GitHub sponsors.
Full details in the blog post: Hologram v0.9: Realtime and More
Trending in News & Updates
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #hex
- #performance











First 10 of 18 Posts
cmo
Is it websockets, SSE, something else?
derek-zhou
According to this it is based on SSE:
jam
Congrats Bart! This is huge. Also great to see
withincluded.bartblast
POST up, SSE down. No WebSockets.
bartblast
Thanks @jam! Yeah,
withwas a great addition to finally land.derek-zhou
When you say POST up, SSE down, do you mean all down stream messages are coming from SSE? In other word, does the reply from POST carry meaningful messages? If they don’t, do you need to have some extra metadata to keep track of the causality between the POST and the resulting message from the SSE channel? If both reply of POST and SSE carry messages, do you need to worry about ordering difference caused by 2 different channels?
bartblast
Here’s the full flow:
A command is a plain
POSTto/hologram/command. The client sends the command name, params, and target component, the server runs yourcommand/3handler, and the resulting action comes back in that same response body.That round trip is async with respect to the event loop: the client fires the POST as a
fetchand keeps running, and when the response resolves the action is scheduled onto the normal action queue, like any other action. So “comes back in the response” means in-band rather than over a separate channel, not blocking.SSE handles the other direction, broadcasting. Subscribed clients hold open an
EventSourcestream, and a broadcast goes out via pub/sub to every subscribed instance, which runs the matching handler locally.The two meet in one place: if a command broadcasts on a channel the originating instance is itself subscribed to, that broadcast piggy-backs on the POST response too (a self-echo), and the instance is dropped from the SSE fan-out for it. So the originator gets both its command’s result and its own broadcasts back in the one response it’s already awaiting, and SSE only carries broadcasts out to the other clients.
derek-zhou
Thanks for the explanation. My concern is that the server and the different client can see events in different order. Let’s say client A broadcasted message_a and client broadcasted message_b, each will have a corresponding outcome. Will it be possible that client A see outcome_a then outcome_b, but client B see outcome_b then outcome_a?
Also, let’s assume the server side see message_b before message_a and compute outcome_b before outcome _a. However, outcome_a may reach client A sooner than outcome_b (different channels, no enforced order). Will it confuse client A?
bartblast
Both can happen, yes. The realtime layer is an abstraction over pub/sub, so it’s fire-and-forget with no ordering guarantee, the same semantics as
Phoenix.PubSuborPhoenix.Channels. When you use it, ordering and data consistency are yours to manage.That’s deliberate, and it’s exactly the gap the upcoming Local-First auto-sync data layer fills (I touched on this briefly in my ElixirConf EU 2026 talk). Instead of broadcasting actions, you subscribe to state, and the framework handles ordering and consistency for you. It will most likely be built on top of this same realtime layer.
The two are complementary, not either-or. Even once auto-sync lands, the raw realtime layer keeps its place for ephemeral, high-frequency events like cursor tracking, typing indicators, or live reactions, where each update supersedes the last and ordering or persistence would just be overhead.
derek-zhou
There is still a difference. With
Phoenix.Channel, I can manage ordering and data consistency at the server side, where I was better equipped. In your case, the hard work would need to happen on the client side.By the way, I am developing something in a similar vein (in a much reduced scope, of course). I also use 2 communication channels (one POST for upstream and one long poll for downstream). In my design, all downstream communications happen in the downstream channel and the replies of POST carry no payload.