Terminal UI
quiver-tui browses and manages a running server from the terminal: a dashboard of collections, the points in each, insert and search forms, and snapshots. It talks to the REST API through the Rust client.
cargo run --release -p quiver-tui # against http://localhost:6900
./target/release/quiver-tui --url http://db.internal:6900 --api-key "$KEY"The Docker image includes it too: docker compose exec quiver quiver-tui.
Options
| Flag | Environment | Default | Meaning |
|---|---|---|---|
--url | QUIVER_URL | http://localhost:6900 | the server's REST address |
--api-key | QUIVER_API_KEY | none | sent as Authorization: Bearer <key> |
--ca-cert | QUIVER_CA_CERT | none | a PEM CA certificate to trust, for an https:// server with a private CA |
--client-cert | QUIVER_CLIENT_CERT | none | a PEM client certificate followed by its key, for mutual TLS |
--embedding-url | QUIVER_EMBEDDING_URL | none | an OpenAI-compatible embeddings endpoint; enables text input |
--embedding-model | QUIVER_EMBEDDING_MODEL | none | the model name to send |
--embedding-api-key | QUIVER_EMBEDDING_API_KEY | none | a bearer token for the embeddings endpoint |
Unlike the server, quiver-tui does not read a .env file. Export the variables, or pass the flags.
Screens
- Dashboard — the server's address, version, storage engine, whether snapshots are on, and its totals; below, every collection with its dimension, metric, index, points, tombstones and other (named and sparse) vectors.
- Collection — the collection's points, 50 to a page, in id order, with a preview of their metadata. After a search, the results with their distances; Esc goes back to the points.
- Snapshots — every snapshot, with its collection, point count, creation time and size.
Enter on a point or a result opens its vector and metadata. Destructive actions (dropping a collection, deleting a point or a snapshot) ask for y first.
Key bindings
? shows them all.
| Where | Key | Does |
|---|---|---|
| Anywhere | ? | help |
| r | refresh | |
| q / Ctrl+C | quit | |
| Esc | back, or close a dialog (quits from the dashboard) | |
| Dashboard | ↑ ↓ / k j | select a collection |
| Enter | open it | |
| n | new collection | |
| d | drop the selected collection | |
| s | snapshots | |
| Collection | PgDn / →, PgUp / ← | next / previous page |
| Enter | point details | |
| i | insert a point | |
| / | search | |
| x | delete the selected point | |
| S | snapshot this collection | |
| Snapshots | c | snapshot the collection selected on the dashboard |
| R | restore the selected snapshot | |
| D | delete it | |
| Forms | Tab / ↓, Shift+Tab / ↑ | next / previous field |
| ← → / Space | change a choice; Space flips a toggle | |
| Ctrl+T | switch between vector and text input | |
| Enter / Esc | submit / cancel |
Forms
- New collection — name, dimension, metric and index (
hnsw,flatorkd_tree, with default parameters). - Insert — an id (blank for a generated UUID), the vector as comma-separated numbers or text to embed, and metadata as a JSON object. It sets only the main vector, so collections with named vectors need another client to insert.
- Search — the query,
k(default 10) and an optional JSON filter. It searches the main vector. - Restore — a new name (blank for the original) and whether to replace an existing collection.
Invalid input, such as a non-number in a vector or metadata that is not a JSON object, is reported in the form before anything is sent; server errors are shown in the status line.
Text embeddings
With --embedding-url, the insert and search forms also accept text: Ctrl+T switches the input to text, and the TUI turns it into a vector with the endpoint before inserting or searching. It sends {"input": "<text>", "model": "<model>"} and reads data[0].embedding from the answer, the OpenAI embeddings format, so OpenAI, Ollama and other compatible servers work. With Ollama:
ollama pull nomic-embed-text
quiver-tui --embedding-url http://localhost:11434/v1/embeddings --embedding-model nomic-embed-textThe collection's dimension must match the model's: nomic-embed-text returns 768 numbers, so create the collection with dimension 768. Without --embedding-url, Ctrl+T only explains how to enable it.