Open source · MIT

Hark

A self-hosted support chatbot: a receipt for every answer, any model, your own data

v1.1.0 Connections in plain sight, appearance configurable, the bot calls out loud
Go 1.26SQLitechihtml/templateSSEDocker
Hark

The bill arrives for what you cannot see

A support bot answers in one sentence, and the bill for it is roughly five times what the length of that sentence suggests. The difference goes on the model's reasoning: the visitor never sees a word of it, and it is billed as ordinary output. The provider dashboard does not break it out.

Hark attaches a receipt to every answer. Which model was called, which connections it used, how long each step took and what it cost. Reasoning gets its own column. In the demo database it came to between 72 and 86 per cent of billed output: one answer spent 448 of its 518 tokens on thinking.

What is inside

A receipt for every answer

The steps of the conversation in order: a call to the model, a query to your database, the model again. Each step carries its own time and its own price. Cost is stored in millionths of a rouble, because in kopecks a single answer rounds to zero.

Any model, including your own

OpenAI, Anthropic, and anything speaking the OpenAI format: Ollama, vLLM, LM Studio, OpenRouter, your own server. Two fields to switch. Providers disagree about which parameters they accept and none of it is documented, so Hark asks the model itself and hides the knobs it refused.

Your data instead of guesses

The bot calls your address or reads your database. The model writes the query and Hark decides whether to run it: SELECT only, tables against an allowlist, a second statement refused, and the row cap applied by wrapping the query, since UNION walks straight past an appended LIMIT.

Handing over out loud

When the bot gives up, an open admin tab finds out over a stream: a counter in the header, the tab title, a sound. If nobody keeps the admin open, Hark calls one address you configured. Telegram is what you get by pasting a URL; there are no integrations inside.

A widget that is configurable throughout

One script tag, 23 KB, seven over the wire. Font down to "same as the site", spacing, colours, background, radii. You set three colours and the rest follow from the surface and the text. The preview runs the actual widget rather than a mockup.

Two languages, one file for the next

The admin and the widget speak Russian and English, and the bot's language is set separately from the admin's. The translation key is the source string itself, so anything untranslated stays readable text rather than a key name. Adding a language means translating one JSON file.

Screenshots

The receipt: steps, timings and the share spent on reasoning
The receipt: steps, timings and the share spent on reasoning
The widget on a real site, themed to match it
The widget on a real site, themed to match it
Appearance: settings on the left, the live widget on the right
Appearance: settings on the left, the live widget on the right
Connections: your own API and a read-only database
Connections: your own API and a read-only database
Who took the conversation, visible before you start typing
Who took the conversation, visible before you start typing
Model: only the knobs this one actually accepted
Model: only the knobs this one actually accepted

Installation

git clone https://github.com/dripips/hark.git cd hark docker compose up -d docker compose run --rm hark -manager you@example.com -password секрет

Have a project or idea?

Write to me and we will talk the task through.