Skip to content
ARCAVISION
Arca Vision

ARCA CLI

ARCA CLI reference.

The same local vault as the macOS and Windows app: items, environments, inject, agent broker, and SSH. App sockets ship with the macOS app first.

Free download · macOS & Windows · Linux coming

Download for Mac
$ curl -fL -o Arca-1.0.1.dmg https://releases.arca.vision/1.0.1/Arca-1.0.1.dmg

Quickstart

ARCA CLI talks to the same encrypted vault as the desktop app. No account. No cloud. Create a vault, add items, inject secrets into a script, wrap an agent, then lock or quit.

Start a vault

arca init creates the vault file. It calibrates the KDF, asks for a password, and prints recovery shares. It will not overwrite an existing file. --file is ignored; pass the path as the argument.

$ arca init ~/vault.arca

Unlock, lock, quit

unlock checks the password and remembers that path as the default vault. lock locks the app session. lock --quit-app asks the app to quit after locking.

$ arca unlock ~/vault.arca$ arca lock$ arca lock --quit-app

Two ways to run (and a third for SSH)

Most commands either talk to the open app, or open the vault file themselves. App sockets ship with the macOS app first. The first Windows drop is direct CLI only.

With the app

The CLI talks to ~/.arca/ctl.sock. Same-user only. Secret values never cross that socket. Ships with the macOS app first. Not in the first Windows drop.

Direct

arca --direct --file PATH <command> reads and writes the vault file. Works with the app closed. First Windows CLI path. arca inject works; the child sees secrets.

SSH agent

A separate socket at ~/.arca/agent.sock. The agent runs inside the app. Serve a key with arca ssh add. Combine with HTTP grants via arca agent --ssh. Needs the running app — not in the first Windows drop.

--app requires the app and exits 8 if it is missing. --direct never contacts the app. With neither flag, the CLI tries the app socket, then falls back to the vault file.

$ arca list$ arca --direct --file ~/vault.arca list$ arca --app list

Inject a script, wrap an agent

Import a .env once. Run a script with arca inject so the child sees env (direct CLI works on Windows). Wrap Claude with arca agent on the macOS app so it never does.

$ arca env import --item Stripe --branch production --from-file .env.production$ arca inject --env-file @Stripe/production -- cargo test$ arca agent --github GitHub --anthropic Anthropic --ttl 900 -- claude

What just happened

  • An Env item titled Stripe is created on the production environment.
  • Secrets entered only the child process for cargo test.
  • claude got dummy tokens and HTTPS_PROXY; Arca attached the real secret on the wire.
  • The parent shell and the file on disk were left untouched.

Concepts

The vault file

One encrypted envelope file holds the vault. A fresh file has one inner vault named default (DEFAULT — Personal in the app switcher). Pro users can create additional named vaults inside that same file. Names are lowercase letters, digits, and hyphens, max 64. Switch from the title bar; manage under Settings → Data → Vaults. Point at the envelope with --file PATH, $ARCA_VAULT, or the path saved by unlock. --vault NAME selects an inner vault (Pro, including --vault default). There is no --license flag.

$ arca --direct --file ~/vault.arca list$ export ARCA_VAULT=~/vault.arca$ arca vault create work$ arca --direct --file ~/vault.arca --vault work list

Environments

The app says environment. The CLI flag is --branch. Every Env item has default. Named environments are created only by env import. arca add --kind env always lands on default.

FlagMeaningDefault
--branch BRANCHEnvironment name. Used on env import and inject.default
--item TITLEEnv item title. Alternative to --id on env import.required with import
--from-file PATHPath to a .env. Values come from the file, never argv.required on import
--yesCreate the Env item if it is missing.off
$ arca add --kind env --title Stripe --secret-field STRIPE_KEY$ arca env import --item Stripe --branch production --from-file .env.production --yes

Selectors

A selector names which vault data to inject. Use a vault selector when you want a whole Env environment. Use arca:// when a committed file should list keys, not values.

@ITEM/BRANCH

Preferred. ITEM is the item title. BRANCH is the environment. Pass it to inject --env-file. The value must start with @ — that is how inject knows it is not a path on disk.

$ arca inject --env-file @Stripe/production -- cargo test$ arca inject --env-file @Stripe/local -- npm run dev

--item and --branch

Same as @ITEM/BRANCH, written as flags. Omit --branch to use default. Do not combine these flags with @ITEM/BRANCH.

$ arca inject --item Stripe --branch production -- npm test$ arca inject --item Stripe -- cargo test

arca://Item/KEY

A placeholder you put in a .env on disk. At inject time ARCA replaces the ref with that field's secret. Split on the last /. The left side is the item title (spaces allowed). The right side is the field name. Literals stay literals.

.env

GH_TOKEN=arca://GitHub/passwordDATABASE_URL=arca://App DB/urlRUST_LOG=debug
$ arca inject --env-file .env -- npm start
FlagMeaningDefault
@ITEM/BRANCHVault selector for a whole Env environment. ITEM is the title; BRANCH is the environment.n/a
--item / --branchSame as @ITEM/BRANCH. Do not mix with @ITEM/BRANCH.branch = default
arca://Item/KEYOne field, from default only. Used inside a disk .env, not as --env-file itself.n/a

How the CLI reaches the vault

Default on macOS: talk to the running app over ~/.arca/ctl.sock. Direct: --direct --file PATH opens the envelope (first Windows CLI path). SSH uses ~/.arca/agent.sock and needs the running app.

FlagMeaningDefault
--file PATHEnvelope file for direct mode. Overrides $ARCA_VAULT and the saved default. Ignored when talking to the app.resolved path
--vault NAMEInner vault after the envelope is open. Pro, including --vault default. A path-shaped value is still a name, not a path.implicit DEFAULT
--directNever contact the app. Open the vault file.off
--appRequire the app; exit 8 if missing. Conflicts with --direct.off
--jsonMachine-readable metadata on stdout (list / get without a secret field).off
--no-inputNever prompt; fail instead. Secrets may still come from redirected stdin.off
-v / --verboseDiagnostics on stderr. Never secrets, never unlock detail.off
$ arca --app list$ arca --direct --file ~/vault.arca show GitHub --field password
Vault file, ctl.sock, and agent.sockThree endpoints: the encrypted vault file (direct), the app control socket at ~/.arca/ctl.sock, and the SSH agent socket at ~/.arca/agent.sock.VAULT FILE--direct --file PATHAPP SOCKET~/.arca/ctl.sockAGENT.SOCK~/.arca/agent.sock
Three endpoints. No grant-proxy port on this diagram.

Command reference

A

Environments

One Env item holds the same keys across default and named environments. Notes stay on the item and are never injected.

Reads a .env file once and stores those keys on an Env item. After import, the vault is the source of truth.

FlagMeaningDefault
--item TITLEItem title. Use this or --id, not both.required unless --id
--id HEXItem id (32-character lowercase hex).required unless --item
--branch BRANCHEnvironment name. Named environments are created only here.default
--from-file PATHPath to a .env. Values come from the file, never argv.required
--yesCreate the Env item if it is missing. Without it, a missing title is exit 5.off

.env.production

# Stripe production — import once, then stop committing this fileSTRIPE_KEY=sk_live_replace_meSTRIPE_WEBHOOK_SECRET=whsec_replace_me

.env.local

# Stripe local — same keys, different values, default stays untouchedSTRIPE_KEY=sk_test_replace_meSTRIPE_WEBHOOK_SECRET=whsec_test_replace_me
$ arca env import --item Stripe --branch production --from-file .env.production --yes$ arca env import --item Stripe --branch local --from-file .env.local --yes

Exit 0 success. 1 Pro required. 5 missing title without --yes, kind mismatch, or illegal branch.

Creates an Env item with secret fields on the default environment.

FlagMeaningDefault
--kind envItem kind. Other kinds are under Vault & items.required
--title TItem title. Metadata, never secret.required
--secret-field KEYSecret field name. The value is prompted with echo off.repeatable
--tag tTag the item (repeatable).none
$ arca add --kind env --title Stripe --secret-field STRIPE_KEY --tag billing

Exit 0 success. 5 ambiguous title on later address.

A committed .env can mix arca://Item/KEY refs and plain literals. At inject, each ref is replaced with that field from the vault.

FlagMeaningDefault
arca://Item/KEYVault reference in a disk template. Split on the last /. Titles may contain spaces.n/a

.env

GH_TOKEN=arca://GitHub/passwordDATABASE_URL=arca://App DB/urlRUST_LOG=debug
$ arca inject --env-file .env -- npm start

Exit Inject: exit 5 if a reference is unresolved, a blob field is named, or the field name is not unique on default.

B

Inject

inject puts secret values in the child environment. Right for scripts, compilers, local servers, and Windows at launch. Wrong pitch for AI agents when the app is open — use arca agent.

Starts one child process whose environment contains secrets from a vault selector or a disk template.

FlagMeaningDefault
--env-file PATH|@ITEM/BRANCHDisk template, or vault selector when the value starts with @. Option of inject, not of arca. Required unless --item is set.required unless --item
--item ITEMEnv item title or id. Injects that environment with no file.optional
--branch BRANCHEnvironment name with --item. Do not combine with @ITEM/BRANCH.default
-- <cmd>Program and args. Must follow --.required
$ arca inject --env-file @Stripe/production -- cargo test

Exit 0 or the child's status. 1 Pro required. 5 unresolved ref, missing branch, or ambiguous field. 8 if --app and the app is missing.

C

Agent broker

arca agent is a local HTTPS proxy. Dummy tokens stay in the child; Arca attaches the real secret on the wire. Compiled-in hosts only. Needs the running macOS app first. App required.

Local HTTPS credential broker. The child never sees vault fields. Sets HTTPS_PROXY, dummy conventional env, and CA trust vars. Arca terminates TLS for granted hosts and attaches Authorization: Bearer <secret>.

FlagMeaningDefault
--github ITEM[:FIELD]MITM api.github.com, npm.pkg.github.com, uploads.github.com. Dummy GH_TOKEN and GITHUB_TOKEN. Does not intercept github.com.off
--anthropic ITEM[:FIELD]MITM api.anthropic.com. Dummy ANTHROPIC_API_KEY.off
--openai ITEM[:FIELD]MITM api.openai.com. Dummy OPENAI_API_KEY.off
--openrouter ITEM[:FIELD]MITM the whole host openrouter.ai. Dummy OPENROUTER_API_KEY.off
--groq ITEM[:FIELD]MITM api.groq.com. Dummy GROQ_API_KEY.off
--deepseek ITEM[:FIELD]MITM api.deepseek.com. Dummy DEEPSEEK_API_KEY.off
--xai ITEM[:FIELD]MITM api.x.ai. Dummy XAI_API_KEY.off
--nous ITEM[:FIELD]MITM inference-api.nousresearch.com. Dummy NOUS_API_KEY.off
--npm ITEM[:FIELD]MITM registry.npmjs.org. Dummy NPM_TOKEN and NPM_AUTH_TOKEN.off
--cloudflare ITEM[:FIELD]MITM api.cloudflare.com. Dummy CLOUDFLARE_API_TOKEN.off
--vercel ITEM[:FIELD]MITM api.vercel.com. Dummy VERCEL_TOKEN.off
--ssh ITEM[:FIELD]Same serve path as arca ssh add, combined with HTTP grants. Sets SSH_AUTH_SOCK.off
--ttl SECSSeconds the grant lives.900 (cap 3600)
-- <cmd>Program and args. Must follow --. Wrap dies on child-exit.required for wrap
$ arca agent --github GitHub --anthropic Anthropic --ttl 900 -- claude$ arca agent --openrouter OpenRouter --groq Groq -- claude$ arca agent --github GitHub --ssh Laptop -- git push$ arca agent --npm NpmToken -- npm publish$ arca agent --nous Hermes --npm npm --vercel Vercel --ttl 900 -- hermes

Exit 0 or the child's status. 1 Pro required (agent grants stderr). 8 app required (--direct cannot invent a broker).

Standalone broker. No child. Dies on TTL, lock, or stop — not on child-exit.

FlagMeaningDefault
--<preset> ITEM[:FIELD]Same compiled-in HTTP and SSH flags as wrap.at least one
--ttl SECSSeconds the grant lives.900 (cap 3600)
--yesSkip the confirmation prompt.off
$ arca agent start --github GitHub --ttl 900 --yes

Exit 0 success. 1 Pro required (agent grants stderr). 8 app required.

Inspect or tear down a live broker. Always free.

FlagMeaningDefault
statusWhether a grant is live, remaining TTL, granted hosts.n/a
stopRevoke live grants and stop the loopback proxy.n/a
$ arca agent status$ arca agent stop

Exit 0 success. 8 app required.

Compiled-in presets

These flags are compiled into the broker. There is no add-custom-host UI. Unknown hosts, and hosts without a live grant, are refused.

Compiled-in arca agent presets
FlagHosts Arca will MITMDummy envTypical use
--githubapi.github.com, npm.pkg.github.com, uploads.github.comGH_TOKEN, GITHUB_TOKENgh, GitHub REST/GraphQL, GitHub Packages, release uploads
--anthropicapi.anthropic.comANTHROPIC_API_KEYClaude API
--openaiapi.openai.comOPENAI_API_KEYOpenAI API
--openrouteropenrouter.aiOPENROUTER_API_KEYOne key, many models
--groqapi.groq.comGROQ_API_KEYFast OpenAI-compatible inference
--deepseekapi.deepseek.comDEEPSEEK_API_KEYDeepSeek API
--xaiapi.x.aiXAI_API_KEYGrok
--nousinference-api.nousresearch.comNOUS_API_KEYHermes Agent / Nous Portal
--npmregistry.npmjs.orgNPM_TOKEN, NPM_AUTH_TOKENnpm publish / private npmjs
--cloudflareapi.cloudflare.comCLOUDFLARE_API_TOKENWrangler / Cloudflare API
--vercelapi.vercel.comVERCEL_TOKENVercel deploy API
--ssh(Unix socket, not HTTPS)SSH_AUTH_SOCKgit push over SSH

--github covers the GitHub API, Packages (npm.pkg.github.com), and release uploads. It does not intercept github.com. Use --ssh for git push.

--openrouter covers the whole host openrouter.ai (API and site, if the child fetches it).

--ttl is seconds (default 900, maximum 3600).

Not brokered: github.com (the website / git-over-HTTPS), vercel.com the marketing site, Slack, Datadog, Telegram, Discord, GitLab, Linear, Gemini query keys, AWS/GCP, Stripe, user-defined hosts, or wildcards.

D

SSH agent

The SSH agent runs inside the app. Point SSH at ~/.arca/agent.sock, then serve a key with arca ssh add. Combine with HTTP grants via arca agent --ssh. Needs the running app; not in the first Windows drop.

Serves a vault SSH key on ~/.arca/agent.sock for a TTL. You can also import a file, then serve it. Keys never leave the app.

FlagMeaningDefault
<item|PATH|->Vault item id/title, a key file path (import-then-serve), or - for stdin.required
--ttl SECSSeconds the key stays served.300 (cap 28800)
$ export SSH_AUTH_SOCK="$HOME/.arca/agent.sock"$ arca ssh add Laptop --ttl 3600

Exit 0 success. 1 Pro required. 8 app required (agent lives in the app).

List, revoke one, or flush all served keys.

FlagMeaningDefault
listFingerprint, comment, expiry. Empty is exit 0.n/a
remove <item|fingerprint>Stop serving one key; remaining TTL ignored.n/a
flushStop serving all keys. Lock also revokes all keys.n/a
$ arca ssh list$ arca ssh remove Laptop$ arca ssh flush

Exit 0 success (including empty list). 8 app required.

Sign commits through the in-app agent after pointing SSH at ~/.arca/agent.sock and serving a key.

$ export SSH_AUTH_SOCK="$HOME/.arca/agent.sock"$ arca ssh add git-signing --ttl 3600$ git commit -S -m "signed with a key that never exists on disk"

Exit Git's status. ssh add is Pro; the socket is empty until a key is served.

E

Vault & items

Item CRUD is free. Named-vault create, rename, and --vault NAME are Pro. vault list and the implicit DEFAULT stay free. Secrets never appear in argv.

Creates a vault file at PATH. Calibrates the KDF, asks for a password, and prints recovery shares.

FlagMeaningDefault
<PATH>Where to create the file. Refuses to overwrite.required
--duressAlso set a duress password (prompted).off
--threshold KShares required to reconstruct (2–10).3
--shares NShares printed (2–10, K ≤ N).5
$ arca init /tmp/vault.arca

Exit 0 success. 1 weak password after three refusals.

Checks the password and records the path as the default vault.

FlagMeaningDefault
<PATH>Vault to verify. Defaults to the resolved vault.resolved path
$ arca unlock /tmp/vault.arca

Exit 0 success.

Locks the app session. With --quit-app, asks the app to quit after locking.

FlagMeaningDefault
--quit-appAsk the app to quit after locking. Exit 8 if the app is missing.off
$ arca lock

Exit 0 success. 8 if --quit-app and the app is missing.

Changes the vault password. Prompts; never flags.

$ arca --direct --file /tmp/vault.arca change-password

Exit 0 success. 9 if the app has the vault open.

Creates a named inner vault in the open envelope. No new password; wraps to the envelope master key. There is no delete.

FlagMeaningDefault
<NAME>Display name: lowercase [a-z0-9][a-z0-9-]*, at most 64 characters.required
$ arca vault create work$ arca --direct --file ~/vault.arca vault create lab

Exit 0 success. 1 Pro required. 5 That vault could not be created.

Lists named inner vaults in the envelope. * marks the active vault. Free.

$ arca vault list$ arca --direct --file ~/vault.arca vault list$ arca --json vault list

Exit 0 success.

Renames an inner vault. Identity (UUID) is unchanged. There is no delete.

FlagMeaningDefault
<NAME>Current name or 32-character hex id.required
<NEW>New display name. Same charset as create.required
$ arca vault rename work job

Exit 0 success. 1 Pro required. 5 No vault with that name. / That vault could not be renamed.

Creates an item. Secret values are prompted; they never go on the command line.

FlagMeaningDefault
--kind KINDlogin, env, ssh-key, api-key, and the other kebab-case kinds.required
--title TItem title.required
--tag tRepeatable tag.none
--field NAME=VALUENon-secret field. argv is world-readable.none
--secret-field NAMESecret field; value prompted echo-off.none
--from-file PATHImport key bytes (ssh-key / gpg-key).none
$ arca add --kind login --title GitHub --secret-field password --tag work

Exit 0 success.

Prints item metadata. An optional query is a substring match on titles.

FlagMeaningDefault
--kind KINDFilter by kind.all
--tag tFilter by tag (repeatable).all
<QUERY>Substring match against titles.none
$ arca --json list --kind env

Exit 0 success, including an empty list.

Prints metadata, or one non-secret field.

FlagMeaningDefault
<ITEM>32-hex id, exact title, or unique prefix.required
--field NAMEOne field. Text prints; secrets use show or copy.metadata
$ arca get GitHub$ arca get Laptop --field public_key

Exit 0 success. 5 no such item/field or ambiguous title. 9 secret field refused in this mode.

Updates title, tags, and fields on an existing item.

FlagMeaningDefault
<ITEM>Id or title.required
--title TReplace the title.unchanged
--add-tag tAdd a tag (repeatable).none
--remove-tag tRemove a tag (repeatable).none
--set-field NAME=VALUESet a non-secret field.none
--set-secret-field NAMEPrompt a new secret value.none
--remove-field NAMERemove a field by name.none
$ arca edit GitHub --add-tag prod --set-secret-field password

Exit 0 success. 5 no such item.

Deletes an item after confirm. --yes skips the prompt.

FlagMeaningDefault
<ITEM>Id or title.required
--yes / -ySkip confirmation. Required under --no-input.off
$ arca remove GitHub --yes

Exit 0 success, including a declined confirm.

Copies a secret to the clipboard. The clipboard clears after 45 seconds.

FlagMeaningDefault
<ITEM>Id or title.required
--field NAMEField to copy. Defaults to the only secret field.only secret
$ arca copy GitHub

Exit 0 success. 9 without the app (no standalone clipboard guard).

Prints a secret to stdout.

FlagMeaningDefault
<ITEM>Id or title.required
--field NAMEField to print. Defaults to the only secret field.only secret
$ arca --direct --file /tmp/vault.arca show GitHub --field password

Exit 0 success. 5 several secrets and no --field. 9 over IPC.

Prints a password, API key, or passphrase. Without --save, no vault is required.

FlagMeaningDefault
--kind KINDpassword | api-key | passphrase.password
--length NPassword character count, or api-key byte count.24 / 32
--words NPassphrase word count (4–12).6
--save TITLECreate an item instead of printing.print
--no-symbolsLeave symbols out of a password.off
--no-digitsLeave digits out of a password.off
$ arca generate --kind password --length 24

Exit 0 success.

F

Recovery & maintenance

CLI recover and export-shares are free. Reissuing recovery cards in the GUI is Pro. There is no update CLI verb — updates are user-initiated in the app.

Rebuilds the vault from paper shares, then immediately asks for a new password.

FlagMeaningDefault
--shares KHow many cards you will type (2–10), not the original N.3
$ arca --file /tmp/vault.arca recover --shares 3

Exit 0 success.

Prints a new share set and invalidates the previous one.

FlagMeaningDefault
--threshold KShares required to reconstruct (2–10).3
--shares NShares printed (2–10).5
$ arca --file /tmp/vault.arca export-shares --threshold 3 --shares 5

Exit 0 success.

Free vs Pro on the CLI

Gated — Pro / trialStill free
arca injectinit / unlock / lock / change-password / recover / export-shares
arca env importlist / get / add / edit / remove / generate
arca agent wrap and startcopy / show
arca ssh addarca agent status / stop
App import formats: 1Password (.1pux), Bitwarden (.json), KeePass (.kdbx), Chrome/Edge (.csv) — distinct from env importarca ssh list / remove / flush
Multiple vaults (work, personal, client-separated) — arca vault create / rename / --vault NAMEGUI Env editor + ordinary item CRUD

Pro features need an active trial, Pro, pro_expired, or enterprise. The 14-day trial counts.

Agent, inject, env, and named vaults require Pro. Start a 14-day trial or upgrade. The vault still opens.
Agent grants require Pro. Start a 14-day trial or upgrade. The vault still opens.

Honesty & limits

Exit codes

CodeMeaningWhat to do
0SuccessIncluding an empty list and a declined remove confirm.
1pro_requiredStart a 14-day trial or upgrade. The vault still opens. See the exact stderr lines under Free vs Pro.
5Selector / item resolutionMissing item, missing field, unresolved arca://, kind mismatch, or ambiguous title. Unknown or ambiguous --vault NAME: No vault with that name. / Several vaults match that name. Fix the selector.
8App requiredStart the ARCA app. Applies to arca agent, arca ssh, and any --app invocation.
9Operation refusedarca show while talking to the app — use --direct. Secret get --field on a TTY or through the app. copy without the app. change-password while the app has the vault open.

Engineering secure clinical
systems.

Schedule a review