Skip to content
Back to Labs

SignalDesk

AI Support Chat That Never Makes Things Up

Next.js 16React 19TypeScriptSupabaseOpenAIRAGTailwind CSS v4

Project Overview

SignalDesk is an AI-powered support chat widget that answers questions exclusively from your website content. Unlike generic chatbots that can hallucinate or make up information, SignalDesk uses Retrieval Augmented Generation (RAG)to ensure every response is grounded in your actual documentation, FAQs, or help center pages.

The system crawls and indexes your website content into a vector database powered by Supabase with pgvector. When users ask questions, it performs semantic search to find the most relevant content chunks, then uses OpenAI's GPT modelsto generate accurate, contextual responses with source citations.

With support for multiple languages, automatic content re-indexing, and a simple one-line embed script, SignalDesk makes it easy to provide trustworthy AI support without the risk of embarrassing hallucinations.

The Problem with AI Chatbots

⚠️

AI Hallucinations

Generic chatbots make up answers, citing policies that don't exist. Customers notice. Trust erodes.

Inconsistent Answers

Different responses for the same question. Support quality varies wildly. No single source of truth.

🛡️

No Control

Public LLMs have no guardrails for your brand. One wrong answer can become a viral screenshot.

How SignalDesk Solves This

Content-Only Answers

Every response comes from your indexed pages. Nothing made up. Nothing borrowed from the internet.

📄

Admits Uncertainty

If the answer isn't in your content, SignalDesk says "I don't know." No guessing. No fabricating.

🔗

Source Citations

Every answer links back to the page it came from. Users can verify. You stay accountable.

How RAG Works in SignalDesk

Retrieval Augmented Generation (RAG) is a technique that combines the power of large language models with a curated knowledge base. Instead of relying solely on the LLM's training data, RAG retrieves relevant documents at query time and uses them as context for generating responses.

The RAG Pipeline

1

Crawl & Index

Your website content is crawled, chunked, and converted to vector embeddings

2

User Query

User asks a question through the chat widget

3

Vector Search

Semantic search finds the most relevant content chunks from your knowledge base

4

Generate Response

GPT generates an answer using ONLY the retrieved content as context

Example: RAG Query Flow

User question:

"What are your shipping options?"

Vector search retrieves:

// Supabase pgvector similarity search
const { data: chunks } = await supabase.rpc(
  'match_documents',
  {
    query_embedding: embedQuery("shipping options"),
    match_threshold: 0.78,
    match_count: 5
  }
)

// Returns relevant chunks from:
// - /shipping-policy (similarity: 0.92)
// - /faq#delivery (similarity: 0.87)
// - /returns (similarity: 0.81)

SignalDesk response:

We offer three shipping options: Standard (7-12 business days), Express (3-5 business days), and Next-Day delivery for orders placed before 2 PM.

📄 Source: Shipping Policy

Technical Architecture

Frontend Stack

  • Framework: Next.js 16 App Router
  • UI Library: React 19
  • Language: TypeScript 5
  • Styling: Tailwind CSS v4
  • Components: shadcn/ui + Radix UI
  • Icons: Lucide React

Backend & AI Stack

  • Database: Supabase (PostgreSQL)
  • Vector Store: pgvector extension
  • Embeddings: OpenAI text-embedding-3-small
  • LLM: OpenAI GPT-4o-mini
  • Crawler: Custom with cheerio
  • Testing: Vitest + Testing Library
Supabase Schema Overview
-- Knowledge base documents table
CREATE TABLE documents (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  content TEXT NOT NULL,
  metadata JSONB,
  embedding VECTOR(1536),  -- OpenAI embedding dimensions
  language TEXT DEFAULT 'en',
  source_url TEXT,
  created_at TIMESTAMPTZ DEFAULT NOW()
);

-- Vector similarity search function
CREATE FUNCTION match_documents(
  query_embedding VECTOR(1536),
  match_threshold FLOAT,
  match_count INT
) RETURNS TABLE (
  id UUID,
  content TEXT,
  metadata JSONB,
  similarity FLOAT
)

Key Features

Chat Experience

  • Real-time streaming responses
  • Source citations with every answer
  • Graceful "I don't know" handling
  • Conversation history within session
  • Mobile-responsive widget design

Multi-Language Support

  • Separate indexes per language
  • Auto-detect user language
  • Language-specific knowledge bases
  • Localized response generation
  • Easy to add new languages

Content Indexing

  • Automatic website crawling
  • Smart content chunking
  • Monthly automatic re-indexing
  • Manual refresh trigger
  • robots.txt compliance

Easy Integration

  • One-line script embed
  • Works with any website/CMS
  • Customizable colors & branding
  • Position configuration
  • Custom welcome messages

Simple Integration

Add SignalDesk to any website with a single script tag:

<!-- Add before closing </body> tag -->
<script
  src="https://signaldesk.mikul.me/widget.js"
  data-brand="Your Brand"
  data-color="#10b981"
  data-position="bottom-right"
  data-lang="en"
></script>

Ideal Use Cases

📚

Help Centers

Index your knowledge base and let users find answers instantly

📖

Documentation Sites

Technical docs, API references, and tutorials

🛒

E-commerce FAQs

Shipping, returns, product questions

💻

SaaS Products

Feature explanations and onboarding help

🏢

Service Businesses

Pricing, availability, and service details

🎓

Educational Platforms

Course info, enrollment, and policies

Why Accuracy Matters

  • Brand Trust: Wrong information from AI can damage customer relationships and brand reputation
  • Legal Compliance: Accurate product/service information prevents disputes and liability
  • Support Efficiency: Accurate first responses reduce follow-up tickets and escalations
  • User Experience: Verifiable answers with sources build confidence in the chat system

Experience SignalDesk