Your agent uses your keys.
It never holds them.

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.

$curl -sSL https://getakasha.dev/install | sh
then akasha setup · finds your credentials, offers to vault them, names each one
0 of 175measured runs that reached for akasha unprompted. Offered the vault tools, 0 of 8 successful AWS calls were brokered.
21 of 21AWS calls brokered when the agent ran under akasha run. No prompt, no model cooperation.
LocalNo account, no cloud, no telemetry. One Go binary, Apache 2.0, the harness in the repo.
your terminal
$ akasha run claude --with aws:default -- claude
akasha run: agent run:claude · may broker: aws:default
· sandbox: on
akasha run: NOT confined: network.
› list the prod buckets
$ aws s3 ls
2026-09-30 10:12 prod-backups
2026-10-01 18:40 release-artifacts
done. one brokered call, one audit record, nothing kept.
claude · sandboxed
akasha broker
vault
key in your keychain
audit.log
seq 0041 · prev a91f… · chain ok
aws
github
launches
policy: allow
one operation
logged · 0041
decrypts, this op only
result returns · nothing is kept

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.

sandbox seatbelt · bubblewrapmasks self-tested before every launchnetwork unconfined by default, says soidentity per run, revoked at exit
Works with
Claude CodeCodexCursorVS CodeWindsurfOpenAI-compatible APIsAnthropic SDKLangChainA2A
01How it works

One launcher.
Your agent, minus the plaintext.

You keep running the agent you already use. You run it through Akasha, and you say what it may use. One command, four parts:

akasha run
The launcher. It builds the sandbox, proves the masks, then starts your command inside it.
claude
A name for this run. The run gets its own identity, revoked at exit, and this is the name the audit log shows.
--with aws:default
What the run may use, as provider:name. akasha setup prints the names it found: aws:default is your default AWS profile, github:default the token it found. Rename them with akasha label. SSH keys are for akasha exec, not run. Optional. Leave it out and the agent gets the sandbox and nothing else.
-- claude
The command you already run. claude, codex, cursor, a script: anything. The -- is where Akasha stops reading and your command starts.

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.

akasha discover · list · exec · logsreal output, synthetic credentials
Terminal recording: akasha discover finds two plaintext credentials and asks before taking them; akasha list shows what an agent can reach by name; akasha exec runs a command with a session file on RAM-backed storage, and the key never lands on disk; akasha logs shows the resulting hash-chained audit record.
Recorded from the binary with docs/demo/demo.tape.
masks

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.

broker

Its tools still work

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.

network

Network, your call

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.

Two ways a credential is handed over
broker · the default

Per operation

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.

session · when no broker exists

Per session

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.

Why a launcher

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.

conditionaws calls doneof those, brokered
vault tools offered (MCP)8 / 240 / 8
secrets stubbed on disk (akasha protect)0 / 24no leaks, no task
environment owned (akasha run)21 / 2421 / 21

203 runs, two local 7B models, self-reported. The harness is in the repo: re-run it.

02Why Akasha

One vault. Three jobs.

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.

01 · vault

A secrets vault for your applications

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
02 · sandbox

A broker for your agents

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
03 · observability

A record of what the AI did

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."
in detail
  • The vault stays on the machine. A local SQLite file encrypted with XChaCha20-Poly1305. The vault file alone cannot be opened: half the key material lives in your OS keychain. What a brokered credential does on the network is the run's business, open by default and said so, or closed with --network none.
  • Brokered per operation. Git, GitHub and AWS call back through 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.
  • MCP tools too. 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.
  • Every touch audited. Every broker call, wrap, retrieve and session goes to a hash-chained JSON-lines log, ~/.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.
  • Beneath the MCP stack. 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.
  • Cross-agent grants. Delegate over A2A with only tokens on the wire. Grants are single-use, bindable to one named tool, and expire when given a TTL.
03Integrate

Under the launcher:
MCP, CLI and policy.

mcp 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.

~/.akasha/policy.yaml · first match wins
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.

04Security

What is under the hood.

XChaCha20Poly1305 vault encryption
ML-KEM-768Post-quantum key wrapping
OS keychainHalf the key material held outside the vault file
RAM-backedSession creds on tmpfs where allowed
Single binaryStatic Go binary. Linux adds bubblewrap and a keyring.
Apache 2.0Open source, auditable

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.

Secrets stay home.

or brew install inferlabshq/tap/akasha