Ok, did a proof of concept.
Global hook at app.html.heex
<main id="main" phx-hook="MainHook" class="px-4 py-20 sm:px-6 lg:px-8">
<div class="mx-auto max-w-2xl">
<.flash_group flash={@flash} />
<%= @inner_content %>
</div>
</main>
The hook
Hooks.MainHook = {
mounted() {
let token = localStorage.getItem("uuid")
if(token == null) {
// here you should push an event to the server and fetch a
// tamper proof token and save it to localStorage and
// all other security considerations
token = "1234"
}
this.pushEvent("subscribe_to_channel", {uuid: token})
}
}
The module attaching the server hooks
defmodule ExampleWeb.MultipleTabs do
import Phoenix.LiveView
def on_mount(:default, _params, _session, socket) do
{:cont,
socket
|> attach_hook(
"subscribe_to_channel",
:handle_event,
&subscribe_to_channel/3
)
|> attach_hook(:handle_reload, :handle_info, &reload_page/2)}
end
defp reload_page(_msg, socket) do
# Here you'll need to figure out a way to get the url
# to redirect to the correct place
{:cont, socket |> redirect(to: "/")}
end
defp subscribe_to_channel("subscribe_to_channel", %{"uuid" => uuid}, socket) do
# Here you should validate the token before subscribing
Phoenix.PubSub.subscribe(Example.PubSub, "reload##{uuid}")
{:cont, socket}
end
end
And then just put it in a live session in the router
live_session :default, on_mount: ExampleWeb.MultipleTabs do
live "/", HomeLive
end
Then you can call Phoenix.PubSub.broadcast(Example.PubSub, "reload#1234", []) from anywhere and all pages will redirect to /.
Security considerations aside it is pretty simple.




















