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.

2.3 KB
the whole widget loader
01
script tag to install
00
third parties reading your chats
Flat geometric illustration of a support inbox: a tall panel of stacked message rows, a forest-green presence dot, and two speech bubbles joined by construction lines
fig.01 — the inbox, at rest

01The 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.

Flat geometric illustration of a small forest-green square plugging into a large storefront façade, joined by a thin curved construction line, a quarter-circle arc rising behind
fig.02 — paste the snippet · talk to visitors

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.

02What's inside

2.1

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.

2.2

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.

2.3

The knowledge base

Write once in markdown; it ships as a public help center and as instant search inside the widget itself.

2.4

The map

A live MapLibre map of every visitor — online or off, where they landed, which page they're reading right now.

2.5

The switch

One toggle flips a conversation between bot and human — same thread, same history, visitor's call.

2.6

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.

2.7

The webhook

Every event, HMAC-signed and retried with backoff, lands on your endpoint — auto-disabled, and you're emailed, if it stops answering.

2.8

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

03The widget

the embed — paste before </head>
<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>
the whole install · a placeholder key and eleven lines

One paste. Nothing broken.

Shadow DOM + iframeyour CSS can't break it, its CSS can't touch yours
SSE, not WebSocketworks through boring proxies
One global$connect, and nothing else
Function callsthe widget can run code you register on your page

04The platform

Flat geometric illustration of an abstract visitor map: a flat landmass with scattered forest-green visitor dots joined by hairline arcs
fig.03 — every visitor on the map · live

Runs on your box.

Self-hostedone Node process, one Postgres — no Redis, no serverless
Web push + emailPlunk fallback when nobody's at the desk
WebhooksHMAC-signed, retried, auto-disabled
Team rolesowner, admin, agent — a tested permission matrix

05The 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.

Flat geometric illustration of a handoff: a circle-and-rectangle robot form passing a baton rectangle to an abstract human figure
fig.04 — human when it matters · bot when it doesn't

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.

Flat geometric illustration of a forest-green sun rising over a thin horizon rule, stepped tiers receding to the edges and two diagonal double-slash bars in the sky

N°007 — Daylight

End the day with
an empty inbox.

Open the inbox