Building a live-chat widget: real-time WebSockets, one script tagβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββο»Ώββββο»Ώββββββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββο»Ώββββο»Ώββββββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
How I built an embeddable live-chat widget: real-time messaging over WebSockets with Django Channels, a Shadow-DOM widget, an operator inbox, and AI-assisted replies.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββββββββββο»Ώβο»Ώβββο»Ώβο»Ώβββββββο»Ώβββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββββββββββο»Ώβο»Ώβββο»Ώβο»Ώβββββββο»Ώβββο»Ώββββββββο»Ώο»Ώββο»Ώββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ

I'd built plenty of features over the years, but I'd never actually built real-time. So I set out to learn WebSockets properly β by shipping something real: an embeddable live-chat widget in the Intercom / Crisp / Tawk.to mould, open source and self-hostable.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
What it doesβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
A site owner drops one script tag on any page and a chat widget appears. Visitors chat in real time with an operator who replies from a dashboard. Around that core it does typing indicators, online/away presence, pre-chat forms, canned responses, an AI βSuggest a replyβ button, post-chat ratings, and branded email transcripts β all multi-tenant, so one deployment serves many sites.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβο»Ώβββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβο»Ώβββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
How it's builtβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
The backend is Django with Channels running over ASGI (Daphne), and a Redis channel layer fanning messages out across connections β that's what makes it genuinely real-time rather than polled. Both ends are WebSocket clients: the embedded widget and the operator inbox. The widget itself is dependency-free vanilla JS rendered inside a Shadow DOM, so it can never clash with the host page's CSS, and it's driven by a single site key. AI drafts stream token-by-token from Claude over the same operator socket.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
One concept per phaseβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
I built it deploy-first and in thin slices β one new concept per phase, live on a real URL before adding the next. Phase 0 was just an echo over a WebSocket, deployed. Then real messaging, the embeddable widget, presence, multi-tenancy, AI replies, canned responses, pre-chat, end-chat, email transcripts, and post-chat ratings. The rule was βboring and finished beats clever and abandonedβ β shipping each phase before starting the next kept the momentum honest.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβο»Ώβββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβο»Ώβββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
What I'd build nextβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
A few things I deliberately left on the roadmap: a feedback / CSAT dashboard over the rating data; an operator history view to reopen and review ended chats; and richer branding β a logo in the widget and in the email transcripts. Further out sit the ideas that would turn it from a portfolio piece into a product: no-code chatbot flows, a multi-channel inbox (email, WhatsApp, Instagram), knowledge-base / RAG grounding for the AI, proactive triggered messages, analytics, and horizontal scaling across many Daphne processes β which Redis already makes correct.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ
Try the βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβlive demoβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ, or read the full write-up on the βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβproject pageβββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ.βββββο»Ώβο»Ώββββββο»Ώο»Ώβο»Ώβββββββββο»Ώββββββο»Ώββββββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββββββο»Ώβββο»Ώββββο»Ώβββββββο»Ώο»Ώββββββο»Ώββββββββββο»Ώβββββββββββββββο»Ώββββββββο»Ώο»Ώβο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώββο»Ώο»Ώββββββο»Ώββο»Ώββββββββο»Ώββο»Ώββββο»Ώο»Ώβββββββββββββο»Ώββββο»Ώο»Ώββο»Ώβββο»Ώο»Ώβββββββββο»Ώο»Ώββο»Ώβββο»Ώβββββββο»Ώβο»Ώββββββο»Ώββο»Ώβββββββο»Ώββββββββο»Ώο»Ώββο»Ώββο»Ώβο»Ώβββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββο»Ώβο»Ώβο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβο»Ώβο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββο»Ώο»Ώο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώββββο»Ώββο»Ώο»Ώββββββο»Ώβββββββο»Ώβο»Ώβο»Ώβββο»Ώββββββββββββο»Ώο»Ώβββββββββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώββο»Ώββββββο»Ώββββββββο»Ώβββββββββββο»Ώββββο»Ώββο»Ώβββο»Ώββββββο»Ώββββββββο»Ώββββο»Ώβββββββββο»Ώβββββββο»Ώβββο»Ώβββο»Ώβββββββο»Ώο»Ώβββββββο»Ώβββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββββββββο»Ώβββββββββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβββο»Ώβββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββββο»Ώββββββββββο»Ώββββββο»Ώββββββββο»Ώββββββο»Ώββββββββο»Ώο»Ώβββο»Ώβββββο»Ώβββββββο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββββο»Ώβββο»Ώβββο»Ώβο»Ώβο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώββββββββο»Ώββο»Ώβββββββο»Ώβββο»Ώβββββββο»Ώβββββββο»Ώβββο»Ώβο»Ώβο»Ώβββββββββο»Ώβο»Ώβββββββο»Ώβββββββο»Ώο»Ώββο»Ώβββο»Ώββββββββο»Ώββββββο»Ώβο»Ώβββββββββββββββββο»Ώο»Ώβ