The open-source AI concierge for customer support.
A self-hosted alternative to Intercom & Channel Talk that answers from your docs — with citations — and installs in one command.
Quick start · Features · How it works · Self-hosting · Roadmap
Note
The full MVP is built and npm run build passes. The golden path — embeddable widget → AI concierge that answers from your docs with citations → human handoff → live inbox — is wired end to end, alongside the day-to-day essentials a support team needs (teams, auto-assignment, saved replies, business hours, attachments, white-label). It's young and pre-1.0: a full AI run needs your own Anthropic + embeddings keys, and it hasn't been hardened in production yet. Kick the tires, open an issue, and ⭐ to follow along.
One command brings up Postgres + pgvector and the app, running migrations and seed on boot.
git clone https://github.com/nullarch/openconcierge.git
cd openconcierge
cp .env.example .env # add ANTHROPIC_API_KEY + an embeddings key for the AI concierge
docker compose up # → http://localhost:3000Open http://localhost:3000, create the first account — the first sign-up becomes the channel owner — and you land on the inbox. No Supabase, no Redis, no managed services: it's one Postgres and a Node process.
Support tooling today is either closed SaaS (Intercom, Channel Talk) that rents you an AI add-on and keeps your customers' data, or an open-source desk (Chatwoot) where AI is bolted on afterward. openConcierge is AI-first and self-hosted from line one: the concierge answers from your knowledge base with real citations, hands off cleanly to a human when it's unsure, and every message stays on infrastructure you control.
- Grounded, not guessing. Answers are retrieved from your docs (
pgvector) and generated with Claude — each carrying the source citation it used. No hallucinated refund policies. - One command to run.
docker compose up. One Postgres, no Redis, no Supabase, no vendor account. - Owns its realtime. Live messages ride Postgres
LISTEN/NOTIFY→ Server-Sent Events — not a third-party websocket service. - Yours to brand. White-label the widget and desk — your logo, your color, hide the "openConcierge" name entirely.
- Your data, your server. Self-hosted means customer conversations never leave your infrastructure.
AI concierge — RAG over your docs · Claude-generated answers with citations · confidence-based handoff to a human · a router that picks the right source · Haiku / Sonnet / Opus tiers for cost vs. quality.
Inbox & agents — one live inbox · filters (all / mine / unassigned / open / closed) · message search · tags · assign, snooze & close · teams and agent online/away status · auto-assignment to the least-loaded agent · saved replies (# in the composer) · desktop + sound + tab-badge notifications.
Embeddable widget — a single <script> tag · isolated iframe (no CSS bleed into the host page) · anonymous visitors · file & image attachments · full-screen on mobile · realtime replies · white-label logo & color.
Self-host & ops — docker compose up · plain Postgres + pgvector · filesystem or S3 attachments · business hours + away message · an offline email fallback (the visitor is emailed when an agent replies after they've left) · a settings page for the channel, hours, teams & members.
| openConcierge | Intercom · Channel Talk | Chatwoot | |
|---|---|---|---|
| Open source | ✅ MIT | ❌ Proprietary | ✅ MIT |
| Self-host in one command | ✅ docker compose up |
❌ | ✅ |
| AI answers grounded in your docs, with citations | ✅ built-in, core | 💰 paid add-on | add-on¹ |
| Runs on a single Postgres — no Redis/Supabase | ✅ | — | ❌ |
| Customer data stays on your infrastructure | ✅ | ❌ | ✅ |
¹ Chatwoot's Captain AI is a separate add-on. This is a good-faith comparison and may lag each product's latest release.
Drop one <script> on your site → a chat bubble appears → a visitor asks a question → the AI answers instantly, grounded in your docs, with a citation → an ambiguous question hands off → an agent picks it up in the live inbox and replies → the visitor sees it in realtime.
The embed snippet — what a business pastes on its site (swap in your host):
<script>
(function () {
var w = window, d = document; if (w.SupportChat) return;
var ch = function () { ch.q.push(arguments); }; ch.q = []; w.SupportChat = ch;
var l = function () {
var s = d.createElement("script"); s.async = true;
s.src = "https://YOUR_HOST/loader.js";
var x = d.getElementsByTagName("script")[0]; x.parentNode.insertBefore(s, x);
};
if (d.readyState === "complete") l(); else w.addEventListener("load", l);
})();
SupportChat("boot");
</script>A deliberately small, boring, self-hostable stack — one Postgres, no Supabase, no Redis.
- Next.js 15 (App Router) + React 19 + TypeScript — the desk, widget & API
- Tailwind CSS v4 — the white-tone design system
- Postgres 15+ with
pgvector— the only datastore, queried directly via porsager/postgres (no ORM, no PostgREST) - In-app auth — scrypt + a signed session cookie (no external auth service)
- Realtime — Postgres
LISTEN/NOTIFY→ Server-Sent Events (app-owned, no websocket vendor) - AI — Claude (
haiku-4-5routing ·sonnet-5answers ·opus-4-8hard cases) + a pluggable embeddings model (Voyage / OpenAI / self-hosted bge-m3) - Attachments — local filesystem or any S3-compatible bucket
cp .env.example .env
docker compose up # Postgres+pgvector + app; migrations + seed on boot → :3000Put a reverse proxy in front of :3000, set APP_URL to your public origin, and keep a volume on /data/uploads (or switch to the S3 driver).
Needs Node 20+ and a Postgres 15+ with the pgvector extension (the pgvector/pgvector image, or CREATE EXTENSION vector on your own Postgres).
cp .env.example .env # set DATABASE_URL + ANTHROPIC_API_KEY + an embeddings key
npm install
npm run db:migrate # apply db/migrations/*.sql + db/seed.sql
npm run dev # → http://localhost:3000npm run build runs the production build and the TypeScript type-check. npm run db:reset drops and re-applies migrations + seed.
Verifying the AI concierge works? The live golden path (grounded answer + citations + handoff) needs your keys and a pgvector Postgres — see VERIFYING.md.
Runs on any Node host (Fly.io, Railway, Render, a plain VM) against a managed Postgres that has pgvector (Neon, Supabase Postgres, RDS, Crunchy…). Set the env below and run npm run db:migrate once.
Important
Realtime uses LISTEN/NOTIFY + SSE over a long-lived process, so openConcierge needs a persistent server — not a purely serverless target.
| Variable | Required | What it does |
|---|---|---|
DATABASE_URL |
✅ | Postgres connection string (the database must have pgvector) |
APP_URL |
✅ | Public origin — used for the loader/iframe CSP and email links |
ANTHROPIC_API_KEY |
for AI | Claude API key that powers the concierge |
EMBEDDINGS_PROVIDER · _API_KEY · _MODEL · EMBEDDING_DIM |
for AI | voyage | openai | local (bge-m3); the dimension must match the schema |
STORAGE_DRIVER |
– | fs (default) or s3 for attachments |
EMAIL_PROVIDER |
– | none (default) or resend for the offline email fallback |
See .env.example for the full, commented list.
The MVP is built across five milestones:
| # | Milestone | Status |
|---|---|---|
| 1 | Skeleton — Next.js + pgvector + auth + realtime spine | ✅ |
| 2 | Conversation spine + agent inbox + realtime | ✅ |
| 3 | Embeddable widget — loader + iframe + anonymous visitors | ✅ |
| 4 | AI concierge — ingest + RAG + citations + handoff | ✅ |
| 5 | Launch polish — seed, design system, white-label, error states | ✅ |
Next up (post-MVP): streaming AI responses · PDF ingestion · analytics & reports · full-text + hybrid search · SSO / RBAC · GDPR export & delete · multi-tenant SaaS mode · omnichannel (email / social). Want one of these? Open an issue or send a PR.
Contributions are welcome — issues, features, docs, design. See CONTRIBUTING.md for dev setup (it's the same docker compose up / npm run dev). Two house rules: make sure npm run build (type-check + build) passes before opening a PR, and add a new timestamped file in db/migrations/ rather than editing one that's already applied.
openConcierge handles customer conversations and PII, so please don't file security issues in public. Report vulnerabilities privately through GitHub Security Advisories. Because you self-host, this data lives on your infrastructure — use a strong DATABASE_URL, terminate TLS at your proxy, and keep .env out of version control (it's already gitignored).
MIT © openConcierge contributors. Use it, fork it, ship it.



