Two sources of truth
A separate realtime provider means the socket payload and the database row are maintained by different code.
Chat, collaboration, live dashboards, and order tracking all reduce to the same problem: something happened on the server and a browser needs to know now. Model events, broadcast channels, and STX signals connect those two ends without a second realtime service in the middle.
The work that arrives whether you planned for it or not.
A separate realtime provider means the socket payload and the database row are maintained by different code.
Channel access needs the same rules as the HTTP request, or it becomes the way around them.
Who is online, in which room, on how many tabs, and what happens when the process restarts.
A dropped socket without replay shows a user a stale screen that looks live.
All of it in the same install, typed against the rest of your application.
Public, private, and presence channels with authorisation checked through the same gates as routes.
The observe trait emits created, updated, and deleted events, which can broadcast without extra plumbing.
STX signals bind an incoming message to the DOM without a client framework or a store to configure.
Heavy broadcasts go through the queue, so a fan-out to thousands of sockets does not block the request.
The realtime driver runs in buddy dev exactly as it does in production, configured in config/realtime.ts.
Polling and server-sent events remain available where sockets are blocked, behind the same API.
Every one of these ships in the same install. Follow one to see what it covers.
Buddy scaffolds, runs, and ships this the same way it does the rest of the app.
Projects of this shape usually grow into one of these.