Ask v1.0 · AGPLv3 licensed · self-hostable

Answers from your docs. On your website.

Plainbase Ask is a support chatbot you embed in five minutes. Point it at your help center, PDFs, and Markdown. It answers the obvious questions, cites the source, and escalates to a real human by email when it should.

Acme Support

AI-powered · answers instantly

Hi! I'm Maya. Ask me anything about Acme — billing, setup, plans.
How do I cancel my plan and get a prorated refund?
Go to Settings → Billing → Cancel plan. Cancellations made before the renewal date are prorated automatically to the day. You'll see the refund on your next statement.
docs.acme.co/billing/cancel
Can I talk to someone? My charge looks wrong.
Of course — let me get a human on this with the full thread.
Ask a question…
Powered by plainbase ask

Three moving parts. That's all there is.

Feed it your sources, write a paragraph of instructions, drop a script tag on your site. Grounded answers, or an escalation email to your support team.

STEP 01

Feed the knowledge base

Drop PDFs and Markdown files into the admin, or point the crawler at your docs site. Each source is chunked, embedded, and stored in a local vector DB.

STEP 02

Shape the answer

Write the bot's tone, scope, and escalation rules in four short fields. Pick an AI provider — Mistral, OpenAI, Anthropic, or Google. Save and you're ready to embed.

STEP 03

Embed & forget

Paste one <script> tag into your site. The chat bubble appears. Conversations, tickets, and AI logs land in the admin.

Six surfaces. One job each.

The admin is laid out the way you actually work: ingest, instruct, embed, review, escalate, tune. Nothing else.

Upload a file or crawl a whole help center.

Every answer is grounded in what's indexed. Drop in PDFs and Markdown for one-off content; point the crawler at a URL and it walks the same-domain links, respects robots.txt, and stays within the page limit you set.

  • PDF & Markdown uploads — chunked and embedded the moment they arrive.
  • Site crawler with a hard page cap (default 50, max 200) and live "Stop" button.
  • Scheduled rechecking — daily, weekly, biweekly, monthly. Or never.
  • Per-source embed cost shown next to every document, so spend is never a surprise.
ask.acme.co/admin/knowledge-base admin
KNOWLEDGE BASE
Sources
Documents
142
+12 this week
Chunks
3,821
avg 27 / doc
Corpus
2.1M
characters
Embed spend
$1.84
all-time
SOURCE
TYPE
CHUNKS
COST
CRAWLED
docs.acme.co
WEB
2,940
$1.21
2h ago
2026-pricing-guide.pdf
PDF
86
$0.04
status.acme.co
WEB
412
$0.18
9h ago
refund-policy.md
MD
14
$0.01
Crawling · docs.acme.co · 38 / 200 pages · 1m 12s elapsed STOP

Four short fields. That's the whole prompt.

Plainbase Ask assembles its system prompt from four layers, stacked. You edit one of them — the part that actually changes between deployments. Tone, scope, when to escalate, anything time-sensitive.

  • Tone & persona — give the bot a name and a voice in 1–3 sentences.
  • Scope & guardrails — what to answer, what to politely decline.
  • Escalation hints — when to proactively offer the ticket button.
  • Trigger phrases — exact strings that surface the ticket button on contact.
ask.acme.co/admin/instructions admin
INSTRUCTIONS · SYSTEM PROMPT
How the prompt is assembled
~ 1,240 tokens
01
System Rules

Hardcoded platform rules: KB search, citation format, ticket tool, markdown allowlist.

LOCKED
02
Your instructions

Tone & persona · scope & guardrails · escalation hints · additional context · trigger phrases.

YOU EDIT
03
Knowledge Base

Top matching chunks retrieved per turn from your vector store.

PER-TURN
04
Conversation memory

Last 10 messages (configurable) so context survives across turns.

ROLLING

One script tag. Themed and translated.

Configure the chat bubble in the admin; copy the embed snippet; paste it into your site. Multiple languages get a built-in picker. Allowed domains keep the widget locked to your sites and nobody else's.

  • Brand color & logo to match the rest of your site.
  • Multi-language strings — title, starter message, ticket form copy, office hours.
  • Domain allowlist so the widget only loads where you allow it.
  • Live preview next to the form — see the change before you deploy it.
Active · accepting requests
Need help? Chat with us
#161616
🇬🇧 English 🇫🇷 Français 🇩🇪 Deutsch
acme.co
app.acme.co
docs.acme.co
Acme Support
Hi! Ask me anything about Acme. How do I cancel? Settings → Billing → Cancel plan…

Every thread. And the AI's homework.

Read what visitors asked, what the bot answered, and exactly what the model saw on each call — system prompt, retrieved chunks, tool calls, response. Useful when the bot says something it shouldn't have, and you want to know why.

  • Search and filter by visitor email, message content, or ticket status.
  • AI Logs — full system prompt, KB chunks, tool calls, response, thinking tokens.
  • Per-conversation cost — input tokens, output tokens, estimated spend.
ask.acme.co/admin/conversations admin
marc@…5m
How do I cancel my plan and get…
anon11m
Does the team plan include SSO?
lila@…1h
My export isn't downloading…TICKET
anon2h
What languages do you support?
jens@…4h
Pricing for 50 seats annual?
anonyest
Is there an iOS app?
Messages AI Logs · 3 calls · $0.0021
USER How do I cancel my plan and get a prorated refund?
BOT Go to Settings → Billing → Cancel plan. Cancellations made before the renewal date are prorated automatically. [docs.acme.co/billing/cancel]
USER Can I talk to someone? My charge looks wrong.
BOT Of course — let me get a human on this.TICKET TRIGGER

Escalation by email. Send it to any tool.

When the bot can't help — or someone asks for a human — the widget captures their email and submits a ticket. The ticket is recorded in the database and emailed to your inbox with the full transcript attached. Forward it into Zendesk, HubSpot, Linear, or just answer it from your support inbox.

  • One ticket per conversation, rate-limited to one per IP per hour.
  • Full conversation transcript in the body of the email — context, not summaries.
  • Any SMTP provider — Postmark, Resend, Brevo, Gmail, or your own server.
  • Email-to-ticket compatible with Zendesk, HubSpot, Crisp, Freshdesk, Linear, and more.
SENT · 10:42 · plainbase ask → support@acme.co
[Plainbase Ask] New support request from marc@example.com
From: bot@acme.co · To: support@acme.co
Subject: Cancellation charge looks wrong — conversation #a7c3b9
User <marc@example.com>
How do I cancel my plan and get a prorated refund?

Maya (bot)
Go to Settings → Billing → Cancel plan. Cancellations
before renewal are prorated automatically.

User
Can I talk to someone? My charge looks wrong.

Maya (bot)
Of course — let me get a human on this with the full thread.

— end of transcript —
conversation_id: a7c3b9d2 · ip: 86.62.x.x · widget: en

Guardrails you'll actually want.

Five rate limits with sensible defaults protect your model budget. Cost tracking lets you mirror provider pricing so the spend numbers in the admin reflect what you're actually paying.

  • Per-IP throttling — messages-per-second and active-conversation caps.
  • Hard limits per conversation — message count and max response tokens.
  • Memory window — pick how many recent messages the model sees each call.
ask.acme.co/admin/config admin
CONFIG · RATE LIMITS
Guardrails
Reset to defaults
Messages / sec / IP
0.2 msg·s⁻¹

Requests above this rate receive 429.

Active conv. / IP
5 sessions

Simultaneous chat sessions per IP.

Messages / conv.
50 msg

Sealed past the cap; visitor opens a new one.

Memory window
10 turns

Higher = better memory, higher cost.

Max response tokens
1,000 tok

Hard cap on each AI reply.

Input rate (USD / 1M)
$0.40

Used for spend estimates only.

Bring your own key. Or switch later.

Two models do the work: a chat model and an embedding model. Set them via environment variables and restart. If your chat provider doesn't ship embeddings, set a second provider for that one role.

PROVIDER
AI_PROVIDER
CHAT MODELS
EMBEDDING MODEL
Mistral
mistral
mistral-medium-3-5
mistral-small-latest
mistral-embed
OpenAI
openai
gpt-5.4-mini
gpt-5.4-nano
text-embedding-3-small / -large
Anthropic
anthropic
claude-sonnet-4-6
claude-haiku-4-5
none — set a fallback embedding provider
Google
google
gemini-2.5-flash
gemini-2.5-flash-lite
gemini-embedding-2

Two SQLite files. That's the whole database.

Plainbase Ask is a Node server packaged as one Docker container. All state lives in two SQLite files on disk. Litestream streams them to any S3-compatible bucket continuously — restore from backup with the same env vars and an empty /data directory.

YOUR S3 BUCKET
Object storage
Scaleway · Hetzner · R2 · MinIO
SINGLE CONTAINER
Plainbase Ask
Node + SQLite + Litestream
db.sqliteconversations · tickets · config
vec.sqlitechunks · embeddings
VISITORS
Your website
widget.js · <script> tag
SIZING
Up to 1,000 visitors / day

1–2 vCPU, 1–2 GB RAM, 10–20 GB disk. CPU barely moves — most time is spent waiting on the model.

RECOMMENDED HOSTS
Hetzner + Coolify

A CX22 (€4.15/mo) handles 1,000 visitors / day comfortably. Scaleway, Koyeb, Scalingo, OVH all work too.

RESILIENCE
Lose seconds, not days

Litestream replicates both SQLite files continuously. If the box dies, restore from S3 — you lose at most a few seconds of writes.

One container. One script tag.

Bring an OpenAI / Mistral / Anthropic / Google key. Bring an SMTP server if you want ticket emails. Bring an S3 bucket if you want backups.

  • Docker Compose: on any VPS; reverse-proxy behind Caddy or Nginx for HTTPS.
  • Koyeb & Scalingo: work too — Litestream is bundled and required for ephemeral hosts.
  • Restore from backup: automatic — same env vars, empty /data, container pulls from S3 on boot.
~/plainbase-ask
$cp .env.example .env && $EDITOR .env
# set AI_PROVIDER · AI_API_KEY · ADMIN_PASSWORD
# optionally LITESTREAM_S3_* and SMTP_*
 
$docker compose up -d
› restoring from s3 ... no replica, starting fresh
› litestream: replica sync ✓
› server listening on :3000
✓ Plainbase Ask · admin at /admin
EMBED SNIPPET · <head> of your site
<script   src="https://ask.your-domain.com/widget.js"   data-agent-id="your-agent-id" ></script>

Five minutes from clone to chat bubble. Or less.

Free, forever. Bring your own model key, your own SMTP, your own bucket. We never see your queries, your customers, or your knowledge base.

Questions we get every other week.

Still stuck?

Check out the docs, or shoot us an email at hello@plainbase.dev.

github.com/plainbase-dev/plainbase-ask
01 Is Plainbase Ask really free?

Yes. The code is AGPLv3-licensed and free forever. The only money that ever leaves your account goes directly to your AI provider — Mistral, OpenAI, Anthropic, or Google — at their usual per-token rates. We never sit in the middle of that bill.

If you'd rather not run the server, a managed hosted option is on the roadmap; sign up for updates from the footer.

03 Which AI provider should I pick?

For most teams, Mistral is the recommended default: cheap embeddings, fast chat, EU-based. OpenAI and Google are good if you already have credits. Anthropic doesn't ship embedding models, so you'll pair it with one of the others for the knowledge base.

You can switch providers from the admin without re-indexing as long as you keep the same embedding model.

04 What happens when the bot doesn't know the answer?

It says so, instead of inventing. The system prompt is locked to "answer only from the indexed sources," and the retrieval threshold is tunable per deployment. When confidence is below the threshold — or when the visitor asks for a human — the widget surfaces a Get help from a human button that opens a ticket and emails the full thread to the address you set in 'Escalation' config.

05 Can I run it without Docker?

Yes. But it's not ideal. The Docker container bundles the Node server and Litestream together, and the SQLite files are stored in a volume on disk. If you run the Node server without Docker, you need to set up Litestream separately to sync the SQLite files to your S3 bucket for backups. It's possible, but Docker Compose is the recommended way to run it for simplicity and ease of management.

06 How do I keep the knowledge base fresh?

Each crawl source has a recheck schedule — daily, weekly, biweekly, monthly, or never. The crawler re-fetches the page, diffs the content, and only re-embeds chunks that actually changed, so the bill stays small.

You can also trigger a recrawl manually from the admin.

07 Does the widget work in other languages?

It does. All labels are translateable from within the admin. Visitors can choose their preferred language when opening the widget, the AI sticks to that language for the duration of the chat.

08 Can I restyle the widget to match my site?

Yes. Add your logo and primary color from the admin. For deeper styling, adjust the base widget files.