How it works

Technically transparent.

Emiri is not a "magic box". It's a concrete architecture: crawler → embeddings → RAG → response. We show you how it works so you know exactly what to expect.

01

Crawler builds the knowledge base

You provide a URL or list of URLs. Playwright visits every subpage, extracts the HTML content, removes noise, and converts to Markdown. Large pages are split into chunks, small ones merged.

details

Supported: WordPress, Webflow, Next.js, Wix, static HTML, and even paginated sites. Crawling a typical business site (50–200 subpages) takes 2–5 minutes.

02

Extraction and embeddings

Claude Opus analyzes each chunk and extracts facts in structured format: prices, hours, policies, product descriptions. Then OpenAI text-embedding-3-small converts them into vectors.

details

Vectors are stored in PostgreSQL with the pgvector extension. Every fact is linked to its source URL and timestamp — Emiri always knows where the information came from.

03

Retrieval Augmented Generation (RAG)

When a customer writes, Emiri vectorizes the question, runs a similarity search in the knowledge base (top-K chunks) and builds a prompt with context. Then Claude Haiku generates the response.

details

Fallback: if the knowledge base is insufficient, Emiri apologizes and asks for contact — it never makes up facts. Optionally it can collect the customer's email before forwarding the question.

04

Bot protection — 4 layers

Protect your customers and yourself. Every conversation passes through: domain verification (whitelist), rate limiting (Redis), content filter (Claude moderation), and a prompt injection trap.

details

Domain whitelist: the widget only responds from pages you've approved. Rate limiting: 60 messages/minute per IP. Prompt injection: every input is sanitized before being sent to the model.

Privacy and security

Data in EU

Servers on Hetzner CX32 in Germany. No data leaves the European Union.

GDPR ready

Export or delete all customer data from the dashboard. DPA available on request.

RLS at database level

Row Level Security in PostgreSQL. Every tenant sees only their own data — even if something goes wrong in the application.

API keys never leave

Anthropic and OpenAI keys are stored server-side. The widget communicates through our proxy, not directly with the API.

Tech stack

Chat LLM Claude Haiku 4.5 — fast, cost-effective, accurate
Heavy processing Claude Opus 4.7 — extraction, complex document analysis
Embeddings OpenAI text-embedding-3-small (1536 dim)
Database PostgreSQL 16 + pgvector, Drizzle ORM
Job queue BullMQ + Redis 7
Crawler Playwright (headless Chromium) + @mozilla/readability
Auth Lucia v3 + argon2 + TOTP (2FA)
Widget Preact + Shadow DOM — isolated from page styles
Infra Docker Compose + Traefik v3, Hetzner CX32

Enough theory. See it in action.

Start for free View pricing