quiver
Documentation menu

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

FlagEnvironmentDefaultMeaning
--urlQUIVER_URLhttp://localhost:6900the server's REST address
--api-keyQUIVER_API_KEYnonesent as Authorization: Bearer <key>
--ca-certQUIVER_CA_CERTnonea PEM CA certificate to trust, for an https:// server with a private CA
--client-certQUIVER_CLIENT_CERTnonea PEM client certificate followed by its key, for mutual TLS
--embedding-urlQUIVER_EMBEDDING_URLnonean OpenAI-compatible embeddings endpoint; enables text input
--embedding-modelQUIVER_EMBEDDING_MODELnonethe model name to send
--embedding-api-keyQUIVER_EMBEDDING_API_KEYnonea 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.

WhereKeyDoes
Anywhere?help
rrefresh
q / Ctrl+Cquit
Escback, or close a dialog (quits from the dashboard)
Dashboard↑ ↓ / k jselect a collection
Enteropen it
nnew collection
ddrop the selected collection
ssnapshots
CollectionPgDn / →, PgUp / ←next / previous page
Enterpoint details
iinsert a point
/search
xdelete the selected point
Ssnapshot this collection
Snapshotscsnapshot the collection selected on the dashboard
Rrestore the selected snapshot
Ddelete it
FormsTab / ↓, Shift+Tab / ↑next / previous field
← → / Spacechange a choice; Space flips a toggle
Ctrl+Tswitch between vector and text input
Enter / Escsubmit / cancel

Forms

  • New collection — name, dimension, metric and index (hnsw, flat or kd_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-text

The 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.