Features

Bruno is more than a chatbot. It reads the live page, grounds answers in your uploaded knowledge, points at the right element, and - with consent - takes the next step on behalf of your visitor.

Page-aware highlighting

The Bruno mascot pointing at a highlighted Connect button on a webpage, with a chat panel open showing the conversation.

Bruno extracts a structured outline of the current page on every load and on every SPA navigation. It knows the headings, the visible interactive controls, and the same-origin links on the page. When a visitor asks "where do I export my invoices?", Bruno can point at the exact button with a soft outline and a one-line teaching hint that follows the cursor.

Highlights respect prefers-reduced-motion, dark mode, and your CSP. The widget renders inside a Shadow DOM so its styles can never leak into your app.

Grounded explanations (RAG)

Knowledge documents on the left feed into floating indexed chunks that flow into a chat answer on the right, with the Bruno mascot watching.

Answers are generated by an LLM but grounded in two sources: (1) your uploaded knowledge base and (2) the live page the visitor is on. We chunk and embed your files into a per-website vector index, retrieve the most relevant passages on every turn, and pass them to the model alongside the live page summary.

Bruno is honest about uncertainty. If the knowledge base does not cover a topic, Bruno will say so and either point to a help page that does, or escalate the visitor to your support inbox.

  • Hybrid retrieval: vector + lexical, reranked.
  • Per-website prompt overrides from the admin UI.
  • No data is used to train any model. Ever.

Hybrid actions with consent

A consent dialog with three buttons - Allow, No I'll do it, and Allow all this session - in front of a faint webpage card with one element highlighted, and the Bruno mascot beside it.

Most chatbots can only talk. Bruno can also do. When the LLM decides an action would help, it calls a tool like propose_action with a CSS selector, an action type (click, fill, select, submit, scroll), and a human-readable reason.

The widget then shows a consent card in chat: "Bruno wants to click the Export button for you - to download your invoices as CSV." The visitor can:

  • Allow - Bruno previews the element for ~3 seconds, then performs the action.
  • "No, I'll do it" - Bruno turns the highlight into a teaching hint and steps back.
  • "Allow all this session" - opt-in, persists only for the current session.

Cross-origin navigations are always declined. Password fields are explicitly blocked. Every proposed action and visitor decision is recorded server-side so we can investigate any incident on request.

Multi-page tasks

Two browser windows side-by-side connected by a curved arrow, with the Bruno mascot riding the arrow to carry a request from the first page to the second.

When completing a task means going to another page (for example, "open my billing history" -> click a link -> arrive on /billing), Bruno carries the original request across the navigation. After the new page settles, Bruno re-reads the page context and finishes the job - or asks the visitor what to do next.

There's a hard cap on continuations (5 hops by default) so an unhelpful loop never drains your budget.

Knowledge ingestion

PDF and TXT documents flowing into a stack of indexed knowledge layers next to the Bruno mascot reading attentively.

In your dashboard, drag in PDFs, markdown, or plain text. Bruno's worker will parse, chunk, embed, and re-index in the background. Re-uploads are deduplicated at the chunk level, so revisions don't bloat your index.

  • PDFs are extracted page-by-page, with headings preserved.
  • Markdown respects fenced code, tables, and headings.
  • Text is chunked at semantic boundaries (paragraph + sentence).

Files are stored in managed object storage, encrypted at rest. Embeddings live in a managed vector index, scoped per website.

Customization & brand

Bruno carries your brand. From the dashboard you can set:

  • Brand name (replaces "Bruno" in the chat header).
  • Greeting text.
  • Hidden URLs - patterns where Bruno won't render.
  • Per-website system prompt overrides (Corporate plan).
  • "Powered by Bruno" link visibility - can be hidden on Growth and above.

Visual theming inherits from your site only when you ask for it - by default, Bruno's chat UI is opinionated and accessible across host pages.

Usage & billing visibility

Every conversation is recorded so we can show you what's running through your budget. From the dashboard you can:

  • See per-website rollups - conversations, messages, and AI tokens used.
  • See each website's cost at your plan's per-token rate, plus current-period token usage against your plan allowance.
  • Manage subscription plans and top-up balances per website.
  • Delete a website to permanently remove its conversations, messages, and knowledge.

Conversation browsing, per-turn retrieval inspection, and CSV exports are on our roadmap and aren't available yet. Need a one-off export or deletion in the meantime? Email help@bruno.support.

Integration surface

One script tag is enough to install Bruno:

Embed snippet
<script
  src="https://app.bruno.support/v1/site/YOUR_KEY.js"
  async
  defer></script>

The widget loader fetches its bundle once and is cached aggressively. It exposes no globals on window beyond a single namespaced object.

Ready to try the hybrid help loop?

Start free. Add a script tag. Upload your help docs. Let Bruno do the highlighting.