ciphr / secrets for machines

A small secret manager for machine identities

Key/value secrets, gap-free access auditing, and path-based authorization. The name contains CI: the primary consumer is a build and deploy pipeline, not a human.

Status: v0.14.0 released and usable end to end, including the CI-side binary described under Integrate. This page describes what exists and says so where something does not.

Why it exists

Storing deployment secrets as forge secrets and rendering them into .env files works, and it cannot answer three questions:

  1. Who read which secret, and when? There is no access log.
  2. Can service A's runner reach service B's secrets? Yes, and nothing prevents it.
  3. Where is the authoritative value? In two places at once — the forge and the host.

ciphr answers all three. It is deliberately small: key/value secrets, an audit trail, and policies. No PKI, no SSH CA, no dynamic secrets. If those are ever needed, OpenBao is the right answer rather than this project.

The design in one screen

What it is not

A password manager for humans, Bitwarden API compatibility, feature parity with Vault, multi-tenancy, and high availability. Each of those is a recorded decision rather than a gap, and the reasoning for each is in the plan.

The boundary this project does not pretend about

Root on the host reads the master key and process memory. That is a deliberate consequence of choosing unattended startup — an availability decision, not a cryptographic one. The realistic end state is one secret per host, not zero, plus an audit trail, plus rotation, plus a bounded blast radius per token.

And a secret that has left ciphr is the pipeline's problem: the trail records that a runner read a value, never what it did with it afterwards. The security notes say what that means for the code you are about to write.

Where to go next