RepoPilotOpen in app →

tellerops/teller

Cloud native secrets management for developers - never leave your command line for secrets.

Healthy

Healthy across all four use cases

weakest axis
Use as dependencyHealthy

Permissive license, no critical CVEs, actively maintained — safe to depend on.

Fork & modifyHealthy

Has a license, tests, and CI — clean foundation to fork and modify.

Learn fromHealthy

Documented and popular — useful reference codebase to read through.

Deploy as-isHealthy

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 →
  • 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.

Variant:
RepoPilot: Healthy
[![RepoPilot: Healthy](https://repopilot.app/api/badge/tellerops/teller)](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:

  1. 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.
  2. 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.
  3. 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 |

<details> <summary><b>Run all checks</b> — paste this script from inside your clone of <code>tellerops/teller</code></summary>
#!/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).

</details>

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 run command uses the duct crate 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.yml combines 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 scan subcommand 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
  • hashicorp/vault — Primary secret backend that Teller integrates with—understanding Vault's API and auth methods is essential for the hashicorp provider implementation
  • aws/aws-cli — Teller mirrors AWS Secrets Manager and SSM Parameter Store integrations—similar auth patterns and secret retrieval strategies
  • mozilla/sops — Alternative encrypted-at-rest secrets file manager; complements Teller for teams wanting YAML-level encryption before Teller decryption
  • 99designs/aws-vault — AWS credential management tool using similar subprocess injection pattern; useful context for secure credential handling in CLI tools
  • getdeck/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 scan subcommand (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.yml supports 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

📝Recent commits

Click to expand
  • 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.


Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.

Healthy signals · tellerops/teller — RepoPilot