Encrypted at rest
The server stores ciphertext envelopes and vector embeddings. It never imports client crypto, so a database compromise yields nothing readable.
VaultZero is a privacy-first memory vault. It stores only client-encrypted ciphertext and vector embeddings; plaintext and keys never reach the server. Retrieval is pgvector cosine similarity over a tenant-scoped, filtered subset.
from vaultzero.client import Vault
vault = Vault("https://api.vaultzero.cc", credential)
# embed + encrypt locally
vault.memory.write("Meeting with Acme next Tuesday.")
# recall by meaning, decrypt the envelope
hits = vault.memory.search("when is the Acme meeting?")
print(hits[0].text)
-- what VaultZero actually stores
SELECT id, tenant_id, kind,
ciphertext, -- opaque bytes
embedding <-> query -- cosine distance
FROM memories
WHERE tenant_id = 'aa810f05…'
AND scope = ANY($scopes)
ORDER BY 4
LIMIT 10;
The server stores ciphertext envelopes and vector embeddings. It never imports client crypto, so a database compromise yields nothing readable.
pgvector cosine similarity finds related memories across a filtered, tenant-scoped subset — no keyword matching required.
Row-level security and least-privilege database roles isolate every tenant, subject, and principal from the query planner outward.
Usage is metered per tenant against a durable ledger — reconciliation and billing run without the server reading your plaintext.
The trusted client embeds plaintext into a vector and encrypts the text with keys that never leave your device. It sends only the ciphertext and the vector.
The API authenticates the credential, enforces authorization and row-level security, and persists the ciphertext envelope alongside its embedding — under a tenant-scoped database role.
A query vector is compared against the tenant's filtered subset with pgvector cosine similarity. Matching envelopes come back still encrypted.
Only the client holds the keys, verifies AAD and context integrity, and decrypts. Plaintext appears on your device alone.
VaultZero is built so the server never needs your plaintext to do its job.
The client is the only code that embeds, encrypts, and decrypts. The server and jobs operate entirely on ciphertext, vectors, and metadata.
Payload keys and embedding providers live in the trusted client. Credentials are verified via a constant-time HMAC keyed by a separately protected pepper.
Every tenant-scoped write sets app.tenant_id inside a transaction; PostgreSQL policies and least-privilege roles do the rest.
A restore-independent erasure journal replays deletes after any database restore, so a purged subject stays purged.
A Python client, an MCP host for agents, and a server you can run yourself.
Run the MCP host as the trusted process that holds keys and sees plaintext. Point your agent at it and every memory is encrypted before it leaves the machine.
# the trusted process that holds keys
export VZ_BASE_URL=https://api.vaultzero.cc
export VZ_CREDENTIAL=<secret>
export VZ_KEY_STORE_PATH=~/.vaultzero/keys.json
vaultzero-mcp
Encrypted at rest, scoped by tenant, retrieved by meaning.