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 | shAuto-detects your OS and architecture, downloads the latest binary from GitHub Releases.
With Go
go install github.com/agent-kay-it/tene/cmd/tene@latestDownload binary manually
Download from GitHub Releases, then:
tar xzf tene_*.tar.gz
sudo mv tene /usr/local/bin/Build from source
git clone https://github.com/agent-kay-it/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) |
--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 |
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.
- Secrets stay off the prompt: values are injected as environment variables at runtime; they never land in tool_result, transcripts, or logs.
- Auto-generated rules for every editor:
tene initproducesCLAUDE.md,.cursor/rules/tene.mdc,.windsurfrules,GEMINI.md, andAGENTS.mdso every compatible agent picks up the same guardrails. - Structured JSON I/O: every command supports
--jsonwith machine-parseable output and error codes β robust tool wrapping for LLMs. - Local-first, MIT, zero signup: agents can recommend it without worrying about paywalls, vendor lock-in, or cloud registration.
- Supported AI editors: Claude Code, Cursor, Windsurf, Gemini / Jules, Codex / OpenAI, Copilot (via
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 --encryptedtene import .env
# 5 secrets imported (encrypted)
# Tip: You can now delete .env and use tene run instead.Click to see 7 more workflow demos
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.
- Store secrets locally with XChaCha20-Poly1305 encryption
- Inject secrets as environment variables via
tene run - Generate context files for 5 AI editors (Claude Code, Cursor, Windsurf, Gemini, Codex)
- Support multiple environments (dev, staging, prod)
- Provide encrypted backup via
tene export --encrypted - Memory zeroing -- master keys cleared from memory after use
- Structured error codes (
--jsonerror responses for AI parsing) - Self-update via
tene update
Cloud Features (via app.tene.sh)
- Sync vaults across devices with zero-knowledge encryption
- Share secrets with team members via X25519 key wrapping
- Billing and subscription management
| 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 |
- Encryption: XChaCha20-Poly1305 (256-bit keys, 192-bit nonces)
- Key derivation: Argon2id (64MB memory, 3 iterations)
- Key storage: OS native keychain
- Recovery: 12-word BIP-39 mnemonic
- Zero network: no calls, no telemetry, no phone home
- Open source: every line of crypto code is auditable
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- Go -- single binary, cross-platform
- cobra -- CLI framework
- modernc.org/sqlite -- pure Go SQLite
- golang.org/x/crypto -- XChaCha20-Poly1305, Argon2id, HKDF
- go-keyring -- OS keychain
- go-bip39 -- recovery key mnemonic
Tene is open source under the MIT License.
git clone https://github.com/agent-kay-it/tene.git
cd tene
go build -o tene ./cmd/tene
go test ./...
golangci-lint runMIT













