Zero-knowledge runtime · written in Zig

Your agent never hears the secret.

Not in memory. Not on disk. Not ever. One encrypted file, one passphrase — carry your secrets anywhere, and let no process hold what it doesn't need.

“He never let anyone hear his true voice.”
in memory · while unlocked
# the agent process sees only this
ANTHROPIC_API_KEY = sk-ant-api03-xxxxxxxxxxxx
GITHUB_TOKEN = ghp_xxxxxxxxxxxxxxxxxxxx
STRIPE_SECRET = sk_live_xxxxxxxxxxxxxxxx

# grep anything cora touches
$ grep -a 'sk-ant-' cora.zon
→ no hits — encrypted at rest
01 — The Problem

Every agent runtime leaks by default.

The moment you put a key in the environment, it belongs to everything that process can reach — every skill, every prompt, every plugin.

~/agent · bash
# the one line every runtime ships
ANTHROPIC_API_KEY=sk-ant-... claude -p "summarize repo"

# now the value lives in the agent's env.
# everyone downstream can read it:
printenv | grep ANTHROPIC   → sk-ant-...
cat /proc/self/environ      → sk-ant-...

Every skill can read it

Anything running inside the agent shares its environment. A single dependency is a single point of exfiltration.

Every prompt injection can ask for it

“Print ANTHROPIC_API_KEY” succeeds the instant the value is something the model's process can actually see.

Every plugin can exfiltrate it

Malicious or merely careless, third-party code inherits the same secrets you handed the orchestrator.

02 — The Fix

Cora whispers the value past the agent.

The secret is injected straight into the subprocess after the kernel verifies who's asking. The orchestrating process never reads it.

~/project · cr
$ cr unlock                         # passphrase → service starts
✓ unlocked · 3 secrets in memory

$ cr exec claude-task -- \
     claude -p "summarize this repo"
# ANTHROPIC_API_KEY injected into the child only
child pid 48213 · exit 0

$ cr lock                           # memory zeroed
✓ secureZero · service stopped
the whisperer model

The client never touches the value.

Claude spawns, needs ANTHROPIC_API_KEY, and the Cora service injects it directly into the subprocess — after verifying the caller binary at the kernel level.

The cr client process never reads the value. The subprocess uses it and exits. Memory zeroed.

Prompt injection tries "print ANTHROPIC_API_KEY" against the orchestrator — nothing to print. The value was never in that process.

03 — How It Works

Encrypted at rest. Ephemeral in memory.

Argon2id derives a key from your passphrase. XChaCha20-Poly1305 keeps the file sealed. Plaintext lives only in service memory — and only while you're unlocked.

01
cora.zon
One file at rest, sealed with XChaCha20-Poly1305.
█ encrypted
02
cr unlock
Argon2id derives the key, decrypts, then zeroes the key.
○ decrypting
03
service memory
Secrets live here — and nowhere else — while unlocked.
○ in memory
04
cr exec
Value injected into the subprocess env. Agent never holds it.
○ injected
05
cr lock
secureZero wipes every buffer. Back to encrypted at rest.
× zeroed

Caller verified at the kernel

SO_PEERCRED on Linux, LOCAL_PEERPID on macOS, named-pipe PID on Windows. Cora trusts the OS, not application tokens.

Passphrase-derived, no infra

Argon2id (t=3, 64MB, p=4) → XChaCha20-Poly1305. No cloud, no daemon, no keychain dependency.

Task-scoped injection

A task names exactly which secrets — and which target binaries — cr exec may use. Nothing leaks beyond its scope.

Audit without values

Every action is logged to ~/.cora/audit.jsonl — names only, never secret values. By construction.

04 — How It's Different

Not a vault. Not a proxy. A whisperer.

cora .env files HashiCorp Vault
StorageEncrypted filePlaintextCloud / local
PortableYes — one filePartialNo
Memory zeroingsecureZeroGCGC
Caller verifiedOS kernelNothingNothing
Agent gets the value?NeverAlwaysDepends
Infra requiredNoneNoneHeavy
Single binaryYesN/ANo
Interactive TUIYes — pane-basedNoNo
05 — Install

Pick whichever fits your trust model.

Package name is cora; the installed binary is cr. Pick your OS, then your method.

macOS · Linux
$ curl -fsSL https://raw.githubusercontent.com/keton-id/cora/main/install.sh | sh

# pin a specific tag
$ curl -fsSL .../install.sh | sh -s -- --version 1.0.0

# track a prerelease channel
$ curl -fsSL .../install.sh | sh -s -- --channel alpha

Fetches the latest stable release for your OS/arch, verifies the SHA256 checksum, and installs to /usr/local/bin (or ~/.local/bin without sudo).

Windows · PowerShell
> irm https://raw.githubusercontent.com/keton-id/cora/main/install.ps1 | iex

# pin a specific version
> & ([scriptblock]::Create((irm .../install.ps1))) -Version 1.0.0

# track a prerelease channel
> & ([scriptblock]::Create((irm .../install.ps1))) -Channel alpha

Fetches the latest stable cora-windows-v* release for your arch (AMD64 / ARM64), verifies the SHA256 checksum, and installs to %LOCALAPPDATA%\Programs\cora\cr.exe. Appends the install dir to your user PATH — open a new shell to pick it up.

macOS · Linux
$ brew tap keton-id/tap
$ brew install cora

The tap is updated automatically by Cora's release pipeline on every stable tag. brew upgrade cora picks up new releases. Pre-release alphas are not pushed to the tap.

Windows · PowerShell
> scoop bucket add keton-id https://github.com/keton-id/scoop-bucket
> scoop install cora

Installed binary is cr.exe. scoop update cora picks up new stable releases — the bucket is updated automatically on every stable tag.

node · npm
$ npm i -g @keton-id/cora

# or one-shot via npx
$ npx @keton-id/cora --help

One package bundles prebuilt cr binaries for macOS, Linux, and Windows (x64 + arm64). A tiny JS launcher picks the matching binary at runtime — no postinstall download, no native addon.

Zig 0.16+
$ git clone https://github.com/keton-id/cora && cd cora
$ zig build -Doptimize=ReleaseSafe
$ sudo install -m 0755 zig-out/bin/cr /usr/local/bin/cr

# or via the make wrapper
$ make release && make install

Requires Zig 0.16+. make install defaults to ~/.local/bin; override with make install PREFIX=/usr/local.

06 — What's Inside

One binary. Every verb you need.

Run cr with no arguments for full usage.

Create the encrypted file$ cr init
Manage secrets$ cr secrets set · list · delete
Allowlist callers$ cr policy allow · deny PATH
Scope a task$ cr policy task add NAME …
Start & stop the service$ cr unlock · lock · status
Spawn an agent$ cr exec TASK -- argv…
Read the audit trail$ cr audit tail · show
Interactive pane UI$ cr tui
07 — Interactive TUI

The whole runtime, in a pane.

Run cr tui for a keyboard-driven control center — dashboard, audit, secrets, and lock, all without leaving the terminal.

cr tui · cora control center
Cora Control Center Service offline
Navigation
Dashboardoverview
Audit Logscrollable
Secretssecure names
Lock Serviceconfirm action
Dashboard
Live service state and config snapshot
Service
Offline
Secrets
0
Idle TTL
0 m
Config
no cora.zon in cwd
Socket Path
/tmp/cora-501.sock
Quick Actions
r refresh   Enter activate pane   ? help   l lock   q quit
Hotkeysj/k or arrows navigate   Enter open   PgUp/PgDn scroll   r refresh   l lock   ? help   q quit
4 panes dashboard · audit · secrets · lock
vaxis pane-based, fully keyboard-driven
isolated decoupled from the exec / unlock paths