N°001 — A calmer support tool
Every visitor,
one calm inbox.
Connect is a self-hosted support platform — an embeddable chat widget, a live inbox your team works from, and a knowledge base, running on one Node process and one Postgres. Your data stays in your database.

01 —The idea
Support tools turned into rented seats in someone else's cloud. We built the one you host yourself.
Somewhere along the way, chatting with your customers started to mean renting a per-agent seat on someone else's servers — your conversations sitting in a database you'll never see. Connect flips that: self-hosted1, one Node process, one Postgres, your data in your database.
A widget your visitors talk into, an inbox your team works from, and a knowledge base that catches the easy questions before they reach a human. Every piece ships in the same install — nothing metered, nothing upsold.

1 Self-hosted, not self-assembled: one Docker image, one Postgres. No Redis to babysit, no serverless functions timing out mid-conversation, no phone-home telemetry. The one real requirement: SSE is an unbounded HTTP response, so you need a host that lets a Node process run long — not a function that hangs up early.
02 —What's inside
The widget
A 2.3 KB loader unpacks into a shadow-DOM launcher and a cross-origin iframe. The host's CSS can't break it; its CSS can't touch the host.
The inbox
Three live panes over SSE: the conversation list, the thread, and everything you know about the visitor — filters, unread badges, typing indicators included.
The knowledge base
Write once in markdown; it ships as a public help center and as instant search inside the widget itself.
The map
A live MapLibre map of every visitor — online or off, where they landed, which page they're reading right now.
The switch
One toggle flips a conversation between bot and human — same thread, same history, visitor's call.
The push
Web push when the tab's hidden, a missed-message email when it sits unread too long, silence the moment you're actually looking.
The webhook
Every event, HMAC-signed and retried with backoff, lands on your endpoint — auto-disabled, and you're emailed, if it stops answering.
The search
Full-text search across every conversation and every visitor record — the thread from months ago surfaces as fast as you can type.
also in the box — canned responses · private notes · read receipts · typing indicators · image uploads · emoji picker · presence · rate limits · team roles & invites · installable pwa · google sign-in · public help center
03 —The widget
<script>
window.$connect = window.$connect || [];
window.CONNECT_WEBSITE_KEY = "wk_xxxxxxxxxxxxxxxxxxxxxxxx";
// optional: window.CONNECT_TOKEN_ID = "<per-user token from customer backend>";
(function () {
var s = document.createElement("script");
s.src = "https://<app-host>/widget/v1.js";
s.async = 1;
document.head.appendChild(s);
})();
</script>One paste. Nothing broken.
04 —The platform

Runs on your box.
05 —The handoff
Human when it matters. Bot when it doesn't.
Every conversation carries a switch: a visitor can flip themselves to the bot, and an agent can take the thread back the second it turns human-shaped. Same thread either way — nothing lost, nothing re-explained.
The switch, the client function registry, and the pgvector foundations under the knowledge base are shipped today. The agent that uses them is the roadmap — Connect is built AI-ready, not AI-hyped.

N°006 — AI-ready
The bot seat is already at the table.
A working AI ⇄ human switch, a function registry the bot can call, and a knowledge base with pgvector underneath. When you bring an agent, the wiring is already done.
