Skip to content

nullarch/openconcierge

Repository files navigation

openConcierge

openConcierge

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

License: MIT GitHub stars PRs welcome Only dependency: Postgres + pgvector

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.

The openConcierge agent inbox

Quick start

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:3000

Open 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.

Why openConcierge

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.

Features

The AI concierge

AI answer with source citations
Answers from your docs — with citations.
Retrieval over your knowledge base, generated with Claude, every answer linking the exact source it drew from.
Knowledge base ingestion
Point it at your knowledge.
Paste text or drop in a URL — openConcierge chunks it, embeds it, and the concierge is grounded in minutes.

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 & opsdocker 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 vs. Intercom · Channel Talk · Chatwoot

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.

How it works

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.

  1. Embed the loader snippet (below) on any page.
  2. A visitor opens the bubble and asks a question.
  3. The concierge retrieves from your knowledge base and answers with a citation.
  4. Off-topic or low-confidence → it hands off; the chat is flagged needs human.
  5. An agent replies from /desk; the visitor sees it live over SSE.
  6. Everyone offline? The visitor is emailed the reply when it comes.
The customer-facing chat widget

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>

Tech stack

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/NOTIFYServer-Sent Events (app-owned, no websocket vendor)
  • AIClaude (haiku-4-5 routing · sonnet-5 answers · opus-4-8 hard cases) + a pluggable embeddings model (Voyage / OpenAI / self-hosted bge-m3)
  • Attachments — local filesystem or any S3-compatible bucket

Self-hosting

Docker (recommended)

cp .env.example .env
docker compose up        # Postgres+pgvector + app; migrations + seed on boot → :3000

Put 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).

Local development

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:3000

npm 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.

Managed hosting

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.

Configuration

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.

Roadmap

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.

Contributing

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.

Security

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).

License

MIT © openConcierge contributors. Use it, fork it, ship it.

About

Open-source, self-hosted AI concierge for customer support — answers from your docs with citations. Postgres-native alternative to Intercom & Chatwoot.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages