bartblast

bartblast

Creator of Hologram

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

First 10 of 18 Posts Switch mode

cmo

cmo

Is it websockets, SSE, something else?

derek-zhou

derek-zhou

According to this it is based on SSE:

jam

jam

Congrats Bart! This is huge. Also great to see with included.

bartblast

bartblast OP

Creator of Hologram

POST up, SSE down. No WebSockets.

bartblast

bartblast OP

Creator of Hologram

Thanks @jam! Yeah, with was a great addition to finally land.

derek-zhou

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

bartblast OP

Creator of Hologram

Here’s the full flow:

A command is a plain POST to /hologram/command. The client sends the command name, params, and target component, the server runs your command/3 handler, 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 fetch and 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 EventSource stream, 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

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

bartblast OP

Creator of Hologram

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.PubSub or Phoenix.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

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.

Where Next?

Trending in News & Updates Top

bartblast
After building Hologram and sharing updates across various places, I’ve realized there’s a lot happening that doesn’t always make it to t...
New
kip
I’m a bit excited to announce that Localize and friends are now at release 1.0. Even though it’s a 1.0 release, it stands on 8 years of w...
New
nseaSeb
Just published search_ash 0.5.0 (with search_core 0.4.0) on Hex. What’s new: synonyms You can now declare a synonym dictionary per lang...
New
mudasobwa
After years of struggling I made StreamData dependency optional. Finitomata.ExUnit got testing primitives for Persistence. Full back co...
New
polvalente
We have released v0.13 of nx, exla and torchx, along with a recently released emlx v0.4. Nx This is where the bulk of the updates happen...
New
sullyMusty
ActiveMemory 0.8.0 is on Hex. It’s an in-memory store built on ETS and Mnesia: typed records you query by **any attribute**, not just a ...
New
bartblast
Hologram v0.11 is out! Two headline features this release. First, Elixir regexes now run in the browser. They were server-only until now,...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
akoutmos
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New

We're in Beta

About us Mission Statement