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