tellerops/teller
Cloud native secrets management for developers - never leave your command line for secrets.
Healthy across all four use cases
weakest axisPermissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 3mo ago
- ✓21+ active contributors
- ✓Distributed ownership (top contributor 40% of recent commits)
Show all 7 evidence items →Show less
- ✓Apache-2.0 licensed
- ✓CI configured
- ✓Tests present
- ⚠Slowing — last commit 3mo ago
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/tellerops/teller)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/tellerops/teller on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: tellerops/teller
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/tellerops/teller shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across all four use cases
- Last commit 3mo ago
- 21+ active contributors
- Distributed ownership (top contributor 40% of recent commits)
- Apache-2.0 licensed
- CI configured
- Tests present
- ⚠ Slowing — last commit 3mo ago
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live tellerops/teller
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/tellerops/teller.
What it runs against: a local clone of tellerops/teller — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in tellerops/teller | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 130 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of tellerops/teller. If you don't
# have one yet, run these first:
#
# git clone https://github.com/tellerops/teller.git
# cd teller
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of tellerops/teller and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "tellerops/teller(\\.git)?\\b" \\
&& ok "origin remote is tellerops/teller" \\
|| miss "origin remote is not tellerops/teller (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 130 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~100d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/tellerops/teller"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Teller is a Rust-built CLI tool that acts as a universal secrets manager for developers, eliminating the need to leave the terminal to fetch secrets from multiple cloud providers (Hashicorp Vault, AWS Secrets Manager, Google Secret Manager, etc.). It centralizes secrets management through a single .teller.yml configuration file with provider maps, enabling secure secret injection into development workflows and subprocess execution. Monorepo with four Rust crates: teller-cli (CLI interface in teller-cli/src/bin/teller.rs, commands in cli.rs, scan.rs, new.rs), teller-core (shared logic), teller-providers (cloud provider integrations), and xtask (build tooling). Configuration is YAML-based (fixtures/config.yml, fixtures/hashi.yml examples). The CLI loads .teller.yml, parses provider maps, and injects secrets into subprocess environments.
👥Who it's for
Software developers and DevOps engineers who need to access secrets from multiple vaults/cloud services during local development, testing, and CI/CD without managing scattered .env files, bash history tokens, or custom scripts. Teams standardizing secret management practices across environments.
🌱Maturity & risk
Active and production-ready. The project is organized as a Rust workspace with workspace-level dependency management (v2.0.7 in Cargo.lock), has GitHub Actions CI/CD pipelines (build.yml, release.yml), includes integration fixtures and CLI tests, and maintains structured issue/feature request templates. Recent version pinning and release automation suggest active maintenance.
Low-to-moderate risk. Single main author (Dotan Nahum) listed in MAINTAINERS.md creates key-person dependency. The codebase is heavily Rust-focused (152KB of Rust code) which constrains contributor pool. Dependency on external secret manager APIs (Vault, AWS, Google) means outages in those services affect functionality. No visible security audit evidence in the file structure, which is notable for a secrets management tool.
Active areas of work
The repo is at v2.0.7 with Cargo workspace resolver v2, indicating mature dependency management. Build and release workflows are automated via GitHub Actions. The presence of release.toml and structured version pinning suggests ongoing release cycles. New provider template exists (ISSUE_TEMPLATE/new_provider.md), indicating active provider onboarding.
🚀Get running
git clone https://github.com/tellerops/teller.git
cd teller/teller-cli
cargo install --path .
teller new # Create initial .teller.yml configuration
Alternatively, download a pre-built binary from https://github.com/tellerops/teller/releases.
Daily commands:
cd teller-cli
cargo build
cargo run -- new # Interactive config wizard
cargo run -- get <provider>.<map> # Fetch secrets
cargo run -- run -- <command> # Execute subprocess with secrets injected
cargo test # Run test suite
🗺️Map of the codebase
- teller-cli/src/bin/teller.rs: Main entry point—orchestrates CLI argument parsing, provider loading, and secret retrieval logic
- teller-cli/src/cli.rs: Command-line interface definition and dispatch logic for all teller subcommands (get, run, scan, new)
- teller-cli/src/lib.rs: Core library logic for loading and parsing .teller.yml configuration, maps, and provider management
- Cargo.toml: Workspace root defining all four crates, shared dependencies, and version management for the entire project
- teller-providers/src/: Provider implementations (Vault, AWS, Google, etc.)—add new cloud integrations here by implementing the Provider trait
- teller-cli/fixtures/config.yml: Example .teller.yml configuration showing provider syntax, maps, key transformations, and templating—reference for users
- teller-cli/src/scan.rs: Secret detection logic for scanning files and finding exposed secrets using aho-corasick pattern matching
🛠️How to make changes
New provider: See ISSUE_TEMPLATE/new_provider.md and examine teller-providers/src/ for existing implementations (examples: hashicorp.rs, aws.rs). CLI commands: Edit teller-cli/src/cli.rs for argument parsing and teller-cli/src/bin/teller.rs for main dispatch. Config parsing: Modify teller-cli/src/lib.rs to change .teller.yml schema. Tests: Add fixtures to teller-cli/fixtures/ and test cases to teller-cli/tests/cli_tests.rs.
🪤Traps & gotchas
Config templating: .teller.yml uses Tera templating with {{ get_env(name="...") }} syntax—missing env vars at parse time will fail silently or use defaults. Subprocess environment isolation: teller run injects secrets via subprocess environment variables; ensure your subprocess doesn't leak them via logs. Provider authentication: Each provider (Vault, AWS, Google) requires pre-configured credentials (env vars, config files, or IAM roles) outside of Teller's control—failures are opaque. No built-in secret rotation: Teller fetches at invocation time; long-running processes won't see rotated secrets unless restarted.
💡Concepts to learn
- Provider Abstraction Pattern — Teller's core strength is supporting multiple secret backends (Vault, AWS, Google, etc.) via a common async trait interface—understanding this trait design is key to adding new providers or extending functionality
- Environment Variable Injection via subprocess — Teller's
runcommand uses theductcrate to spawn child processes with injected secrets as env vars—critical to understand for security implications and debugging secret leakage - YAML Configuration with Tera Templating —
.teller.ymlcombines static YAML schema (serde_yaml) with runtime Tera templating (variable substitution)—essential for understanding how users parameterize configs across environments - Aho-Corasick Multi-Pattern String Matching — The
scansubcommand uses aho-corasick for efficient detection of multiple secret patterns in files—important for understanding performance characteristics of secret detection across large codebases - Workspace-Level Dependency Management (Cargo) — Teller uses Cargo workspace resolver v2 with shared workspace.dependencies—critical for maintaining consistent versions across teller-cli, teller-core, and teller-providers crates
- Secrets as First-Class Runtime Context — Unlike config management tools, Teller treats secrets as dynamically-fetched, per-invocation context rather than static files—important design decision affecting caching, rotation, and audit capabilities
🔗Related repos
hashicorp/vault— Primary secret backend that Teller integrates with—understanding Vault's API and auth methods is essential for the hashicorp provider implementationaws/aws-cli— Teller mirrors AWS Secrets Manager and SSM Parameter Store integrations—similar auth patterns and secret retrieval strategiesmozilla/sops— Alternative encrypted-at-rest secrets file manager; complements Teller for teams wanting YAML-level encryption before Teller decryption99designs/aws-vault— AWS credential management tool using similar subprocess injection pattern; useful context for secure credential handling in CLI toolsgetdeck/getdeck— Developer environment orchestration tool; ecosystem companion that often pairs with Teller for local dev secret injection
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add integration tests for teller-providers with mock backends
The repo supports multiple secret backends (Hashicorp Vault, AWS Secrets Manager, Google Secret Manager, etc.) but the teller-providers crate lacks comprehensive integration tests. Currently only fixtures exist in teller-cli/fixtures/ (hashi.yml, google_sm_integration.yml). Adding mock-based integration tests would validate provider implementations without requiring real cloud credentials, catch regressions early, and serve as usage examples for contributors adding new providers.
- [ ] Create teller-providers/tests/integration/ directory structure
- [ ] Add mock implementations for each provider backend using a test double pattern
- [ ] Write integration tests in teller-providers/tests/ covering: provider initialization, secret retrieval, error handling for each supported backend
- [ ] Reference existing fixtures from teller-cli/fixtures/ and expand them with edge cases
- [ ] Document in CONTRIBUTING.md how to add tests when implementing new providers
Implement missing platform-specific installation workflow in CI/CD
The repo has install.sh and install.ps1 scripts but no GitHub Actions workflow to validate they work across platforms (Linux, macOS, Windows). The .github/workflows/build.yml and release.yml exist but don't test installation scripts. Adding a workflow that runs these scripts in matrix environments would catch breakage early and ensure contributors don't break installation UX.
- [ ] Create .github/workflows/install-test.yml with matrix strategy for [ubuntu-latest, macos-latest, windows-latest]
- [ ] Add test step that runs install.sh on Unix and install.ps1 on Windows
- [ ] Verify installed binary works with --help and --version commands
- [ ] Run on pull_request events to catch regressions before merge
- [ ] Document expected behaviors in CONTRIBUTING.md for installation script changes
Add comprehensive CLI command tests for teller-cli scan subcommand
The scan feature is mentioned in the README and has fixtures (teller-cli/fixtures/scan/ with test files), but teller-cli/tests/cmd/ only has tests for copy, delete, export, put, and redact commands. The scan command lacks corresponding .trycmd test file. Given the security focus of secret scanning, adding thorough CLI tests would validate pattern matching, binary file handling, and nested directory scanning work correctly.
- [ ] Create teller-cli/tests/cmd/scan.trycmd file with multiple test cases
- [ ] Add test case for scan with no matches (fixtures/scan/no-matches.txt)
- [ ] Add test case for scan with matches (fixtures/scan/multiple.txt and has-matches.txt)
- [ ] Add test case for binary file handling (fixtures/scan/content.bin)
- [ ] Add test case for nested directory scanning (fixtures/scan/nested/)
- [ ] Reference cli_tests.rs pattern to ensure proper integration with test framework
🌿Good first issues
- Add integration tests for the
scansubcommand (teller-cli/src/scan.rs) covering binary files, nested directories, and edge cases—fixtures exist but test coverage in teller-cli/tests/ is sparse - Implement templating docs and examples: the
.teller.ymlsupports Tera templates (e.g.,{{ get_env(...) }}) but this is undocumented—create example fixtures and update README.md with use cases - Add shell completion script generation: CLI already uses structured arg parsing (cli.rs) but no bash/zsh/fish completion generators exist—scaffold completion trait and generate for at least bash
⭐Top contributors
Click to expand
Top contributors
- @jondot — 40 commits
- @stvnksslr — 15 commits
- @kaplanelad — 9 commits
- @eladbash — 7 commits
- @ChengaDev — 7 commits
📝Recent commits
Click to expand
Recent commits
bee4b3f— fix build? (jondot)4e8eaa5— fix build? (jondot)564d953— fix build? (jondot)43912a6— fix build? (jondot)fcf1918— fix build (jondot)8876b35— fix build (jondot)9d62761— upgrade deps (jondot)9f0f182— Merge branch 'jore731-master' (jondot)5e83d1b— fix build (jondot)761365e— Add support for namespaces (#287) (romans-ovo)
🔒Security observations
The Teller codebase demonstrates a solid security posture as a secrets management tool. The application is written in Rust, providing memory safety guarantees. Key security concerns are moderate: (1) dependency management uses flexible versioning without explicit constraints, (2) test fixtures in version control could inadvertently contain real credentials, (3) installation scripts require secure distribution mechanisms, and (4) command execution capabilities need careful input validation. The project appears well-maintained with CI/CD workflows. No critical vulnerabilities detected in the static analysis, but runtime behavior and input handling should be reviewed in code review. Recommend implementing automated dependency scanning, secret detection pre-commit hooks, and input validation audits.
- Medium · Permissive Dependency Version Specifications —
Cargo.toml (workspace.dependencies). Multiple dependencies use broad version specifiers (e.g., 'serde = "1"', 'tokio = "1"') which allow pulling in minor and patch versions automatically. While this is common practice, it increases the risk of introducing vulnerabilities from transitive dependencies without explicit version pinning. Fix: Consider using more specific version constraints with = prefix for critical security-sensitive dependencies, or maintain a Cargo.lock file and review dependency updates regularly. Implement automated dependency scanning in CI/CD. - Medium · Test Fixtures May Contain Sensitive Data —
teller-cli/tests/cmd/, teller-cli/fixtures/. The codebase contains fixture files for testing (e.g., .teller.yml, config.yml, various .env files in test directories). These fixtures could potentially be committed with actual credentials or secrets, creating a risk if the repository becomes public or if developers copy-paste configurations. Fix: Ensure all fixture files contain only dummy/placeholder credentials. Add pre-commit hooks to prevent committing real secrets. Consider using environment variable substitution in tests rather than hardcoded values. - Medium · Installation Scripts Execute Without Verification —
install.sh, install.ps1. The install.sh and install.ps1 scripts are present in the repository root. If compromised or served over HTTP, these could execute arbitrary code during installation. The security of the installation depends on how users obtain and execute these scripts. Fix: Ensure scripts are served over HTTPS only. Consider implementing GPG signature verification for downloaded binaries. Document the installation process and recommend verifying checksums. Use secure distribution channels (package managers). - Low · Broad Shell Command Execution Capability —
Cargo.toml dependencies: shell-words, duct. The codebase includes shell-words (1.x) and duct (1.x) dependencies which are used for command execution. The 'run' command capability (evidenced by run.trycmd tests) could potentially be exploited if user input is not properly sanitized. Fix: Implement strict input validation and sanitization for any user-provided commands. Use allowlists for permitted commands where possible. Avoid passing unsanitized user input directly to shell execution functions. - Low · YAML Parsing with Default Settings —
Cargo.toml dependencies: serde_yaml. The serde_yaml dependency (0.9) is used without visible safety restrictions. YAML parsers can be vulnerable to billion laughs/XXE-style attacks if not properly configured. Fix: Verify that serde_yaml is configured safely and that untrusted YAML input is validated. Consider implementing maximum depth and size limits for parsed YAML documents.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.