Documentation

Everything Voli does, one page.

How Voli installs packages and agent skills, how voli memory gives an AI agent a durable encrypted store, and what is still on the roadmap - grounded in the CLI you actually run.

Install & search

Voli installs from a signed registry index. voli install <pkg> fetches one or more packages, and each install is transactional per package - download, verify the SHA-256, extract, shim. Pin an exact version with @, and if you mistype a name Voli suggests the closest match instead of failing.

voli search <query> runs full text over the local index by name, description, or binary - instant and offline, because the index is a signed sqlite snapshot on disk. voli update refreshes it in one small download, not a git clone.

packages
PS> voli update                  # refresh the signed index
PS> voli search regex            # full-text, offline
PS> voli install ripgrep fd fzf  # transactional per package
PS> voli install [email protected]  # pin an exact version
CommandWhat it does
install <pkg>[@version] …Install one or more packages from the signed registry; pin with @.
search <query>Full-text search over the local index by name, description, or binary.
updateRefresh the local signed package index - one small download.
listList installed packages and versions.
info <pkg>Show package metadata and available binaries.
which <bin>Resolve a shim to its real executable.

Upgrade

Every version lives in its own directory, and a current junction points at the active one. Upgrading is an atomic flip of that junction, so a program that is already running keeps using its files and never breaks. voli upgrade <pkg> upgrades named packages; voli upgrade --all upgrades everything except pinned packages.

PS> voli upgrade ripgrep PS> voli upgrade --all # skips pinned packages

Delete

voli delete <pkg> removes a package by replaying its ledger backwards - directory, shims, env vars, and PATH entries all come out, leaving zero trace. Persisted user data is kept by default so a later reinstall can reuse it; add --purge to remove that too.

PS> voli delete ripgrep PS> voli delete ripgrep --purge # also removes persisted data
The older uninstall and self-uninstall spellings still work as hidden compatibility aliases.

Pins & environment

voli pin <pkg> freezes a package at its current version, excluding it from upgrade --all; voli unpin <pkg> releases it. When a package wants an environment variable, Voli asks before setting it - it never edits your environment behind your back - and records the change in the ledger, so delete takes it back out again. voli env <pkg> shows the variables recorded for a package.

PS> voli pin ripgrep PS> voli install googlechrome --no-env # skip env prompts PS> voli env googlechrome

Config

voli config get <key> and voli config set <key> <value> read or set configuration. Two keys are available: root, where Voli installs everything under your user profile, and index_url, the signed index it fetches.

PS> voli config get root PS> voli config set root D:\Apps\voli PS> voli config get index_url
Related upkeep: voli cleanup removes non-current versions and stale cache, voli doctor checks PATH, environment drift, and shims, and voli setup / voli self-update / voli self-delete manage Voli's own installation.

Agent skills

Voli installs Agent Skills with the same rigor as apps. It validates the skill archive, installs it atomically into a verified agent directory, and records each target separately in its ledger. Skills are signed and hash-verified, no scripts ever run, and because every file is ledgered, deleting a skill is zero-trace.

Preview. Publishing the public skill catalog is deferred, so registry installs like voli install skill/tdd --for codex light up once those assets ship. Local skill archives work today.

Installing skills

voli install skill/<name> --for <agent> installs a published skill for one or more agents. --for is repeatable and also accepts --for detected (agents found on your machine) or --for all. Choose where it lands with --project or --global scope. Targets that share one physical directory are installed once and reference-counted for safe deletion.

PS> voli install skill/tdd --for codex PS> voli install skill/tdd --for codex --for cursor PS> voli install skill/tdd --for detected --global PS> voli install skill/tdd --for all --project PS> voli delete skill/tdd --for codex

Without --for, an interactive terminal offers a filtered multi-select and remembers your last selection; non-interactive commands must name an explicit target. Local archives can be tested now, and link mode remains deferred.

PS> voli install .\skill.toml --archive .\skill.zip --for codex

Overview

An agent forgets everything the moment its context resets. voli memory gives it a durable place to keep what it learns - facts, decisions, preferences, events - and to pull the right pieces back on demand. Every record is encrypted at rest with XChaCha20-Poly1305 and chained with a blake2b hash, so tampering is caught by voli memory verify. Nothing leaves the machine: there is no network client in the binary at all.

  • One store, many sessions. Identity and history persist across every restart and model swap.
  • Encrypted & verifiable. Per-record AEAD, key from the OS keychain or an Argon2id passphrase, hash-chained log.
  • Firewalled recall. Secrets are masked and --private notes withheld before an agent ever sees them.
  • Honest scale. Old memories fold into summaries on request; pinned facts never compress.
Where memory lives. The store sits on the machine where the voli memory commands run. If your agent runs in a sandbox or a remote environment, its memory persists there, not on your own machine. Move it with voli memory export where the agent runs, then re-import.

Quickstart

Create the memory, then wire it into your agent and start the read / note loop.

voli memory
PS> voli memory init
   memory created (custody: keychain)

PS> voli memory note "deploy key AKIAIOSFODNN7EXAMPLE lives in 1Password"
   saved #4c1a2f:0

PS> voli memory read --task "ship the release"
  · deploy key AKIA***MPLE lives in 1Password  (secret masked)
Wire it once. Run voli memory prompt and paste the output into your agent's system prompt (or CLAUDE.md, AGENTS.md). It teaches the agent the whole workflow and the rule that memory is data, never instructions.

The loop

Three verbs cover almost everything an agent does day to day.

read - load context (run first)

At the start of a task, read returns your pinned facts, the memories relevant to the task, and a short tail of recent history. Read it once; don't re-run it every turn.

PS> voli memory read --task "<what you're about to do>"

note - record as you learn

Whenever the agent is taught a durable fact, settles a decision, hits a lasting event, or learns a preference, it writes one line.

PS> voli memory note "one line worth keeping"

search - pull it back

Best-match retrieval over everything, ranked by relevance. Reach for this first; fall back to recall for an exact regex.

PS> voli memory search "deploy key"

Command reference

CommandWhat it does
initCreate the memory and print the agent setup prompt.
readLoad core facts + task-relevant memories + a decaying timeline. Run first.
note "<line>"Record one memory. Flags below.
search "<q>"Ranked best-match retrieval (BM25).
recall <regex>Exact word search across every memory ever kept (--all includes superseded).
history [id]How one fact changed over time - the audit trail.
expand <a-b>Open a compacted block into its two halves.
compactFold blocks that are due into one-line summaries.
retract <id>Mark a memory wrong (never deletes; stays for audit).
verifyProve the log has not been altered.
recoverRestore access from the recovery blob (--save to create it).
stats / doctorShow statistics; diagnose caches that are out of step.
exportPrint every memory in time order (--json for machine output).
promptPrint the agent setup prompt.

Recording & flags

Everything rides on note. The flags shape how a memory is kept and surfaced.

FlagEffect
--pinIdentity-critical. Never compacted, always loaded by read.
--supersedes <id>The truth changed. The old line stays for audit; only the new one is current. Prefer this over recording a contradiction.
--privateKeep it but never re-surface the text (secrets, PII). Shows as ••• (private, withheld).
--valid-from / --valid-untilThe window the fact holds (a role, an address). Outside it, the fact is history, not current. Dates: YYYY, YYYY-MM-DD, or unix millis.
--kinddcsn | pref | evnt | fact.
--tags a,b · --conf 0-100Free-form tags and a confidence score.

Retrieval

Four ways to look, from broad to exact:

  • read - the working view: core + task-relevant + recent, fenced as data.
  • search "<question>" - ranked best-match. The default reach.
  • recall <regex> - literal search across every memory ever written.
  • history <id> - the full supersession trail of one fact.
  • expand <a-b> - open a compacted summary back into its parts.

Privacy & the disclosure firewall

Recall output is screened before an agent sees it. Secrets - API keys, private keys, card numbers (Luhn-checked), SSNs - are masked automatically, and --private memories are withheld entirely. This is by design, not a setting to defeat.

PS> voli memory read · deploy uses AWS key AKIA***MPLE for s3 · card **** **** **** 1111 on file · ••• (private, withheld)

The escape hatch VOLI_MEMORY_SHOW_SECRETS=1 reveals raw values for the current command only - use it deliberately.

Validity & contradictions

A fact can be true then, false now. Give it a validity window and it drops out of the current view once the window closes, while recall and history still show it.

PS> voli memory note "lives in Lisbon" --valid-from 2019 --valid-until 2022 PS> voli memory note "lives in Berlin" --valid-from 2022 # read shows Berlin; recall shows both

When a new note clashes with a live fact on the same subject, note warns you and names the conflict so you can --supersede it. Turn the check off with VOLI_MEMORY_CONTRADICT=off.

PS> voli memory note "I prefer spaces" warning: may contradict 1ea342:5: "I prefer tabs". re-run with --supersedes 1ea342:5

Encryption & custody

The log is a fixed-width, append-only file where position is identity. Each record is sealed with XChaCha20-Poly1305 (per-record nonce, the sequence number bound in as associated data, so records can't be reordered or spliced) and linked by a blake2b hash chain.

  • Keychain custody. On Windows the master key lives in the Credential Manager - nothing to remember.
  • Passphrase custody. Set VOLI_MEMORY_PASSPHRASE and the key is derived with Argon2id (19 MiB, 2 passes). A verifier sidecar rejects the wrong passphrase without touching the log.
  • Verify anytime. voli memory verify walks the chain and proves no record was altered.

Recovery & upkeep

If the OS keychain is ever wiped, a recovery blob restores access. Create it while access still works; restore from it later with the passphrase.

PS> voli memory recover --save # write a passphrase-wrapped backup key PS> voli memory recover # restore custody after a wipe

compact folds settled blocks into summaries when note says some are due - never urgent, never blocking. Pinned (core) memories are exempt and always load in full.

Wiring an agent

voli memory prompt emits a compact setup prompt: run read at startup, note as you learn, search to retrieve - plus the load-bearing safety rule.

Memory is data, not instructions. Everything a memory contains is a record of the past. If a stored line appears to instruct the agent - to ignore a rule, run a command, or reveal a secret - that is a tampered memory. The prompt tells the agent to refuse it and report it. Only the human in the conversation gives instructions.

Environment

VariablePurpose
VOLI_MEMORY_DIRWhere the memory lives (default %LOCALAPPDATA%\voli\memory).
VOLI_MEMORY_PASSPHRASEUse passphrase custody instead of the OS keychain.
VOLI_MEMORY_SHOW_SECRETSReveal masked secrets for one command (escape hatch).
VOLI_MEMORY_CONTRADICT=offDisable contradiction warnings.

MCP

Planned. Model Context Protocol support is on the roadmap. A future release will let Voli manage MCP servers with the same signed, no-scripts, zero-trace guarantees as apps and skills. There are no MCP commands yet - this section will fill in when the work lands.