The heavyweight Vaquill widget. A Next.js 15 + React 19 chat surface with a persistent conversation sidebar, voice mode (TTS + STT), cross-tab sync via BroadcastChannel, gamification (XP and streaks), and multiple citation display modes. Use this when you want a Vaquill-style full experience embedded in your site rather than the minimal proxy widget. Source: github.com/Vaquill-AI/integrations/vaquill-widget-pro.Documentation Index
Fetch the complete documentation index at: https://vaquill.ai/docs/llms.txt
Use this file to discover all available pages before exploring further.
Need a leaner build? The Embedded Chat Widget ships with about 10 components, US-only focus, streaming SSE, and a single-file embed loader.
What you get
- Persistent conversation sidebar with rename, delete, and search
- Voice mode - microphone input with VAD plus TTS playback
- Cross-tab sync via BroadcastChannel - threads stay consistent across browser tabs
- Gamification - XP, streaks, and engagement progress
- Citation display modes - cards, tabs, accordion, or pills
- TTS provider matrix - OpenAI, ElevenLabs, Edge, Google, StreamElements
- Multi-turn
chatHistorypreserved server-side in a process-local session map - Both embed modes - floating button and iframe
- IndexedDB + localStorage fallback for client-side persistence
Status and caveats
The chat-completion plumbing insrc/lib/ai/vaquill-client.ts talks to the real Vaquill API (/ask and /ask/stream) for both streaming and non-streaming paths. A few legacy endpoints from the upstream RAG-widget fork are stubbed and degrade gracefully: per-message feedback persists only to the local session cache, citation-by-id lookup and file uploads throw a clear “not supported” error, and agent-settings return Vaquill-flavoured defaults.
The AgentCapability enum (fastest-responses, optimal-choice, advanced-reasoning, complex-tasks) maps onto Vaquill’s mode: the first two go to standard, the latter two go to deep.
Prerequisites
- Node.js 18+
- A Vaquill API key (
vq_key_...) from app.vaquill.ai/developer - Optional: an OpenAI API key if you want voice mode (TTS / STT)
Quickstart
Run the dev server
Configuration
The full list lives in.env.example. The minimum set:
Key flags
| Variable | Description |
|---|---|
VAQUILL_API_KEY | Your Vaquill key. Required. |
USE_VAQUILL | Must be true to route chat to the Vaquill API. |
VAQUILL_STREAM | true to use SSE streaming, false for buffered responses. |
TTS_PROVIDER | Pick a TTS engine. See the matrix below. |
NEXT_PUBLIC_CITATION_DISPLAY_MODE | Source layout: cards, tabs, accordion, pills, or all. |
TTS providers
| Provider | Quality | Speed | Cost |
|---|---|---|---|
| OpenAI | High | Fast | Paid |
| ElevenLabs | Very High | Medium | Paid |
| Edge TTS | Good | Fast | Free |
| Google TTS | Medium | Fast | Free |
| StreamElements | Medium | Fast | Free |
TTS_PROVIDER=... in .env.local.
Architecture
Embedding
The widget ships a single-file loader you can drop into any site:examples/ folder has drop-in examples for WordPress, Shopify, React, and plain HTML.
Deployment
Vercel (recommended)
Railway
Development commands
Troubleshooting
Voice mode not working- Production must be served over HTTPS (browser mic access requires it).
- Grant the browser microphone permission for the site origin.
- Verify
OPENAI_API_KEYis set andTTS_PROVIDERis configured. - On Safari and iOS, WebM audio is unsupported - the widget falls back to MP4.
- Verify
VAQUILL_API_KEYandUSE_VAQUILL=true. - Open DevTools Network tab and look for the request to
/api/inferenceor/api/inference-stream. - Test the key directly:
curl -H "Authorization: Bearer vq_key_..." https://api.vaquill.ai/api/v1/health.
Browser support
| Browser | Support |
|---|---|
| Chrome / Edge | Full |
| Firefox | Full |
| Safari / iOS | MP4 audio fallback (WebM unsupported); mic requires HTTPS |
Related
Embedded Chat Widget
Leaner Next.js variant pinned to the US.
Docker Widget
Self-host with Docker Compose and embed via script tag.
Ask API
The endpoint this widget proxies.
GitHub
Source code and issue tracker.

