
The problem
Live chat is table stakes for SaaS and marketing sites — but adding it usually means paying per-seat for a heavy tool you can't customise, or building real-time infrastructure your team doesn't have the bandwidth for.
Embedding is the deceptively hard part: the widget has to run on any site without clashing with the host's styles, hold a reliable connection, and handle many concurrent conversations at once.
Everything a live chat needs
Real-time messaging, a multi-site operator inbox, and AI-assisted replies — in one embeddable, self-hostable widget.
Drop-in widget
One script tag adds it to any site. The widget renders in an isolated Shadow DOM — immune to the host page's CSS — and is themed from the dashboard, not the snippet.
Real-time over WebSockets
Django Channels and a Redis channel layer fan messages out instantly. Typing indicators and online/away presence update live on both sides — no polling, no refresh.
Operator inbox
A multi-site dashboard with canned replies, end-chat, branded email transcripts, and post-chat ratings — the operator is itself a WebSocket client, so it updates live too.
AI-assisted replies
A “✨ Suggest” button streams a drafted reply from Claude straight into the composer. The operator edits and sends it — the AI never replies on its own.
How I built it
Real-time messaging runs over WebSockets with Django Channels (ASGI), backed by Redis as the channel layer routing messages between visitor and operator connections — so it scales past a single process. Conversations persist in PostgreSQL, and the whole thing is deployed on Railway.
The widget itself is a Shadow-DOM web component loaded by a single script tag — fully isolated, so it can't break, or be broken by, the host page's CSS. Operators get an inbox with AI-assisted replies to cut response time.
See it in action

The embedded widget
The visitor's view: a floating bubble expands into a chat panel, themed to the site and isolated in a Shadow DOM.

Operator inbox
One dashboard across every site — live threads, presence, and unread counts, replying in real time.

Canned responses
Type “/” in the composer to filter and insert a saved reply — one of the operator tools alongside AI drafts and transcripts.
Frequently asked questions
The short version — the live demo has the rest.
Add live chat to a page in one line
Open the live demo, send a message as a visitor, and reply from the operator inbox — and watch it flow in real time.
Need an embeddable or real-time feature built?
This is exactly the kind of thing I build for teams — end to end, from one script tag to a deployed, tested feature.