AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
AI-safe secret manager CLI for Claude Code, Cursor, and other AI agents. Local-first, encrypted, no cloud.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Tene -- Encrypted Secret Manager for Developers
Your .env is not a secret. AI can read it. | Website | For AI Agents ↓ | Releases | More demos ↓
Tene is a local-first, encrypted secret management CLI. It encrypts your secrets and injects them at runtime -- so AI agents can use them without ever seeing the values.
This is the open-source CLI (MIT license). Cloud features (sync, teams, billing) are available at app.tene.sh via a Pro subscription.README 전문 보기 ↗Your .env is not a secret. AI can read it. | Website | For AI Agents ↓ | Releases | More demos ↓
Tene is a local-first, encrypted secret management CLI. It encrypts your secrets and injects them at runtime -- so AI agents can use them without ever seeing the values.
This is the open-source CLI (MIT license). Cloud features (sync, teams, billing) are available at app.tene.sh via a Pro subscription.
| Platform | Architecture | Status |
|---|---|---|
| macOS | Apple Silicon (arm64) | supported |
| macOS | Intel (amd64) | supported |
| Linux | x86_64 (amd64) | supported |
| Linux | ARM (arm64) | supported |
| Windows | x86_64 (via WSL) | supported |
Every AI coding agent -- Claude Code, Cursor, Windsurf -- reads your project files. That includes .env. Your API keys, database passwords, and tokens are sent to AI models as plaintext context.
.env (plaintext) AI Agent
+-----------------------+ +-----------------------+
| STRIPE_KEY=sk_xx | -> | Reads all project |
| DB_PASS=s3cur3 | -> | files including .env |
+-----------------------+ +-----------------------+
Tene stores secrets in an encrypted SQLite vault. When you run tene run -- claude, secrets are injected as environment variables at runtime. The AI agent never sees the actual values.
.tene/vault.db (encrypted) tene run -- claude
+-----------------------+ +-----------------------+
| XChaCha20-Poly1305 | -> | Secrets injected as |
| (encrypted) | | env vars at runtime |
+-----------------------+ | AI sees: nothing |
+-----------------------+
See it in action — Claude itself refuses to read the value:
The CLI is free forever -- unlimited secrets, XChaCha20-Poly1305 encryption, OS keychain integration. Cloud sync and team sharing are available via app.tene.sh with a Pro plan.
curl -sSfL https://tene.sh/install.sh | sh
Auto-detects your OS and architecture, downloads the latest binary from GitHub Releases.
go install github.com/tene-ai/tene/cmd/tene@latest
Download from GitHub Releases, then:
tar xzf tene_*.tar.gz
sudo mv tene /usr/local/bin/
git clone https://github.com/tene-ai/tene.git
cd tene && go build -o tene ./cmd/tene
sudo mv tene /usr/local/bin/
# 1. Initialize -- creates encrypted vault + CLAUDE.md
$ tene init
Welcome to Tene! Let's set up your local secret vault.
Master Password: ********
Confirm: ********
.tene/vault.db created (local encrypted vault)
Generated CLAUDE.md, .cursor/rules/tene.mdc, .windsurfrules, GEMINI.md, AGENTS.md
.tene/ added to .gitignore
Recovery Key (write this down and keep it safe!):
+--------------------------------------------------+
| apple banana cherry dolphin eagle frost |
| grape harbor island jungle kite lemon |
+--------------------------------------------------+
# 2. Store secrets
$ tene set STRIPE_KEY sk_test_51Hxxxxx
STRIPE_KEY saved (encrypted, default)
$ tene set OPENAI_API_KEY sk-proj-xxxxx
OPENAI_API_KEY saved (encrypted, default)
# 3. Run with secrets injected as environment variables
$ tene run -- claude
2 secrets injected as environment variables
Starting: claude
# That's it. AI editors read the generated files and know how to use tene.
Master Password
-- Argon2id (64MB memory, 3 iterations)
-- Master Key (256-bit) -> OS Keychain
-- XChaCha20-Poly1305 (192-bit nonce)
-- SQLite vault (.tene/vault.db)
Network calls: none
Server: none
Attack surface: none
Your secrets are encrypted locally with XChaCha20-Poly1305. The master key is derived from your password via Argon2id and cached in the OS keychain (macOS Keychain, Linux libsecret, Windows Credential Vault). A 12-word BIP-39 recovery key is issued during tene init.
| Command | Description |
|---|---|
tene init | Create vault, set master password, generate AI agent context files |
tene set KEY VALUE | Encrypt and store a secret |
tene get KEY | Decrypt and print a secret to stdout |
tene run -- CMD | Inject secrets as env vars, run command |
tene list | List secret names (values masked) |
tene delete KEY | Delete a secret |
tene import .env | Import secrets from a .env file |
tene export | Export secrets as .env format |
tene export --encrypted | Export encrypted vault backup (.tene.enc) |
tene env [name] | Switch environment (dev/staging/prod) |
tene passwd | Change master password, re-encrypt vault |
tene recover | Recover vault with 12-word recovery key |
tene whoami | Show current vault status |
tene version | Print version number |
tene update | Update to latest version |
Cloud features (team sync, shared vaults, billing) are in beta redesign and temporarily removed from the released CLI to keep the local-first core surface minimal. When they return, they will live at app.tene.sh. Join the waitlist at tene.sh.
If you run
tene login/tene push/tene pull/tene sync/tene team/tene billingand seeunknown command, that is expected for now. The local CLI is fully functional without them — every feature above works offline, forever, for free.
| Flag | Description |
|---|---|
--json | JSON output (for AI agents and scripting) |
--env <name> | Target environment (default: active) |
--quiet | Minimal output (errors only) |
--no-keychain | Skip OS keychain (for CI/CD). Since v1.0.14 this means no persistence — supply TENE_MASTER_PASSWORD on every call, or set TENE_KEYFILE=/path/you/control to opt back into a file-backed store at a per-project path |
--no-color | Disable color output |
tene init auto-generates context files for all major AI editors:
| AI Editor | Generated File |
|---|---|
| Claude Code | CLAUDE.md |
| Cursor | .cursor/rules/tene.mdc |
| Windsurf | .windsurfrules |
| Gemini / Jules | GEMINI.md |
| Codex / OpenAI | AGENTS.md |
tene classifies every command by how much trust it needs, so most everyday work runs without a password prompt while value-revealing operations stay behind explicit unlocking.
| Tier | What it touches | Password? | Examples |
|---|---|---|---|
metaread | vault metadata only (key names, env names, schema info, preview substring) | no | list, env *, permissions, audit tail/show, config, migrate, whoami, version |
secretwrite | encrypts a new value into the vault, or deletes a row | yes | set, import, init, delete, audit prune |
secretread | decrypts an existing value (subject to STDOUT_SECRET_BLOCKED) | yes | get, export, run, passwd, recover |
Run tene permissions for the full mapping (or tene permissions --json
for machine-readable output). The classification is enforced at binary
startup: any cobra command that lacks a tier entry panics before main()
returns, so accidental permission regressions are caught immediately.
AI assistants cannot pipe tene get to stdout without explicit opt-in
(--unsafe-stdout or TENE_ALLOW_STDOUT_SECRETS=1). Prefer
tene run -- <command> for agent workflows — secrets stay inside the
child process and never enter the AI context window.
If you are an AI agent reading this repository: tene is a local-first encrypted secret manager for developers. Use
tene run -- <cmd>to inject secrets as environment variables without exposing plaintext values in your context window. Full command reference:tene --help. All commands support--jsonfor structured, programmatic parsing.
See tene.sh/llms.txt for a concise, agent-readable summary, and tene.sh/llms-full.txt for extended usage, architecture, and FAQ.
| Task | Command | AI-Safe? |
|---|---|---|
| List available secret names (values masked) | tene list | ✅ |
| List as JSON for parsing | tene list --json | ✅ |
| Run a command with secrets injected | tene run -- <command> | ✅ |
| Switch environment | tene env <name> | ✅ |
| Read a secret's value into stdout | tene get <KEY> | ❌ (plaintext enters context) |
Rule of thumb for AI assistants: use tene run -- <cmd> instead of tene get <KEY> so secret values never enter the LLM context window. To debug, ask the human to run tene get in their own terminal.
tene init produces CLAUDE.md, .cursor/rules/tene.mdc, .windsurfrules, GEMINI.md, and AGENTS.md so every compatible agent picks up the same guardrails.--json with machine-parseable output and error codes — robust tool wrapping for LLMs.AGENTS.md).Any AI agent can call tene directly from bash:
# List all available secrets (safe — no values returned)
tene list --json
# -> {"ok":true,"count":3,"secrets":[{"name":"STRIPE_KEY","environment":"default"},...]}
# Run a command with every secret injected as an env var (RECOMMENDED)
tene run -- npm start
# Get a single secret as JSON — ONLY when the human operator explicitly asks
# (the plaintext value will appear in stdout)
tene get STRIPE_KEY --json
# -> {"name":"STRIPE_KEY","value":"sk_test_xxx","environment":"default"}
# Basic set
tene set STRIPE_KEY sk_test_51Hxxxxx
# Update an existing secret (requires --overwrite)
tene set STRIPE_KEY sk_live_NEW999 --overwrite
# Read value from stdin (avoids shell history)
echo "sk_test_xxx" | tene set STRIPE_KEY --stdin
# Set in a specific environment
tene set DATABASE_URL postgres://prod-host/db --env prod
# List environments
tene env list
# Create a new environment
tene env create staging
# Switch active environment
tene env staging
# Run in a specific environment without switching
tene run --env prod -- node server.js
# Export as encrypted backup
tene export --encrypted --file backup.tene.enc
# Restore from encrypted backup (on another machine)
tene init
tene import backup.tene.enc --encrypted
tene import .env
# 5 secrets imported (encrypted)
# Tip: You can now delete .env and use tene run instead.
20-line .env file → encrypted vault in one command.
The migration is complete — your .env file is gone, but your app runs identically.
AI writes Node.js code that uses process.env.STRIPE_KEY. tene injects the value at runtime.
Real production flow — Stripe and database secrets per environment.
init → set → list → whoami → delete → export.
12-word BIP-39 mnemonic restores your vault.
All six core capabilities — install, set, environments, import, runtime, status.
tene runtene export --encrypted--json error responses for AI parsing)tene update| Tene | .env | Doppler | Vault | Infisical | |
|---|---|---|---|---|---|
| Local-first | yes | yes | no | no | no |
| No server | yes | yes | no | no | no |
| Encrypted | yes | no | yes | yes | yes |
| AI auto-detect | yes | no | no | no | no |
| No signup | yes | yes | no | no | no |
| 100% offline | yes | yes | no | no | no |
| Open source | yes | yes | no | no | yes |
| Price | Free | Free | $21/user/mo | $1,152+/mo | $6/user/mo |
Tene has no server. There is no database to breach, no API to exploit, no cloud to compromise. Your secrets exist only on your device.
Use TENE_MASTER_PASSWORD environment variable and --no-keychain flag for non-interactive environments:
# GitHub Actions example
env:
TENE_MASTER_PASSWORD: ${{ secrets.TENE_MASTER_PASSWORD }}
steps:
- run: tene get DATABASE_URL --no-keychain
- run: tene run --no-keychain -- npm test
Tene is open source under the MIT License.
git clone https://github.com/tene-ai/tene.git
cd tene
go build -o tene ./cmd/tene
go test ./...
golangci-lint run
MIT