The chatbot host: one JSON endpoint, a shadow-DOM embed, and the bots registered against them. Two bots are configured, and they are two genuinely different things rather than two settings of one thing.
A finite state machine and a script. It knows a fixed set of topics, offers buttons rather than a blank box, and costs nothing to run — no model, no API key, no per-message bill. The right shape for triage, booking, and anything where the useful answers are known in advance.
Try it on a page · Alpine renderings · Embed it elsewhere
Retrieval over the indexed documentation: 350 passages from 29 library READMEs. It answers open questions in its own words and cites the sections it drew from. Costs an embedding and a model call per message, so it waits to be spoken to rather than greeting every page view.
Try it on a page · Alpine renderings · Embed it elsewhere
POST /api/chat/{bot}/message — the whole product, one wire contractGET /api/chat/{bot}/widget.json — what the embed asks for firstGET /embed.js — one script tag, no framework, shadow DOMGET /api/health