scrt4 0.4.6

Hardware-bound secrets vault for AI coding agents. Secrets are injected into a subprocess and scrubbed from its output, so an agent can use a credential without ever seeing it. The vault key is derived from a FIDO2 authenticator via WebAuthn PRF and is never stored.
[package]
# Published to crates.io as `scrt4`; the binary it installs stays
# `scrt4-daemon`, which is what the clients and the service units invoke.
name = "scrt4"
version = "0.4.6"
edition = "2021"
rust-version = "1.74"
description = "Hardware-bound secrets vault for AI coding agents. Secrets are injected into a subprocess and scrubbed from its output, so an agent can use a credential without ever seeing it. The vault key is derived from a FIDO2 authenticator via WebAuthn PRF and is never stored."
license = "AGPL-3.0-only"
repository = "https://github.com/llmsecrets/llm-secrets"
homepage = "https://llmsecrets.com"
documentation = "https://docs.llmsecrets.com"
readme = "README.md"
keywords = ["secrets", "webauthn", "fido2", "passkey", "vault"]
categories = ["command-line-utilities", "cryptography", "authentication"]
# Two binaries ship from here: scrt4-daemon owns the vault, and scrt4 is the
# Rust client. The richer bash client is built separately by
# scripts/build-scrt4.sh and is what the installers place on PATH.

[dependencies]
# Async runtime
tokio = { version = "1", features = ["full", "net", "process", "io-util", "sync"] }

# WebAuthn server
#
# webauthn-rs is deliberately NOT a dependency. It was declared but referenced
# in zero source files, and it was the sole thing dragging in openssl-sys --
# which is why building on Windows used to require vcpkg and a 14-minute
# OpenSSL build. The WebAuthn ceremony is not performed in Rust at all: the
# browser runs navigator.credentials with the PRF extension (localhost.rs's
# page / the relay's auth.html), and the daemon only ever handles the
# AES-GCM-wrapped PRF output. See daemon/src/webauthn.rs.
#
# The daemon now builds with nothing but a Rust toolchain, on every platform.
axum = "0.7"
url = "2"
tower-http = { version = "0.5", features = ["cors"] }

# Serialization
serde = { version = "1", features = ["derive"] }
serde_json = "1"

# Crypto (same as scrt3 — reused)
aes = "0.8"
cbc = { version = "0.1", features = ["alloc"] }
aes-gcm = "0.10"

# Utilities
rand = "0.8"
base64 = "0.21"
hex = "0.4"
dirs = "5"
regex = "1"
zeroize = { version = "1", features = ["derive"] }
tracing = "0.1"
tracing-subscriber = "0.3"
tempfile = "3"
qrcode = "0.14"

# SHA-256 for stable entry IDs in encrypted_inventory.rs
sha2 = "0.10"

# Migration from scrt3 (optional)
argon2 = { version = "0.5", optional = true }

# Unix socket path fallback (getuid)
[target.'cfg(unix)'.dependencies]
libc = "0.2"

# Named-pipe DACL (winpipe.rs)
[target.'cfg(windows)'.dependencies]
windows-sys = { version = "0.59", features = [
    "Win32_Foundation",
    "Win32_Security",
    "Win32_Security_Authorization",
    "Win32_System_Memory",
    "Win32_System_Threading",
] }

[features]
default = []
migrate = ["argon2"]

[[bin]]
name = "scrt4-daemon"
path = "src/main.rs"

[[bin]]
name = "scrt4"
path = "src/cli.rs"

[dev-dependencies]
tempfile = "3"