chore(deps): update dependency fnox to v1.30.0 #5

Merged
rosa merged 1 commit from renovate/fnox-1.x into main 2026-07-17 00:04:28 +00:00
Owner

This PR contains the following updates:

Package Update Change
fnox minor 1.28.01.30.0

Release Notes

jdx/fnox (fnox)

v1.30.0: : Paranoid env mode and Proton Pass PAT auth

Compare Source

A focused release that hardens fnox's secret exposure model with an exec-only env mode, expands Proton Pass authentication for CI and agent use, and cleans up fnox export defaults.

Added

Exec-only env mode and top-level env default (#​604) -- @​jdx

The per-secret env field gains a new "exec" state, and a new top-level env sets the default for all secrets. This lets you keep secrets out of the interactive shell -- where AI coding agents and other inherited processes would see them -- while still injecting them into fnox exec subprocesses.

env shell integration / fnox export fnox exec fnox get
true (default) yes yes yes
"exec" (new) no yes yes
false no no yes

One line flips a project to default-deny:

env = "exec"   # nothing enters the interactive shell

[secrets]
DATABASE_URL = { provider = "age", value = "..." }               # exec-only (inherited)
PS1_TOKEN    = { provider = "age", value = "...", env = true }   # explicit opt-back-in

Per-secret env overrides the top-level default, and the default rides normal config merge order so fnox.local.toml can tighten or loosen it per machine. Existing configs parse with identical semantics.

fnox doctor also warns when a shell-hiding top-level env is combined with an ambient FNOX_AGE_KEY in the environment, since that would undermine the whole posture. This eliminates ambient exposure but is not a hard boundary -- anything that can run commands in your shell can still call fnox get/fnox exec itself.

Proton Pass PAT and agent auth (#​598) -- @​TyceHerrman

The proton-pass provider now supports headless authentication via personal access tokens and audited agent access, so CI and scripted jobs no longer need an interactive pass-cli login --interactive.

export PROTON_PASS_PERSONAL_ACCESS_TOKEN="pst_token::key"
pass-cli login

New provider config field:

[providers.protonpass]
type = "proton-pass"
vault = "Personal"
agent_reason = "fnox secret retrieval"   # for audited agent access

fnox now passes through the full set of PROTON_PASS_* variables (PAT, agent reason, session dir, key provider, encryption key, Linux keyring) plus matching FNOX_PROTON_PASS_* aliases, and includes them in the daemon config fingerprint so cached values invalidate when auth env changes. Error messages point at the right knob when a session, key, or agent reason is missing.

Fixed

Daemon respects daemon_cache = false for default-provider secrets (#​599) -- @​TyceHerrman

The daemon's cache check only consulted a secret's explicit provider, so secrets that resolved through default_provider skipped the effective provider's daemon_cache setting. Cache decisions now use the effective provider in all paths (explicit provider, default_provider, and auto-selection), so opting out of daemon caching actually opts you out.

fnox export no longer leaks env = false secrets (#​604) -- @​jdx

fnox export previously resolved with include_env_false=true and never filtered on env, so secrets marked "only accessible via fnox get" were still included in export output -- and picked up by tools like mise-env-fnox that consume fnox export --format json. Export now follows the same shell semantics as hook-env. Pass --all for the full dump when you want it explicitly.

Changed

fnox export omits the metadata header by default (#​603) -- @​jdx

The env and shell export formats no longer emit the # Exported from profile: ... / # Total secrets: ... comment block by default -- output is now clean assignment lines only, easier to source or feed into other tooling. Pass --header to restore the previous behavior:

fnox export --format env --header

JSON, YAML, and TOML output are unchanged.

Redesigned logo (#​595) -- @​jdx

New fox-in-keyhole mark matching the fnox.jdx.dev site theme.

Full Changelog: https://github.com/jdx/fnox/compare/v1.29.0...v1.30.0

💚 Sponsor fnox

fnox is maintained by @​jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools including mise, aube, hk, and more. Keeping fnox secure, maintained, and free is funded by sponsors.

If fnox is handling secrets or config for you or your team, please consider sponsoring at jdx.dev. Sponsorships are what let fnox stay independent and the project keep moving.

v1.29.0: : Age plugins, config-relative paths, and Nix flakes

Compare Source

A feature release focused on hardware-backed age encryption, more predictable path handling in config files, and faster GCP Secret Manager batches -- plus a Nix flake for the flake-curious.

Added

Age plugin recipients and identities (#​569) -- @​nightvisi0n

The age provider now supports age plugins, so hardware-backed and specialty recipients work end to end. That includes age-plugin-yubikey (YubiKey/PIV), age-plugin-se (Apple Secure Enclave), age-plugin-tpm, and friends.

Previously a plugin recipient like age1yubikey1... failed at config load with Failed to parse recipient ... incorrect HRP because the provider only understood native X25519 and SSH recipients. It now parses age::plugin::Recipient values, spawns the matching age-plugin-* binary for encryption, and attaches UiCallbacks to identity files so AGE-PLUGIN-* identities get PIN/touch prompts on decrypt.

Nix flake (#​583) -- @​o-az

fnox is now packaged as a Nix flake. Consume it from another flake:

inputs.fnox.url = "github:jdx/fnox";

# ...then reference inputs.fnox.packages.${system}.default

Or run it directly without installing:

nix run github:jdx/fnox

The flake also exposes a devShells.default with cargo, clippy, and rustfmt.

Fixed

Defaults are used when a provider is inactive (#​572) -- @​jdx

If a secret declared a default and the active profile did not have the referenced provider configured, resolution would fail instead of falling back. Single-secret and batch resolution now share the same fallback path, so fnox get and fnox exec return the default (including interpolated ${...} defaults that reference other secrets resolved in the same batch) when the provider is missing, batch fetch fails, or non-interactive auth aborts. A provider value still wins when the provider succeeds; cycles between fallback defaults are rejected explicitly.

Config paths resolve relative to the config file that declares them (#​582) -- @​jdx

Filesystem paths in provider configuration are now interpreted against the config file that defines them, not the current working directory. This matters especially for nested/imported configs, where a parent fnox.toml could point at keys/age.key and a child config in a subdirectory would silently miss it.

Affected fields:

  • age.key_file
  • keepass.database, keepass.keyfile
  • password-store.store_dir
  • foks.home
  • imports, and paths reported by fnox config-files

Rules:

  • Paths in config files resolve relative to the declaring file, and ~ expands to the user home.
  • Absolute paths are used unchanged.
  • CLI path arguments still resolve against the current working directory.
  • Environment-variable paths keep their existing behavior.

fnox daemon clear clears every running daemon (#​581) -- @​jdx

fnox daemon clear previously only talked to the daemon socket for the current profile, so caches on daemons started under other profiles were left stale. It now scans the daemon runtime directory, sends Clear to every live profile-scoped daemon, and ignores stale sockets during the sweep. When no live daemon responds, you still get the familiar "daemon not running" error.

Changed

Faster batch reads from GCP Secret Manager (#​580) -- @​nils-degroot

google-secret-manager previously used the default batch implementation, which created a fresh client per secret. The provider now implements get_secrets_batch directly: a single client is reused across the batch and up to 10 secrets are fetched concurrently, which noticeably reduces latency for configs with many GCP secrets. Missing payloads and non-UTF-8 values are handled more explicitly, and client-creation errors surface provider-specific auth guidance.

New Contributors

Full Changelog: https://github.com/jdx/fnox/compare/v1.28.0...v1.29.0

💚 Sponsor fnox

fnox is maintained by @​jdx under en.dev — a small independent studio building developer tooling like mise, aube, hk, and more. Keeping fnox secure, maintained, and free is funded by sponsors.

If fnox is handling secrets or config for you or your team, please consider sponsoring at en.dev. Sponsorships are what let fnox stay independent and the project keep moving.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR has been generated by Mend Renovate.

This PR contains the following updates: | Package | Update | Change | |---|---|---| | [fnox](https://github.com/jdx/fnox) | minor | `1.28.0` → `1.30.0` | --- ### Release Notes <details> <summary>jdx/fnox (fnox)</summary> ### [`v1.30.0`](https://github.com/jdx/fnox/releases/tag/v1.30.0): : Paranoid env mode and Proton Pass PAT auth [Compare Source](https://github.com/jdx/fnox/compare/v1.29.0...v1.30.0) A focused release that hardens fnox's secret exposure model with an exec-only env mode, expands Proton Pass authentication for CI and agent use, and cleans up `fnox export` defaults. #### Added **Exec-only env mode and top-level `env` default** ([#&#8203;604](https://github.com/jdx/fnox/pull/604)) -- [@&#8203;jdx](https://github.com/jdx) The per-secret `env` field gains a new `"exec"` state, and a new top-level `env` sets the default for all secrets. This lets you keep secrets out of the interactive shell -- where AI coding agents and other inherited processes would see them -- while still injecting them into `fnox exec` subprocesses. | `env` | shell integration / `fnox export` | `fnox exec` | `fnox get` | | ---------------- | :-------------------------------: | :---------: | :--------: | | `true` (default) | yes | yes | yes | | `"exec"` (new) | no | yes | yes | | `false` | no | no | yes | One line flips a project to default-deny: ```toml env = "exec" # nothing enters the interactive shell [secrets] DATABASE_URL = { provider = "age", value = "..." } # exec-only (inherited) PS1_TOKEN = { provider = "age", value = "...", env = true } # explicit opt-back-in ``` Per-secret `env` overrides the top-level default, and the default rides normal config merge order so `fnox.local.toml` can tighten or loosen it per machine. Existing configs parse with identical semantics. `fnox doctor` also warns when a shell-hiding top-level `env` is combined with an ambient `FNOX_AGE_KEY` in the environment, since that would undermine the whole posture. This eliminates *ambient* exposure but is not a hard boundary -- anything that can run commands in your shell can still call `fnox get`/`fnox exec` itself. **Proton Pass PAT and agent auth** ([#&#8203;598](https://github.com/jdx/fnox/pull/598)) -- [@&#8203;TyceHerrman](https://github.com/TyceHerrman) The `proton-pass` provider now supports headless authentication via personal access tokens and audited agent access, so CI and scripted jobs no longer need an interactive `pass-cli login --interactive`. ```bash export PROTON_PASS_PERSONAL_ACCESS_TOKEN="pst_token::key" pass-cli login ``` New provider config field: ```toml [providers.protonpass] type = "proton-pass" vault = "Personal" agent_reason = "fnox secret retrieval" # for audited agent access ``` fnox now passes through the full set of `PROTON_PASS_*` variables (PAT, agent reason, session dir, key provider, encryption key, Linux keyring) plus matching `FNOX_PROTON_PASS_*` aliases, and includes them in the daemon config fingerprint so cached values invalidate when auth env changes. Error messages point at the right knob when a session, key, or agent reason is missing. #### Fixed **Daemon respects `daemon_cache = false` for default-provider secrets** ([#&#8203;599](https://github.com/jdx/fnox/pull/599)) -- [@&#8203;TyceHerrman](https://github.com/TyceHerrman) The daemon's cache check only consulted a secret's explicit `provider`, so secrets that resolved through `default_provider` skipped the effective provider's `daemon_cache` setting. Cache decisions now use the effective provider in all paths (explicit provider, `default_provider`, and auto-selection), so opting out of daemon caching actually opts you out. **`fnox export` no longer leaks `env = false` secrets** ([#&#8203;604](https://github.com/jdx/fnox/pull/604)) -- [@&#8203;jdx](https://github.com/jdx) `fnox export` previously resolved with `include_env_false=true` and never filtered on `env`, so secrets marked "only accessible via `fnox get`" were still included in export output -- and picked up by tools like [mise-env-fnox](https://github.com/jdx/mise-env-fnox) that consume `fnox export --format json`. Export now follows the same shell semantics as hook-env. Pass `--all` for the full dump when you want it explicitly. #### Changed **`fnox export` omits the metadata header by default** ([#&#8203;603](https://github.com/jdx/fnox/pull/603)) -- [@&#8203;jdx](https://github.com/jdx) The env and shell export formats no longer emit the `# Exported from profile: ...` / `# Total secrets: ...` comment block by default -- output is now clean assignment lines only, easier to `source` or feed into other tooling. Pass `--header` to restore the previous behavior: ```bash fnox export --format env --header ``` JSON, YAML, and TOML output are unchanged. **Redesigned logo** ([#&#8203;595](https://github.com/jdx/fnox/pull/595)) -- [@&#8203;jdx](https://github.com/jdx) New fox-in-keyhole mark matching the [fnox.jdx.dev](https://fnox.jdx.dev) site theme. **Full Changelog**: <https://github.com/jdx/fnox/compare/v1.29.0...v1.30.0> #### 💚 Sponsor fnox fnox is maintained by [@&#8203;jdx](https://github.com/jdx), an open source developer for [**entire.io**](https://entire.io), the title sponsor of the [jdx.dev](https://jdx.dev) open source tools including [mise](https://mise.jdx.dev/), [aube](https://aube.jdx.dev/), hk, and more. Keeping fnox secure, maintained, and free is funded by sponsors. If fnox is handling secrets or config for you or your team, please consider [sponsoring at jdx.dev](https://jdx.dev/sponsors.html). Sponsorships are what let fnox stay independent and the project keep moving. ### [`v1.29.0`](https://github.com/jdx/fnox/releases/tag/v1.29.0): : Age plugins, config-relative paths, and Nix flakes [Compare Source](https://github.com/jdx/fnox/compare/v1.28.0...v1.29.0) A feature release focused on hardware-backed age encryption, more predictable path handling in config files, and faster GCP Secret Manager batches -- plus a Nix flake for the flake-curious. #### Added **Age plugin recipients and identities** ([#&#8203;569](https://github.com/jdx/fnox/pull/569)) -- [@&#8203;nightvisi0n](https://github.com/nightvisi0n) The `age` provider now supports [age plugins](https://github.com/FiloSottile/awesome-age#plugins), so hardware-backed and specialty recipients work end to end. That includes `age-plugin-yubikey` (YubiKey/PIV), `age-plugin-se` (Apple Secure Enclave), `age-plugin-tpm`, and friends. Previously a plugin recipient like `age1yubikey1...` failed at config load with `Failed to parse recipient ... incorrect HRP` because the provider only understood native X25519 and SSH recipients. It now parses `age::plugin::Recipient` values, spawns the matching `age-plugin-*` binary for encryption, and attaches `UiCallbacks` to identity files so `AGE-PLUGIN-*` identities get PIN/touch prompts on decrypt. **Nix flake** ([#&#8203;583](https://github.com/jdx/fnox/pull/583)) -- [@&#8203;o-az](https://github.com/o-az) fnox is now packaged as a Nix flake. Consume it from another flake: ```nix inputs.fnox.url = "github:jdx/fnox"; # ...then reference inputs.fnox.packages.${system}.default ``` Or run it directly without installing: ```sh nix run github:jdx/fnox ``` The flake also exposes a `devShells.default` with `cargo`, `clippy`, and `rustfmt`. #### Fixed **Defaults are used when a provider is inactive** ([#&#8203;572](https://github.com/jdx/fnox/pull/572)) -- [@&#8203;jdx](https://github.com/jdx) If a secret declared a `default` and the active profile did not have the referenced provider configured, resolution would fail instead of falling back. Single-secret and batch resolution now share the same fallback path, so `fnox get` and `fnox exec` return the `default` (including interpolated `${...}` defaults that reference other secrets resolved in the same batch) when the provider is missing, batch fetch fails, or non-interactive auth aborts. A provider value still wins when the provider succeeds; cycles between fallback defaults are rejected explicitly. **Config paths resolve relative to the config file that declares them** ([#&#8203;582](https://github.com/jdx/fnox/pull/582)) -- [@&#8203;jdx](https://github.com/jdx) Filesystem paths in provider configuration are now interpreted against the config file that defines them, not the current working directory. This matters especially for nested/imported configs, where a parent `fnox.toml` could point at `keys/age.key` and a child config in a subdirectory would silently miss it. Affected fields: - `age.key_file` - `keepass.database`, `keepass.keyfile` - `password-store.store_dir` - `foks.home` - `imports`, and paths reported by `fnox config-files` Rules: - Paths in config files resolve relative to the declaring file, and `~` expands to the user home. - Absolute paths are used unchanged. - CLI path arguments still resolve against the current working directory. - Environment-variable paths keep their existing behavior. **`fnox daemon clear` clears every running daemon** ([#&#8203;581](https://github.com/jdx/fnox/pull/581)) -- [@&#8203;jdx](https://github.com/jdx) `fnox daemon clear` previously only talked to the daemon socket for the current profile, so caches on daemons started under other profiles were left stale. It now scans the daemon runtime directory, sends `Clear` to every live profile-scoped daemon, and ignores stale sockets during the sweep. When no live daemon responds, you still get the familiar "daemon not running" error. #### Changed **Faster batch reads from GCP Secret Manager** ([#&#8203;580](https://github.com/jdx/fnox/pull/580)) -- [@&#8203;nils-degroot](https://github.com/nils-degroot) `google-secret-manager` previously used the default batch implementation, which created a fresh client per secret. The provider now implements `get_secrets_batch` directly: a single client is reused across the batch and up to 10 secrets are fetched concurrently, which noticeably reduces latency for configs with many GCP secrets. Missing payloads and non-UTF-8 values are handled more explicitly, and client-creation errors surface provider-specific auth guidance. #### New Contributors - [@&#8203;nightvisi0n](https://github.com/nightvisi0n) made their first contribution in [#&#8203;569](https://github.com/jdx/fnox/pull/569) - [@&#8203;o-az](https://github.com/o-az) made their first contribution in [#&#8203;583](https://github.com/jdx/fnox/pull/583) - [@&#8203;nils-degroot](https://github.com/nils-degroot) made their first contribution in [#&#8203;580](https://github.com/jdx/fnox/pull/580) **Full Changelog**: <https://github.com/jdx/fnox/compare/v1.28.0...v1.29.0> #### 💚 Sponsor fnox fnox is maintained by [@&#8203;jdx](https://github.com/jdx) under [**en.dev**](https://en.dev) — a small independent studio building developer tooling like [mise](https://mise.jdx.dev/), [aube](https://aube.en.dev/), hk, and more. Keeping fnox secure, maintained, and free is funded by sponsors. If fnox is handling secrets or config for you or your team, please consider [sponsoring at en.dev](https://en.dev). Sponsorships are what let fnox stay independent and the project keep moving. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNTcuMiIsInVwZGF0ZWRJblZlciI6IjQzLjI2NS4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZSJdfQ==-->
chore(deps): update dependency fnox to v1.29.0
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
f859998713
rosa scheduled this pull request to auto merge when all checks succeed 2026-07-10 04:03:40 +00:00
rosa changed title from chore(deps): update dependency fnox to v1.29.0 to chore(deps): update dependency fnox to v1.30.0 2026-07-17 00:04:25 +00:00
rosa force-pushed renovate/fnox-1.x from f859998713
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
to 2cf252bccf
All checks were successful
renovate/stability-days Updates have met minimum release age requirement
2026-07-17 00:04:25 +00:00
Compare
rosa merged commit 2cf252bccf into main 2026-07-17 00:04:28 +00:00
rosa deleted branch renovate/fnox-1.x 2026-07-17 00:04:28 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
rosa/gtt!5
No description provided.