Skip to content

CLI Reference ​

The veclite CLI reads and writes the same portable snapshot format as the Go library. It is also a stable JSON-in/JSON-out surface for scripts and future language drivers.

bash
veclite <command> [options] [arguments]

Run veclite help to list commands, or veclite <command> --help for that command's flags. In the forms below, <file> is the database path and <collection> is a collection name. Keep positional arguments together at the start or end of the command; the examples use positional arguments first.

JSON and scripting ​

Most commands support --json. These details matter when you call the CLI from another process:

  • --json is a command flag, not a universal flag. It is supported by the inspection, collection, vector, named-space, validation, compaction, and benchmark commands shown below.
  • dump always writes JSON and does not accept --json.
  • version, help, serve, mcp, and unlock do not support --json.
  • Command failures print Error: ... as text to standard error and exit non-zero, even when --json is set. Only successful output is JSON.
  • Inline vectors, vector maps, and payloads must be valid JSON. Quote them so the shell does not interpret brackets, braces, or wildcard characters.
  • For CLI search commands, --threshold=0 disables threshold filtering; only positive values are applied. The HTTP API treats a present threshold field as explicit, including 0.
  • CLI search commands return a bare JSON array. The HTTP API instead returns a { "results": [...], "count": N } envelope.
  • dump includes each record's ID, default-space vector, and payload. It does not include content or named-space vectors, so do not treat it as a full-fidelity backup format.

For example:

bash
result=$(veclite search data.veclite docs \
  --query='[0.1,0.2,0.3]' --top-k=5 --json)

Inspect databases ​

CommandRequired positional argumentsOptions and behavior
versionNonePrints the CLI and library versions as text.
info<file>--json; reports collection and record counts plus WAL sidecar status.
collections<file>--json; lists collection name, count, dimension, distance, and index type.
stats<file>--json; prints database and per-collection statistics.
dump<file>--collection=<name> limits the dump to one collection; --limit=<n> limits records per collection. Output is always JSON.
get<file> <collection>Requires --id=<uint64>; supports --json. Reads a default-space vector and its payload.
find<file> <collection>--filter='key=value', --limit=<n>, --json. Without a filter, returns all records.

CLI filters support exact equality (key=value) and glob matching when the value contains * or ? (path=*.md). Numeric values are parsed as numbers.

CommandRequired positional argumentsRequired and useful options
create-collection<file> <name>--dimension=<n> (0 auto-detects), --distance=cosine|dot|euclidean, --hnsw, --hnsw-m=<n>, --hnsw-ef=<n>, --text-index=field1,field2, --json.
drop-collection<file> <name>--json. Drops the collection and all of its records.
insert<file> <collection>Requires --vector='[...]'; optional --payload='{...}' and --json.
batch-insert<file> <collection>Requires --input=<path>; accepts a JSON array or JSONL; supports --json.
search<file> <collection>Requires --query='[...]'; optional --top-k=<n> (default 10), --threshold=<n>, --filter='key=value', and --json. Searches the default space.
upsert<file> <collection>Requires --vector='[...]'. Use --id=<n> or --key-field=<field> --key-value=<value>; optional --payload and --json. ID 0 auto-assigns.
update<file> <collection>Requires --id=<n> and at least one of --vector='[...]' or --payload='{...}'; supports --json.
delete<file> <collection>Requires --id=<n>; supports --json.
delete-where<file> <collection>Requires --filter='key=value'; supports --json.

--text-index names payload fields to index in addition to a record's Content. It enables BM25 text search and hybrid search for that collection.

Core workflow ​

bash
# Create a three-dimensional, HNSW-backed collection.
veclite create-collection data.veclite docs \
  --dimension=3 --distance=cosine --hnsw --text-index=title,kind --json

# Insert a default-space vector and payload.
veclite insert data.veclite docs \
  --vector='[0.1,0.2,0.3]' \
  --payload='{"title":"Quickstart","kind":"guide"}' --json

# Search and filter it.
veclite search data.veclite docs \
  --query='[0.11,0.19,0.31]' --top-k=5 --filter='kind=guide' --json

# Inspect or update a known ID.
veclite get data.veclite docs --id=1 --json
veclite update data.veclite docs --id=1 \
  --payload='{"title":"VecLite quickstart","kind":"guide"}' --json

Batch input ​

batch-insert --input accepts either a JSON array:

json
[
  {"vector": [0.1, 0.2, 0.3], "payload": {"kind": "guide"}},
  {"vector": [0.4, 0.5, 0.6], "payload": {"kind": "reference"}}
]

or JSONL with one object per line:

jsonl
{"vector":[0.1,0.2,0.3],"payload":{"kind":"guide"}}
{"vector":[0.4,0.5,0.6],"payload":{"kind":"reference"}}

Named vector spaces ​

Every collection has an implicit default space. Named spaces let one record carry independent embeddings for text, images, audio, or other modalities.

CommandRequired positional argumentsRequired and useful options
spaces<file> <collection>--json; includes the implicit default space.
space-add<file> <collection>Requires --name=<space>. Optional --dim=<n>, --distance=cosine|dot|euclidean|euclidean_squared, --modality, --provider, --model, --hnsw, --hnsw-m, --hnsw-ef, and --json. The name default is reserved.
record-insert<file> <collection>Requires --vectors='{...}' or --input=<path>. Inline records also accept --id, --content, --payload, and --json. An input file may contain one record object or an array.
record-upsert-by-key<file> <collection>Requires --key-field, --key-value, and --vectors='{...}'; optional --content, --payload, and --json.
search-space<file> <collection> <space>Requires --query='[...]'; optional --top-k, --threshold, --filter, and --json.
fuse-search<file> <collection>Requires --queries='{ "space": [...] }'; optional --top-k, --filter, and --json. Fuses rankings with Reciprocal Rank Fusion (RRF).
hybrid-search-space<file> <collection> [space]Requires --query='[...]' and --text='<query>'; optional --top-k, --threshold, --filter, and --json. The space defaults to default.

record-insert --input uses this shape:

json
{
  "id": 0,
  "content": "a red apple",
  "payload": {"sku": "apple-1"},
  "vectors": {
    "default": [0.1, 0.2, 0.3],
    "image": [0.8, 0.2]
  }
}

Multi-space workflow ​

bash
# The default space belongs to the collection; add an independent image space.
veclite create-collection catalog.veclite items \
  --dimension=3 --text-index=label
veclite space-add catalog.veclite items \
  --name=image --dim=2 --modality=image --distance=cosine --hnsw

# Insert one logical item into both spaces.
veclite record-insert catalog.veclite items \
  --vectors='{"default":[0.1,0.2,0.3],"image":[0.8,0.2]}' \
  --content='a red apple' --payload='{"sku":"apple-1","label":"apple"}' --json

# Search one modality or fuse both rankings.
veclite search-space catalog.veclite items image \
  --query='[0.79,0.21]' --top-k=5 --json
veclite fuse-search catalog.veclite items \
  --queries='{"default":[0.1,0.2,0.3],"image":[0.79,0.21]}' \
  --top-k=5 --json

# Fuse the default vector space with BM25 text results.
veclite hybrid-search-space catalog.veclite items default \
  --query='[0.1,0.2,0.3]' --text='red apple' --top-k=5 --json

Server and integration modes ​

CommandRequired positional argumentsOptions and behavior
serve<file>--host=<host> (default 127.0.0.1), --port=<port> (default 8080), --cors, --wal. Starts the HTTP API.
mcp<file>Starts the MCP tool server over standard input/output. It has no CLI flags.

See the HTTP API reference before exposing serve beyond your machine.

Maintenance ​

CommandRequired positional argumentsOptions and behavior
compact<file>--json; rewrites the snapshot and reports bytes saved.
validate<file>--json; checks whether the database opens and inspects vector dimensions and zero vectors. Returns non-zero when invalid.
benchmark<file>Requires --collection=<name>; optional --queries=<n> (default 100), --top-k=<n> (default 10), and --json.
unlock<file>--force; removes stale locks automatically. Refuses to remove a live process's lock unless forced. No JSON mode.

Use unlock --force only after confirming that the reported process cannot write the database again. Removing a live writer's lock can allow concurrent writes and corrupt the database.