Pushing Secrets to CI
The push command decrypts an agenix-encrypted .age file and pushes the
plaintext to Codeberg/Forgejo, Codefloe, and GitHub Actions secret stores. The
plaintext never touches disk — it lives only in process memory.
secret-manager push age/secrets/users/can/app-token.age \
--name APP_TOKEN \
--codeberg caniko/my-repo \
--codefloe caniko/my-repo \
--github my-org/other-repo
Decrypt-only
To print a decrypted secret to stdout (for piping into other tools):
secret-manager decrypt age/secrets/users/can/app-token.age
Diagnostics and hardware-key prompts stay on stderr.
Authentication
- Codeberg: the
fjauth store at${XDG_DATA_HOME:-$HOME/.local/share}/forgejo-cli/keys.json(set up withfj auth login --host codeberg.orgorfj auth add-key <user>). - Codefloe: the same
fjauth store (set up withfj -H codefloe.com auth loginorfj -H codefloe.com auth add-key <user>). - GitHub: requires
ghauthenticated.
Identity resolution
Identities are resolved in precedence order:
- Explicit
--identityflags (repeatable). - The
SECRET_MANAGER_AGE_IDENTITIESenvironment variable — a colon-separated list of identity paths, mirroring the DNS flow’sCANIX_DNS_AGE_IDENTITIEScontract. - Master identity stubs discovered from
age/master-*.pub/age/master_*.pubin the store root.
Relative paths resolve against the store root.
secret-manager decrypt secret.age --identity age/my-key.pub
# or, once per shell:
export SECRET_MANAGER_AGE_IDENTITIES=age/master_nitro3c_identity.pub:age/master_nitro3_2_identity.pub
secret-manager sync