v0.1  •  Open Source

Your keys.
Hardware-locked.

YubiKey-encrypted credential manager. AES-256-GCM encryption derived from hardware challenge-response. No YubiKey, no decryption. Period.

Get Started → Read the Docs
Shell
AES-256
Encryption
0
Plaintext at Rest
0
Secret Types
2-Tier
Auth System

Hardware to ciphertext

Every secret passes through four cryptographic layers before it touches storage.

🔑

YubiKey HMAC-SHA1

Slot 2 challenge-response. A random challenge is sent to the hardware token. The 20-byte HMAC response never leaves the USB bus unprocessed.

↓ 20-byte HMAC output

Argon2id Key Stretching

19 MiB memory-hard derivation with 2 iterations and a fixed domain-separation salt. Resists GPU and ASIC brute-force attacks.

↓ 256-bit AES key
🔒

AES-256-GCM Encryption

Each secret encrypted individually with a random 96-bit nonce. Authenticated encryption ensures both confidentiality and integrity.

↓ ciphertext + auth tag
📦

Backend Storage

Encrypted blob stored via HTTP API. The backend never sees plaintext. Works with Engram, SQLite, or any compatible endpoint.

[CRED:v3] service/key = <hex-encoded-ciphertext>

Built for zero trust

Hardware-backed encryption with a developer-friendly interface. CLI, TUI, GUI, and HTTP daemon.

Security Model
🔒

Zero Plaintext at Rest

The backend never sees unencrypted secrets. All encryption and decryption happens client-side, in memory, with key material scrubbed on drop.

🔑

Master Key Only in Memory

The derived AES key exists only while cred is running. Remove the YubiKey and everything locks. No key file on disk, no password to steal.

🚫

Memory Scrubbing

The zeroize crate overwrites all key material when it goes out of scope. No residual secrets in process memory.

👥

Two-Tier Authentication

Owner keys have full CRUD access. Agent keys are read-only, scoped per agent, and independently revocable. Both use constant-time comparison.

Rate Limiting

Exponential backoff on failed authentication -- from 1 second up to 1 hour. Brute-force is not viable even against a running daemon.

📋

Audit Trail

Every agent access is logged to ~/.config/cred/audit.log with timestamps, agent IDs, and requested secrets.

Developer Experience

CLI + Interactive TUI

Full command-line interface with Clap. Interactive TUI mode built with Ratatui and Crossterm for browsing and managing secrets visually.

🖥

Native Desktop GUI

egui/eframe desktop application that communicates with credd over HTTP. Cross-platform, no Electron, no browser required.

🌐

HTTP Daemon (credd)

Axum-based REST API with full CRUD, agent key management, and health checks. Run on one server, access from everywhere.

🔄

6 Secret Types

api-key, login, oauth-app, ssh-key, note, and environment. Each with typed fields -- no flat key-value dumps.

📦

Backend-Agnostic

Default backend is Engram, but any HTTP API implementing store/list/delete works. SQLite backend for fully offline use.

💻

Multi-Machine

Program multiple YubiKeys with the same HMAC secret. Each machine gets its own challenge file. Share the backend, access secrets from anywhere.

CLI, daemon, or both

Store and retrieve secrets from the terminal, or run credd for multi-machine HTTP access.

CLI cred
# Store a secret
cred store github api-key -s api-key
# Prompts for key value

# Retrieve
cred get github api-key
cred get github api-key --raw

# List all secrets
cred list

# Interactive TUI
cred tui
API credd endpoints
# Start the daemon
export CRED_OWNER_KEY=your-key
credd

# Get a secret
curl localhost:4400/secret/github/api-key \
  -H "Authorization: Bearer $KEY"

# Store a secret
curl -X POST localhost:4400/secret \
  -H "Authorization: Bearer $KEY" \
  -d '{"service":"github",
      "key":"token",
      "secret_type":"api-key"}'
Agent Keys read-only access
# Generate agent key
cred agent-key generate my-agent
# Key printed once -- save it

# Agent authenticates
curl localhost:4400/secret/github/api-key \
  -H "Authorization: Bearer ag_..."

# List agent keys
cred agent-key list

# Revoke access
cred agent-key revoke my-agent

Running in 5 minutes

A YubiKey, Rust, and a backend. That's all you need.

01
🔑

Program YubiKey

ykman otp chalresp 2

02

Initialize

cred init

03
🌐

Configure Backend

Set ENGRAM_URL and ENGRAM_API_KEY

04
🔒

Store Secrets

cred store myservice api-key

05
🔓

Retrieve Anywhere

cred get myservice api-key --raw

Your secrets. Your hardware.

No cloud. No trust required. Just a YubiKey and Rust.

$ cargo build --release --bin cred

View on Codeberg → Read the Docs