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
$ curl -fL -o Arca-1.0.1.dmg https://releases.arca.vision/1.0.1/Arca-1.0.1.dmgOn this page
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.arcaUnlock, 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-appTwo 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 listInject 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 -- claudeWhat 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 listEnvironments
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.
| Flag | Meaning | Default |
|---|---|---|
--branch BRANCH | Environment name. Used on env import and inject. | default |
--item TITLE | Env item title. Alternative to --id on env import. | required with import |
--from-file PATH | Path to a .env. Values come from the file, never argv. | required on import |
--yes | Create 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 --yesSelectors
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 testarca://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| Flag | Meaning | Default |
|---|---|---|
@ITEM/BRANCH | Vault selector for a whole Env environment. ITEM is the title; BRANCH is the environment. | n/a |
--item / --branch | Same as @ITEM/BRANCH. Do not mix with @ITEM/BRANCH. | branch = default |
arca://Item/KEY | One 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.
| Flag | Meaning | Default |
|---|---|---|
--file PATH | Envelope file for direct mode. Overrides $ARCA_VAULT and the saved default. Ignored when talking to the app. | resolved path |
--vault NAME | Inner vault after the envelope is open. Pro, including --vault default. A path-shaped value is still a name, not a path. | implicit DEFAULT |
--direct | Never contact the app. Open the vault file. | off |
--app | Require the app; exit 8 if missing. Conflicts with --direct. | off |
--json | Machine-readable metadata on stdout (list / get without a secret field). | off |
--no-input | Never prompt; fail instead. Secrets may still come from redirected stdin. | off |
-v / --verbose | Diagnostics on stderr. Never secrets, never unlock detail. | off |
$ arca --app list$ arca --direct --file ~/vault.arca show GitHub --field passwordCommand 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.
| Flag | Meaning | Default |
|---|---|---|
--item TITLE | Item title. Use this or --id, not both. | required unless --id |
--id HEX | Item id (32-character lowercase hex). | required unless --item |
--branch BRANCH | Environment name. Named environments are created only here. | default |
--from-file PATH | Path to a .env. Values come from the file, never argv. | required |
--yes | Create 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 --yesExit 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.
| Flag | Meaning | Default |
|---|---|---|
--kind env | Item kind. Other kinds are under Vault & items. | required |
--title T | Item title. Metadata, never secret. | required |
--secret-field KEY | Secret field name. The value is prompted with echo off. | repeatable |
--tag t | Tag the item (repeatable). | none |
$ arca add --kind env --title Stripe --secret-field STRIPE_KEY --tag billingExit 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.
| Flag | Meaning | Default |
|---|---|---|
arca://Item/KEY | Vault 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 startExit 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.
| Flag | Meaning | Default |
|---|---|---|
--env-file PATH|@ITEM/BRANCH | Disk template, or vault selector when the value starts with @. Option of inject, not of arca. Required unless --item is set. | required unless --item |
--item ITEM | Env item title or id. Injects that environment with no file. | optional |
--branch BRANCH | Environment name with --item. Do not combine with @ITEM/BRANCH. | default |
-- <cmd> | Program and args. Must follow --. | required |
$ arca inject --env-file @Stripe/production -- cargo testExit 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>.
| Flag | Meaning | Default |
|---|---|---|
--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 SECS | Seconds 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 -- hermesExit 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.
| Flag | Meaning | Default |
|---|---|---|
--<preset> ITEM[:FIELD] | Same compiled-in HTTP and SSH flags as wrap. | at least one |
--ttl SECS | Seconds the grant lives. | 900 (cap 3600) |
--yes | Skip the confirmation prompt. | off |
$ arca agent start --github GitHub --ttl 900 --yesExit 0 success. 1 Pro required (agent grants stderr). 8 app required.
Inspect or tear down a live broker. Always free.
| Flag | Meaning | Default |
|---|---|---|
status | Whether a grant is live, remaining TTL, granted hosts. | n/a |
stop | Revoke live grants and stop the loopback proxy. | n/a |
$ arca agent status$ arca agent stopExit 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.
| Flag | Hosts Arca will MITM | Dummy env | Typical use |
|---|---|---|---|
| --github | api.github.com, npm.pkg.github.com, uploads.github.com | GH_TOKEN, GITHUB_TOKEN | gh, GitHub REST/GraphQL, GitHub Packages, release uploads |
| api.anthropic.com | ANTHROPIC_API_KEY | Claude API | |
| api.openai.com | OPENAI_API_KEY | OpenAI API | |
| openrouter.ai | OPENROUTER_API_KEY | One key, many models | |
| api.groq.com | GROQ_API_KEY | Fast OpenAI-compatible inference | |
| api.deepseek.com | DEEPSEEK_API_KEY | DeepSeek API | |
| api.x.ai | XAI_API_KEY | Grok | |
| inference-api.nousresearch.com | NOUS_API_KEY | Hermes Agent / Nous Portal | |
| registry.npmjs.org | NPM_TOKEN, NPM_AUTH_TOKEN | npm publish / private npmjs | |
| api.cloudflare.com | CLOUDFLARE_API_TOKEN | Wrangler / Cloudflare API | |
| api.vercel.com | VERCEL_TOKEN | Vercel deploy API | |
| --ssh | (Unix socket, not HTTPS) | SSH_AUTH_SOCK | git 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.
| Flag | Meaning | Default |
|---|---|---|
<item|PATH|-> | Vault item id/title, a key file path (import-then-serve), or - for stdin. | required |
--ttl SECS | Seconds the key stays served. | 300 (cap 28800) |
$ export SSH_AUTH_SOCK="$HOME/.arca/agent.sock"$ arca ssh add Laptop --ttl 3600Exit 0 success. 1 Pro required. 8 app required (agent lives in the app).
List, revoke one, or flush all served keys.
| Flag | Meaning | Default |
|---|---|---|
list | Fingerprint, comment, expiry. Empty is exit 0. | n/a |
remove <item|fingerprint> | Stop serving one key; remaining TTL ignored. | n/a |
flush | Stop serving all keys. Lock also revokes all keys. | n/a |
$ arca ssh list$ arca ssh remove Laptop$ arca ssh flushExit 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.
| Flag | Meaning | Default |
|---|---|---|
<PATH> | Where to create the file. Refuses to overwrite. | required |
--duress | Also set a duress password (prompted). | off |
--threshold K | Shares required to reconstruct (2–10). | 3 |
--shares N | Shares printed (2–10, K ≤ N). | 5 |
$ arca init /tmp/vault.arcaExit 0 success. 1 weak password after three refusals.
Checks the password and records the path as the default vault.
| Flag | Meaning | Default |
|---|---|---|
<PATH> | Vault to verify. Defaults to the resolved vault. | resolved path |
$ arca unlock /tmp/vault.arcaExit 0 success.
Locks the app session. With --quit-app, asks the app to quit after locking.
| Flag | Meaning | Default |
|---|---|---|
--quit-app | Ask the app to quit after locking. Exit 8 if the app is missing. | off |
$ arca lockExit 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-passwordExit 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.
| Flag | Meaning | Default |
|---|---|---|
<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 labExit 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 listExit 0 success.
Renames an inner vault. Identity (UUID) is unchanged. There is no delete.
| Flag | Meaning | Default |
|---|---|---|
<NAME> | Current name or 32-character hex id. | required |
<NEW> | New display name. Same charset as create. | required |
$ arca vault rename work jobExit 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.
| Flag | Meaning | Default |
|---|---|---|
--kind KIND | login, env, ssh-key, api-key, and the other kebab-case kinds. | required |
--title T | Item title. | required |
--tag t | Repeatable tag. | none |
--field NAME=VALUE | Non-secret field. argv is world-readable. | none |
--secret-field NAME | Secret field; value prompted echo-off. | none |
--from-file PATH | Import key bytes (ssh-key / gpg-key). | none |
$ arca add --kind login --title GitHub --secret-field password --tag workExit 0 success.
Prints item metadata. An optional query is a substring match on titles.
| Flag | Meaning | Default |
|---|---|---|
--kind KIND | Filter by kind. | all |
--tag t | Filter by tag (repeatable). | all |
<QUERY> | Substring match against titles. | none |
$ arca --json list --kind envExit 0 success, including an empty list.
Prints metadata, or one non-secret field.
| Flag | Meaning | Default |
|---|---|---|
<ITEM> | 32-hex id, exact title, or unique prefix. | required |
--field NAME | One field. Text prints; secrets use show or copy. | metadata |
$ arca get GitHub$ arca get Laptop --field public_keyExit 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.
| Flag | Meaning | Default |
|---|---|---|
<ITEM> | Id or title. | required |
--title T | Replace the title. | unchanged |
--add-tag t | Add a tag (repeatable). | none |
--remove-tag t | Remove a tag (repeatable). | none |
--set-field NAME=VALUE | Set a non-secret field. | none |
--set-secret-field NAME | Prompt a new secret value. | none |
--remove-field NAME | Remove a field by name. | none |
$ arca edit GitHub --add-tag prod --set-secret-field passwordExit 0 success. 5 no such item.
Deletes an item after confirm. --yes skips the prompt.
| Flag | Meaning | Default |
|---|---|---|
<ITEM> | Id or title. | required |
--yes / -y | Skip confirmation. Required under --no-input. | off |
$ arca remove GitHub --yesExit 0 success, including a declined confirm.
Copies a secret to the clipboard. The clipboard clears after 45 seconds.
| Flag | Meaning | Default |
|---|---|---|
<ITEM> | Id or title. | required |
--field NAME | Field to copy. Defaults to the only secret field. | only secret |
$ arca copy GitHubExit 0 success. 9 without the app (no standalone clipboard guard).
Prints a secret to stdout.
| Flag | Meaning | Default |
|---|---|---|
<ITEM> | Id or title. | required |
--field NAME | Field to print. Defaults to the only secret field. | only secret |
$ arca --direct --file /tmp/vault.arca show GitHub --field passwordExit 0 success. 5 several secrets and no --field. 9 over IPC.
Prints a password, API key, or passphrase. Without --save, no vault is required.
| Flag | Meaning | Default |
|---|---|---|
--kind KIND | password | api-key | passphrase. | password |
--length N | Password character count, or api-key byte count. | 24 / 32 |
--words N | Passphrase word count (4–12). | 6 |
--save TITLE | Create an item instead of printing. | |
--no-symbols | Leave symbols out of a password. | off |
--no-digits | Leave digits out of a password. | off |
$ arca generate --kind password --length 24Exit 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.
| Flag | Meaning | Default |
|---|---|---|
--shares K | How many cards you will type (2–10), not the original N. | 3 |
$ arca --file /tmp/vault.arca recover --shares 3Exit 0 success.
Prints a new share set and invalidates the previous one.
| Flag | Meaning | Default |
|---|---|---|
--threshold K | Shares required to reconstruct (2–10). | 3 |
--shares N | Shares printed (2–10). | 5 |
$ arca --file /tmp/vault.arca export-shares --threshold 3 --shares 5Exit 0 success.
Free vs Pro on the CLI
| Gated — Pro / trial | Still free |
|---|---|
| arca inject | init / unlock / lock / change-password / recover / export-shares |
| arca env import | list / get / add / edit / remove / generate |
| arca agent wrap and start | copy / show |
| arca ssh add | arca agent status / stop |
| App import formats: 1Password (.1pux), Bitwarden (.json), KeePass (.kdbx), Chrome/Edge (.csv) — distinct from env import | arca ssh list / remove / flush |
| Multiple vaults (work, personal, client-separated) — arca vault create / rename / --vault NAME | GUI 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
| Code | Meaning | What to do |
|---|---|---|
| 0 | Success | Including an empty list and a declined remove confirm. |
| 1 | pro_required | Start a 14-day trial or upgrade. The vault still opens. See the exact stderr lines under Free vs Pro. |
| 5 | Selector / item resolution | Missing 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. |
| 8 | App required | Start the ARCA app. Applies to arca agent, arca ssh, and any --app invocation. |
| 9 | Operation refused | arca 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. |
