← All features

Install and operateAvailable in v0.3.0

Security: no secrets anywhere

The hard rule: no API key, token, password, cookie, OAuth secret or account identifier ever enters the repository, its history, releases, issues or CI logs. Keys are read only at runtime, templates use ${ENV_VAR} placeholders, and gitleaks and the privacy scan run before every push and in CI over the full history.

When you need it

AI agents read and write many files quickly, so a single pasted key can spread into commits, briefs and logs before anyone notices.

How it works

  1. Keys come only from environment variables or the OS keychain, through one documented lookup; a missing key leaves the feature off with unused(no key).
  2. Templates and docs use placeholders such as ${TYPESAFE_API_KEY}, never values.
  3. oah init adds local secret files to .gitignore; the opt-in pre-push hook scans pushed commits; oah land refuses without a gitleaks scan.
  4. In oah's own repository, gitleaks and the privacy scan run before every push and in CI on every pull request and push, over the full history; any finding fails the build.

Example

The privacy scan oah's contributors run before every push; it must print `PRIVACY_SCAN_CLEAN`.

python3 tools/privacy_scan.py --gitleaks require

Requirements

  • gitleaks for scans and for landing.

Limits and recovery

  • A key that reached a commit, a push or a log is exposed even if you delete it a minute later: rotate it first.
  • The CI starter's secret scan prints no finding context and writes no report, so you see the failure, not the value.
  • Never put a secret in a CI-exception reason; the docs ask for a non-secret reason.

Original documents

Related