What the agent can't see
~/.aws, ~/.ssh, ~/.gnupg, ~/.docker, the vault, the keychain, every file a credential was found in, and akasha's own key files. Seatbelt on macOS, bubblewrap on Linux.
Akasha runs your coding agent in an OS sandbox where your credentials aren't there, and brokers them to its tools one operation at a time: nothing in its environment, its config or on disk, and one audit record per use. Local, open source, no account.
akasha run. No prompt, no model cooperation.One run, one operation: the agent asks, the broker checks policy, resolves the credential from the vault for that call only, writes the record, and the result goes back. Nothing is kept: not in the environment, not on disk.
You keep running the agent you already use. You run it through Akasha, and you say what it may use. One command, four parts:
So akasha run claude --with aws:default -- claude starts Claude Code in a sandbox that grants exactly the one thing you named. Underneath, the vault itself: here it finds two plaintext credentials, vaults them on your say-so, runs a real command with one it never prints, and writes the access to the log.
~/.aws, ~/.ssh, ~/.gnupg, ~/.docker, the vault, the keychain, every file a credential was found in, and akasha's own key files. Seatbelt on macOS, bubblewrap on Linux.
aws fetches its credential through credential_process, git through a credential helper. One operation at a time, nothing in the environment, nothing on disk. The run's identity is revoked when it ends.
By default the network is not confined, and the run says so. --network none removes it while credentials still broker. --network proxy gives back one route through a CONNECT proxy you run.
git, GitHub and AWS ask Akasha each time they need the credential, through a credential helper or credential_process. The bytes are served for that one call and land nowhere: not in the environment, not on disk. Each use is its own audit record.
A tool with no callback hook gets vault_session: a short-lived file, mode 0600, on RAM-backed storage where the platform allows it, one-hour TTL, swept on expiry. The starter policy denies it to agents wherever a broker exists, so it is the fallback, never the default.
You do not pick between them. The provider plugin says which it supports, and the policy says which an agent may use.
0 / 175
measured runs that reached for akasha in the shell unprompted
Offered the vault tools, models called them now and then and still took the plaintext path. Stubbing the secrets on disk stopped every leak but left the task undone. Owning the environment did both: inside akasha run the agent still has Akasha, the MCP tools and the broker behind aws and git. Only the plaintext path is gone.
| condition | aws calls done | of those, brokered |
|---|---|---|
| vault tools offered (MCP) | 8 / 24 | 0 / 8 |
| secrets stubbed on disk (akasha protect) | 0 / 24 | no leaks, no task |
| environment owned (akasha run) | 21 / 24 | 21 / 21 |
203 runs, two local 7B models, self-reported. The harness is in the repo: re-run it.
A secrets vault your applications use, a sandbox and broker your agents run under, and one log that says what each of them did with every secret.
API keys, database URLs, service passwords: store anything. Any process gets them injected at launch and never holds them in its config. Local SQLite, XChaCha20-Poly1305; the vault file alone cannot be opened.
$ akasha put env:stripe STRIPE_API_KEY $ akasha exec --with env:stripe -- ./charge.sh
The agent runs where the plaintext is not, and its tools fetch each credential through Akasha one operation at a time. An identity per run, revoked at exit. Nothing in the environment, nothing on disk.
$ akasha run claude --with aws:default -- claude $ akasha exec --with env:github -- github-mcp-server
Every use is logged with the tool, and with the task and reasoning the agent supplied when it did, in a hash chain you can verify. Attribution for agents, the way access logs are for people.
// an MCP-tool record; broker records carry the tool and a derived task "tool_name": "send_email", "task": "Process refund for order #8821", "reasoning_trace": "User requested refund. Order verified."
--network none.akasha helper each time. Where no broker exists, vault_session hands back a short-lived file: mode 0600, RAM-backed where the platform allows, one-hour TTL.akasha setup writes the MCP config for Claude Code, Codex, Cursor, VS Code and Windsurf. Inside a run, they act as the run's identity.~/.akasha/audit.log, with the tool and, when the agent supplied them, the task and reasoning. akasha logs --verify walks the chain. Tamper-evident, not tamper-proof.akasha exec injects vaulted credentials into other MCP servers at launch, so your GitHub or database server (through env:) holds no plaintext token in its config.// Instead of a hardcoded token in your MCP config: "github": { "command": "akasha", "args": ["exec", "--with", "env:github", "--", "github-mcp-server"] }
MCP servers cannot see each other's traffic, but they all need credentials. Akasha sits underneath them, brokering those secrets and recording who used what.
default: allow rules: # raw read of any vaulted entry - {action: retrieve, effect: deny} # agents take the per-operation route - {action: session, caller: agent, brokerable: true, effect: deny} # delegating a high-risk secret onward: a human decides - {action: grant, min_risk: high, effect: ask} - {action: grant, effect: allow}
Three credential verbs, of nine actions, gated separately: broker, session, retrieve. An ask raises a native dialog that fails closed if nobody answers.
Threat model, stated. The daemon runs as you, and so does the agent. A process running as your user can read the vault key from the OS keychain without going through Akasha. Two things narrow that: a vault passphrase, and akasha run, which sandboxes the agent away from the keychain and the vault.