resenv resolves values in a process environment. It does not provide a vault, access-control service, key rotation, or isolation between programs running with the same credentials. The application can read its resolved secrets and any credentials supplied to it.
Doppler mode uses a fixed HTTPS API origin, disables redirects and fetches only
referenced secret names. It does not execute shell expressions. Credentials
come from an explicit token, resenv's OS credential store or a fixed Doppler CLI
helper. An API rejection never triggers a switch to another identity. Native
browser login uses endpoints observed in Doppler's official MCP client rather
than a public third-party OAuth contract. See Doppler details
for fallback rules, credential scope and platform limits.
The canonical resolve preload and run command select Doppler only for
doppler:// values. They do not infer shell execution from $() values.
Startup does not initiate login; the separate login command rejects CI and
noninteractive sessions.
The local credential store does not prevent code running as the same user from
requesting credentials. resenv does not automatically remove an explicitly
supplied DOPPLER_TOKEN from the application environment. Interactive login
displays a temporary human authorization code; tokens and the polling code are
not logged. The Node preload's private worker exchanges credentials and results
over captured pipes, never process arguments or dotenv files.
Command mode executes trusted configuration with the current user's permissions. Enable it only for configuration you have reviewed. Commands can access files and the network; failed resolution cannot undo their external effects. Commands are bounded by timeout and output limits, and their output is not included in resenv diagnostics.
Node's child_process debug category prints spawn options, including stdin
and environment values. resenv refuses its own subprocess and credential-helper
operations when that category is enabled, including through NODE_DEBUG=*.
Use NODE_DEBUG=ciqol:resenv for diagnostics that omit values. This guard does not
control application logs, other instrumentation, or a debugger attached to the
process.
All values are resolved before resenv updates the caller's environment or starts the application. Provider failures, command failures and invalid environment values stop startup. Fetched values are never evaluated recursively. Application logs are outside resenv's control.
Different automatic preload modes cannot be combined in one process. Otherwise
the second mode could execute literal data fetched by the first.
Combining a preload with the CLI is rejected for the same reason. Do not add
another resolver to the child through NODE_OPTIONS or other launch hooks.
Use one resenv run --commands invocation or one library call with commands
enabled to resolve cloud references and commands together. Repeated manual
library calls are separate operations; only pass original configuration to them.
Provider responses must be valid UTF-8 and JSON, and resolved strings must not
contain lone Unicode surrogates or null bytes. In-place replacement preflights
all changed properties; read-only properties, setters and Proxy targets are
rejected before any values are committed. Use resolve() to obtain a copy
when the input is not a writable environment record.
This experimental package has not had an independent security audit. Validation evidence and platform limits are recorded in docs/validation.md.
Do not open a public issue containing a vulnerability, credentials or sensitive output. Open the repository's Security tab and use "Report a vulnerability" when available. If that option is unavailable, contact the maintainer through an existing private channel. Before the public transition is complete, maintainers must enable GitHub private vulnerability reporting and verify that it is available.
Include affected versions, platform, impact and a minimal reproduction using dummy data. Never include production tokens, private keys or environment dumps. There is no guaranteed response time or long-term support policy yet.