Murmur uses multiple encryption layers to protect your credentials. This page explains what is encrypted, when, and how — from initial setup through agent execution to secret storage.Documentation Index
Fetch the complete documentation index at: https://docs.murmur.dev/llms.txt
Use this file to discover all available pages before exploring further.
Profile encryption
When you runmurmur setup or murmur install, your developer credentials are encrypted immediately:
- Credential collection — your Anthropic API key and other sensitive configuration are gathered.
- KMS encryption — the credentials are encrypted using the tenant’s Cloud KMS key via an authenticated encrypt call.
- AAD binding — Additional Authenticated Data (AAD) is included in the encryption, binding the ciphertext to your tenant and identity. This prevents cross-tenant profile reuse.
- Local storage — the encrypted blob is stored in
.murmur/murmur.local.yamlas theencrypted_profilefield.
murmur.local.yaml, they cannot decrypt it without access to your tenant’s KMS infrastructure.
Transport encryption
When an agent is spawned, the encrypted profile travels from your local config through the control plane to the agent VM:Step 1: Control plane transport
The encrypted profile is transmitted to the control plane as an opaque byte array. It passes through the orchestration layer without modification — no intermediate system can decrypt the profile.Step 2: Control worker re-sealing
Before the profile reaches the VM, the control worker re-seals it:- The control worker retrieves the VM’s ephemeral X25519 public key (generated at VM boot).
- The original KMS-encrypted profile is decrypted within the control worker’s trusted environment.
- The decrypted credentials are immediately re-encrypted using NaCl box (Curve25519-XSalsa20-Poly1305) with the VM’s public key.
- The KMS-decrypted plaintext is zeroed from memory.
- The NaCl-sealed blob is sent to the VM.
- The profile can only be decrypted by the specific VM it was sealed for
- Even if the sealed blob is intercepted in transit, it requires the VM’s private key to decrypt
- The control worker holds plaintext only for the duration of the re-sealing operation
Step 3: Secure delivery
The NaCl-sealed blob is delivered to the VM through an authenticated API channel, not through a network filesystem or metadata service.VM decryption
On the agent VM, credentials are decrypted in process memory only:- Ephemeral key pair — at boot, the VM generates an X25519 key pair. The private key exists only in memory and is never written to disk.
- NaCl box open — the sealed blob is decrypted using the VM’s ephemeral private key and the control worker’s public key.
- In-memory storage — the decrypted credentials (API keys, tokens) are held in process memory for the agent session’s duration.
- No disk writes — credentials are never written to any file, environment file, or temporary storage. They are passed to Claude Code through in-memory channels.
- Destruction — when the agent session ends, the VM is destroyed. The ephemeral private key, decrypted credentials, and all process memory are gone.
Per-tenant KMS keys
Each tenant has a dedicated Cloud KMS key used for all encryption operations within that tenant:| Purpose | Key usage |
|---|---|
| Profile encryption | Encrypt developer credentials during murmur setup |
| Secret encryption | Encrypt tenant secrets stored in the catalog |
| AAD binding | Bind encrypted data to the correct tenant context |
Additional Authenticated Data (AAD)
Every KMS encryption operation includes AAD that binds the ciphertext to its intended context:- Tenant ID — prevents a profile from one tenant being used in another
- Resource type — distinguishes profiles from secrets
- Identity — for profiles, the developer’s identity is included
- A profile encrypted for tenant A cannot be decrypted for tenant B
- A developer’s profile cannot be used by a different developer
- A secret cannot be confused with a profile
Session cookies
Dashboard sessions use ECIES (Elliptic Curve Integrated Encryption Scheme) with P-256:- Key pair — the API server holds a P-256 key pair for cookie encryption.
- Encryption — when a session is created, the OAuth tokens and session metadata are encrypted using ECIES with the server’s public key.
- Cookie storage — the encrypted payload is stored in the browser cookie.
- Decryption — on each request, the API server decrypts the cookie with its private key to extract the session.
- OAuth tokens are never exposed to client-side JavaScript
- Cookie contents cannot be read if intercepted (e.g., by browser extensions)
- Session tampering is detected and rejected (ECIES provides authenticated encryption)
Tenant secrets
Secrets stored in the catalog (kindsecret and user-secret) are encrypted at rest:
Encryption
- The secret value is sent to the API server over TLS.
- The API server encrypts the value using the tenant’s KMS key with appropriate AAD.
- The encrypted value is stored in GCS. The plaintext is never persisted.
- The
plaintext_valuefield is write-only — it is accepted on set but never returned on get.
Decryption
Secrets are decrypted only when injected into an agent VM’s environment:- The control worker determines which secrets the workspace requires (from
secret_refsin the workspace config). - Encrypted secret values are retrieved from the catalog.
- The control worker decrypts them using the tenant’s KMS key.
- Decrypted values are sealed with the VM’s ephemeral key (same NaCl box process as profiles).
- On the VM, they are decrypted in memory and set as environment variables (
MURMUR_SECRET_*).
User secrets
User secrets (user-secret kind) work the same way but include the developer’s identity in the AAD. This means a user secret encrypted by developer A cannot be decrypted for developer B, even within the same tenant.
Commit signing
Agents sign their Git commits using ed25519 SSH signing keys:- Key generation — during
murmur setup, an ed25519 key pair is generated. - Encryption — the private key is encrypted as part of your developer profile (KMS + NaCl box chain).
- On-VM usage — the signing key is decrypted in memory on the agent VM and configured in Git.
- Commit signatures — every commit made by the agent is signed with this key.
- Verification — GitHub can verify the signatures against the public key registered to your account.
- Provenance — every agent commit is cryptographically linked to the developer who spawned the agent
- Tamper detection — modified commits will have invalid signatures
- Accountability — the commit signature chain traces back to a real developer identity