calivi
Transparency Features calivi-vm Get started GitHub
Self-hosted · MIT · Docker

The chat interface that shows you the machinery.

You pick which model runs where: the server first, then the model on it. Every answer keeps the model, the server and the speed behind it — and the chat is yours to rewind, fork or lift out whole.

One docker compose up · SQLite, no external services · nine languages

The interface

Two dropdowns, and everything else in plain sight.

Two dropdowns pick the server and model. Streaming answers with reasoning, tool calls, and per-message attribution — visible, not hidden.

calivi
local-gpu ▾ llama3.3:70b ▾
10:24:07
Write a bash script that zips the current folder, named with a timestamp.
10:24:11llama3.3:70b · local-gpu

Here's a script that archives everything in the current directory and excludes its own output:

bashCopy
#!/usr/bin/env bash
set -euo pipefail

# timestamped archive of the current folder
stamp=$(date +"%Y-%m-%d_%H-%M-%S")
zip -r "backup_${stamp}.zip" . -x "backup_*.zip"

Run it inside the folder you want to archive; the new .zip lands right there.

~135 t/s
10:25:02
🔍 what changed in httpx 0.28
What changed in httpx v0.28?
🔧 web_search ✓ · 5 results
Type a message…

// mockup with placeholder data — not a real conversation

Transparency

Tools don't make a model honest.
They make it checkable.

A search or documentation tool returns what matched one query, never the whole reference — and a model can confidently call what it did not receive nonexistent. A prompt could not fix that; we measured it making things worse. So every tool call opens the raw output the model actually got, stored with the message.

🔧 context7: query-docs ✓raw output ▾
Exactly what the tool returned. Check the answer against it — anything missing here may have been filled in from memory.
### model_validator with mode='after' for cross-field validation

Source: https://github.com/pydantic/pydantic/blob/main/pydantic/functional_validators.py

@model_validator(mode='after')
def verify_square(self) -> Self:
    if self.width != self.height:
        raise ValueError('width and height do not match')
    return self
// four more excerpts — none of them mentioning wrap

// the panel is real; the excerpt is trimmed for the page

What you get

Control first, everything else built in.

Routing

Manual, always

Pick the server and model for every message. Servers that are asleep or unreachable are hidden, so they cannot be picked by mistake.

Backends

One UI, any server

Native Ollama and any OpenAI-compatible API — OpenRouter, LM Studio, vLLM, llama.cpp — side by side.

Streaming

With reasoning

Answers stream as they generate; reasoning shows in its own pane. Esc stops any response.

Context

Vision & documents

Paste images to vision models; attach PDFs, docx or code as lossless text on any model.

Tools

Web search and MCP

Bundled web search plus any MCP server. Read-only tools run freely; anything that changes state asks you first.

Access & secrets

Multi-user

Roles, private chats, registration you can close. API keys and MCP tokens are encrypted in the database.

calivi-vm

A machine the model can operate.

Give Calivi a VM of its own and the model gets a shell there — bash and file edits, as the owner's account, like a terminal coding agent. The UI stays the chat window.

agent mode · every step opens to its output
✓bash       df -h /home && free -h
✓bash       du -sh ~/models/* | sort -h
✓read_file  ~/models/README
?bash       rm -rf ~/models/old-q4
           waiting for your approval — Approve · Deny

// mockup with placeholder data — not a real session

Agent mode

Every step, on the record

Each command is a row you can open to its output. The steps are kept with the reply and handed back to the model next turn, so it knows what it already ran.

Guardrails

Asks before it breaks things

Harmless commands just run. rm, stopping services, writing under /etc wait for your approval; a few things are refused outright. 🛡 makes every call ask.

Updates

Keeps itself current

New versions arrive with apt upgrade from a signed repository, and never cut a reply that is still running. Each package is tested in a VM of its distribution first.

Get started

Three ways in. Each takes a few minutes.

Easiest

Let your coding agent do it

Paste one prompt into Claude Code, Codex or any coding agent on the machine that should host Calivi. It checks the machine, installs what is missing, starts Calivi, verifies it and hands you the URL.

Read it first
By hand

Three commands

Needs only Docker with Compose.

$ git clone https://github.com/orkun-soylu/calivi.git
$ cd calivi
$ docker compose up -d --build
As a VM

calivi-vm

A Proxmox image, or the calivi package for Debian 13, Ubuntu 24.04 LTS or 26.04 LTS — on a machine meant for it: its owner's model gets a root-capable shell there. Calivi serves on port 80; the first account claims the machine with the setup code shown on its console.

# the package, downloaded from the latest release
$ sudo apt install ./calivi_X.Y.Z-1+deb13_amd64.deb   # or +ubuntu24.04 / +ubuntu26.04

Then, with Docker, open http://localhost:8090 and sign up right away — the first account becomes the admin. Add a model server under Settings → Servers, pick it from the top bar, and chat. Settings, backups and HTTPS are in the README.