Nivara Desk
Flagship 2026A help desk that many companies share, where the AI answers only when it should
Two failures every AI support product has to rule out: answering when it shouldn't, and showing one customer's data to another. This one is built so neither can happen.
- AI layerPython
- APITypeScript
- Front endsTypeScript
The full write-up
The AI answers from its help centre, hands the rest to a person, and every published number is regenerated from committed data by a script a test re-runs.
Someone asks a question from a chat box on their supplier’s website. It becomes a real ticket in the support queue with a response clock running. The AI answers if it is confident; otherwise a person picks it up.
| Guarantee | One company can never see another’s data; the database enforces it, not the code |
|---|---|
| Built with | Postgres row-level security · a trained answer gate · replayable tests |
| Size | 4 apps · 3 services · 18 permissions · 550 labelled test questions |
| Runs on | Free hosting, and docker compose up with no API keys
|
Built as 3 separate pieces
AI layer
PythonAnything the model writes on its own can never reach a customer.
- Made the right call on 93.6% of 600 recorded tickets (595 of 600) by routing every answer through a trained gate that decides when to reply, when to ask, and when to fetch a human. Money questions always go to a human.
- Put the right document first 94.2% of the time with hybrid retrieval over Qdrant, and every reply is built from one of those real documents, so a made-up answer is impossible rather than unlikely. No attempt to trick it has worked, and the attacks re-run on every change.
- Held wrongful escalations to 6.8% with zero wrong answers on money questions, and kept the full eval free to re-run ($0) by recording model responses once and replaying them. One automated grader agreed with people too rarely (κ = 0.14), so its score was dropped rather than published.
- Cut model cost 26–39% on 8 of 13 kinds of question with no drop in accuracy, by sending each question to the cheapest model that answers it well and falling back down a chain that ends in a person.
- Found and fixed a ranking leak between companies inside the search engine, and pinned it with a test so it cannot come back.
FastAPI
Hybrid RAG
Qdrant
MCP
- Langfuse
pytest
API
TypeScriptForget the company filter on a query and you get nothing back, never someone else’s data.
- Postgres itself blocks the rows, so a mistake in the code cannot leak them. Asking for another company’s ticket returns 404, not 403; saying “forbidden” would confirm the ticket exists.
NestJS
Prisma
PostgreSQL RLS
PgBouncer
Socket.IO
Redis
Front ends
TypeScriptEvery screenshot above was taken from the running app by a script.
- Four apps share one codebase: the agent dashboard, the customer portal, the analytics view, and a chat box that drops into any website under 60 KB without picking up that site’s styling.
Next.js 15
React 19
Tailwind v4
TanStack
- Shadow DOM
Playwright