Back to work

HelpBot

Multi-tenant RAG chatbot built from a business's own documents.

100% grounded 2026

The dashboard listing every bot, its documents and its embed snippet
The dashboard listing every bot, its documents and its embed snippet

Overview

A generic chatbot cannot tell a customer what your return policy is, because it has never read it. The businesses that most need support automation are the ones least able to build it: an online shop fielding the same questions on WhatsApp all day, with no budget for a 24-hour support desk.

Uploaded documents are split into chunks, embedded with Gemini, and stored as vectors in Postgres. A visitor question is embedded the same way, matched by cosine similarity against that one bot's chunks, and only those chunks reach the language model. The owner pastes a single script tag into their site. Because it is multi-tenant, the real work is isolation: row level security on every table, plus a separate server-only path for the public widget, since anonymous visitors have no Supabase session for RLS to act on.

Key features

Answers carry their sources

Every reply ships the document chunks it was built from, so an owner can confirm the bot is quoting their policy rather than improvising.

Refuses instead of inventing

When nothing similar enough is retrieved the bot says so without calling the model at all, which also stops an empty bot from burning quota.

Isolation enforced twice

RLS covers every table, and the public widget goes through a service-role client whose key never leaves the server and which filters on chatbot_id explicitly.

Grounding measured, not claimed

An eval script puts 14 questions through the real Supabase and Gemini pipeline and scores retrieval hit rate, faithfulness and refusal consistency.

Screens

A test answer shown with the document chunks it was built from
A test answer shown with the document chunks it was built from
Widget settings beside a live preview running the real widget.js in an iframe
Widget settings beside a live preview running the real widget.js in an iframe
Conversation history, including the questions the bot refused
Conversation history, including the questions the bot refused