Skip to main content
The sovseal binary ships inside @sovseal/mcp-server — there is no separate CLI package to install or keep in sync. The CLI, the MCP server, the native messaging host, and the SDK are one build reading and writing the same on-device vault at ~/.sovseal, so the CLI can never end up reading a schema a different version wrote.
No account or API key is required. Storing and recalling work entirely offline. Linking an account only adds multi-device sync, team seats, and the audit ledger.

Quick start

Commands

Run sovseal help <command> for the full flag list of any one of them.

store

Embeds text on-device and writes it to the encrypted LanceDB store. High-risk PII is redacted before the text is embedded or stored, and near-duplicate content reinforces the existing memory instead of creating a second row — so piping the same log twice is safe.
string
Content to remember. Omit it to read from stdin or --file.
path
Read the content from a file instead of an argument.
string
default:"explicit"
How the memory was obtained: explicit, observed, or synthesized. Recall trusts explicit most.

recall

Embeds the query on-device and ranks memories by a composite of cosine similarity, recency decay, and how often the fact has been restated. 0 RTT — the same path the recall_memory MCP tool takes.
integer
default:"5"
Number of results to return (1–20).
number
default:"0"
Drop results below this raw cosine similarity.
boolean
Print each memory in full instead of truncating to one line.

doctor

Runs nine probes in one pass and streams each finding with a concrete fix:
  1. Node.js runtime version
  2. Config directory existence and permissions
  3. Encryption key custody (OS keychain reachable, subkeys derive)
  4. Project identity
  5. Local vector store (row count, schema version, replication backlog)
  6. On-device embedding model
  7. Chrome native-messaging bridge
  8. MCP client registration
  9. Sync endpoint reachability (skip with --offline)
doctor exits 5 only when a check fails. Warnings — an unregistered browser bridge, an unreachable sync endpoint — leave it at 0, because memory still works local-first. That makes it safe as a CI or post-install gate.

open

Jumps straight to a dashboard page instead of making you find the URL:
Known pages: home, plan, proof, devices, settings, auth, docs.

Use from an AI agent

--json (alias --agent) switches every command to a structured envelope on stdout, with no colour, spinners, or prompts:
Failures use the same envelope shape:
Discover the whole surface as data rather than scraping help text:
--json is accepted before or after the command name, so sovseal --json recall "x" and sovseal recall "x" --json are equivalent.

Exit codes

Exit codes are part of the public surface — scripts branch on them.

sovseal login — linking a device

The CLI binds an ephemeral port on 127.0.0.1 and sends you to /connect/cli on the dashboard. The dashboard derives your account master in the browser, derives the deterministic project token (sov_proj_…) from it, and redirects that token back to the local listener. Your passphrase, account master, and encryption keys never leave the browser — the master is zeroed as soon as the token is derived. Only the project token moves, and it moves over loopback.
The dashboard refuses any redirect_uri that is not http + a loopback host + exactly /callback, so a crafted “connect sovseal” link cannot redirect your project token to a remote server. The CLI independently compares the returned state in constant time and rejects requests whose Host header is not loopback.
sovseal logout clears the token and account fields. Your memories and encryption keys are untouched — recall keeps working offline, replication just stops.

Configuration

sovseal config operates on ~/.sovseal/config.json (mode 0600). Secrets are redacted on read, and only a whitelist of keys is writable — the rest are runtime-owned, and hand-editing them would break your vault.

Guarantees

  • No telemetry. The CLI reports nothing, anywhere, and has no flag to disable because there is nothing to disable.
  • Secrets are never printed in full — project tokens are redacted in every output mode, including --json.
  • Destructive commands refuse to run unattended. delete --all requires --force, and a non-interactive shell can never be prompted into a yes.
  • Fast by default. Commands that do not touch the vector engine (help, open, config, whoami, version) skip loading it entirely.