Repository navigation
Update dependency varlock to v1.23.0 - #23
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
June 6, 2026 11:38
2abb8b0 to
be5c445
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
June 12, 2026 14:08
be5c445 to
0bdf1e8
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
June 20, 2026 11:31
0bdf1e8 to
6a41522
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
June 24, 2026 08:09
6a41522 to
dde2fcd
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
June 27, 2026 19:45
dde2fcd to
3b6308c
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
July 8, 2026 00:14
3b6308c to
513707d
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
July 16, 2026 07:17
513707d to
9d9b895
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
July 25, 2026 07:12
9d9b895 to
c15a00b
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
July 29, 2026 03:47
c15a00b to
8e502e3
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
August 1, 2026 12:52
8e502e3 to
59ec471
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
August 8, 2026 14:56
59ec471 to
b6bb5cc
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
August 21, 2026 03:54
b6bb5cc to
50b0e41
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
August 29, 2026 06:49
50b0e41 to
dcb72c9
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
September 5, 2026 04:09
dcb72c9 to
4a3de14
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
September 12, 2026 19:09
4a3de14 to
64e4fa2
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
September 20, 2026 08:04
64e4fa2 to
cb57b22
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
October 3, 2026 03:08
cb57b22 to
330ae50
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
2 times, most recently
from
October 10, 2026 07:42
4344b9c to
e4b392f
Compare
renovate
Bot
force-pushed
the
renovate/varlock-1.x
branch
from
October 16, 2026 08:00
e4b392f to
fa121fb
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
1.2.0→1.23.0Release Notes
dmno-dev/varlock (varlock)
v1.23.0Compare Source
2026-10-13
Python codegen:
@generatePythonEnvnow emits a lazily loadedENVobject with a documented property per item, so editors show item descriptions,@docs()links and deprecations on hover where values are read.EnvTypedDict fields get docstrings instead of#comments.The
urltype now warns on values that only parse becausenew URL()is permissive: anything not written asscheme://...(like an SSH key fingerprintSHA256:...oruser:pass), whitespace or control characters, a missing host, and malformedhttp/httpshosts the parser would otherwise rewrite (https:///example.com,http://0x7f.1,https://a..b). It also warns on protocols other thanhttp/httpswhenallowedProtocolsis not set. These become errors in the next major version. New options:allowedProtocols="*"allows any protocol, andallowNoHost=trueallows host-less URLs likesqlite:///app.db.url(allowedDomains=...)now rejects values whose host other URL parsers could read differently (backslashes, whitespace, percent-encoded or non-ASCII hosts, IPv4 shorthand, missingscheme://host), which could let a value pass the allowlist while the app connects elsewhere. Write internationalized hosts in punycode.url(prependHttps=true)now prefixeshost:portvalues likelocalhost:3000.Telemetry no longer adds latency to CLI commands. Events still in flight when a command finishes are handed to a detached background process instead of being awaited, so
varlock loadandvarlock/auto-loadtake the same time with telemetry on or off. The background process runs from the system temp directory, so it never keeps the project directory in use.Commented-out config items (ex:
# API_KEY=prod-value, including multi-line values) are no longer treated as part of the next item's description, so their values no longer leak into generated types or other description output.Report auto-load CLI crashes with their command and original status, and exit with code 1 instead of a native crash code.
v1.22.0Compare Source
2026-10-09
and()andor()resolver functions for combining boolean conditionsvarlock/auto-loadand the framework integrations now warn when no config items are loaded (no .env files found, or none define items) instead of silently continuing with an empty config. This becomes an error in the next major. Set_VARLOCK_ALLOW_EMPTY_CONFIG=1to allow an empty config, which also letsvarlock loadandvarlock runsucceed with an empty config.Bundle the icons used by built-in data types, so
@generateTsTypesno longer fetches them over the network. Plugins can ship their own icons viaplugin.bundledIcons, and plugin data types and resolvers without an icon now use the plugin's icon. Also adds anicons=falseoption to leave icons out of generated types entirely.Rename
@redactLogsto@redact(the old name still works as a deprecated alias, with a warning) and add@redact={stdout=true}to redactprocess.stdout/process.stderrwrites (andBun.writeto them) invarlock/auto-loadand framework integrations, using the same non-TTY rule asvarlock run. Opt-in for now; planned to become the default in the next major. Also adds@sensitive={redact=false}to exempt a value that is meant to be printed, and speeds up the partial-match check used by streaming redaction. FixesrevealSensitiveConfig(), which printed its 👁 markers around the value and did not work under Bun.Add
varlock freezefor apps with no framework integration baking env into the build (Elysia, Hono, Fastify, compiled binaries): it resolves every value once at deploy time into an encrypted file that ships inside the release, and with_VARLOCK_USE_FROZEN_ENV=1set at runtime the app boots from that file with no varlock CLI,.envfiles, or resolver credentials present. Framework integrations already freeze in build output (ssrInjectMode: 'resolved-env', picked automatically on some platforms), and Cloudflare Workers usevarlock-wrangler deploy, so those users need nothing new. See the frozen env guide for details, including@dynamic=bootfor values the platform sets per instance.Fix
varlock auditreporting a referenced item as unused when the item referencing it is overridden, either from the process environment or by a higher-priority fileError output fixes:
exec()no longer dumps a raw stack trace to stdout (which brokeload --format json-full); the error now includes the exit code and stderr@cachevalue is reported oncejson-fullitem errors no longer include warningsVARLOCK_ENV=) resolving empty when the@currentEnvitem depends on itvarlock scan --install-hookfailing in git worktrees, and respectcore.hooksPathDetect Fly.io as a platform (
VARLOCK_PLATFORM=Fly.io), and warn whenVARLOCK_ENVis used but only guessedpreviewbecause the platform reports no environment or branchFix
varlock proxyshutdown hanging when a client had read a blocked response over a MITM tunnel, or still held an idle CONNECT tunnel openFix the native helper failing with EACCES when varlock runs from a directory the current user cannot enter, such as after
runuserto a service user from a private home directory. This brokevarlock cache clearin the standalone binary.Build the standalone binary with Bun 1.4.2, fixing spawn failures when varlock runs from a directory the current user cannot enter
varlock proxy:@proxy(path=...)rules are now matched against the canonical request path (dot segments resolved, repeated slashes collapsed, unreserved percent-escapes decoded), and that canonical path is what is sent upstream. Previously a request spelled/v1/charges/../refunds/xdid not match apath="/v1/refunds/**"block rule even though the upstream routed it to/v1/refunds/x. Paths that cannot be canonicalized unambiguously (encoded slashes, backslashes, control characters,#,;path parameters,..above the root, absolute-form request lines inside a tunnel) are now rejected with a 400. AsubstituteIn=[path]value that would itself change the path structure (contains a path separator, dot segment, or query marker) is refused instead of routing the request somewhere the rules never evaluated.varlock runandvarlock proxy runno longer print a "command failed" error when the child handles Ctrl+C (or another forwarded signal) and exits non-zero, e.g. 130varlock runandvarlock proxy runno longer print a failure hint to stdout when the child exits non-zero; the child's exit code is passed through silently. A command that cannot be started is reported on stderr (exit 127 when not found, 126 when not executable)Cached pinned
@pluginpackages now load without a registry lookup, so offline loads work after the plugin is cached (e.g. viavarlock install-plugin). Registry errors now name the plugin and URL.Fix redaction of
--include-internalvalues invarlock run, and warn when a sensitive number is injected, since numbers are never redactedvarlock telemetry disableno longer sends a usage event or creates an anonymous ID before saving the opt-outv1.21.1Compare Source
2026-09-29
Error when an unquoted config item value looks like a function call but cannot be parsed as one (e.g. an unquoted arg containing a space), instead of silently using the literal text
Run the varlock CLI with Bun when auto-load or an integration is used from a Bun process, so TypeScript local plugins work there
DEP0190warning and support project paths containing spaces when auto-load runs on Windowsv1.21.0Compare Source
2026-09-25
#1112 (minor)
uuidtype now accepts UUID versions 6-8 (RFC 9562, including UUIDv7) and the MAX UUID, and takes an optionalversionoption (e.g.@type=uuid(version=7)) to require a specific version.#1124 (minor)
pick/omiton@import()now accept the same selectors as--filter:#tagto import items tagged with@tag()in the imported file, and!selectorto exclude matches (e.g.pick=[#frontend, !#internal]orpick=[API_*, !API_SECRET]). Previously a#tagentry silently matched nothing.@setValuesBulkpick/omitgain!exclusions too; decorator selectors like@sensitiveare rejected with a clear error in both.New
varlock.filteroption inpackage.json: a default--filterforvarlock load/run, valid alongsidevarlock.loadPath, so a package can point at a shared root schema and take just its tagged items without a.env.schemaof its own.#1108 (patch)
Fix an infinite spawn loop when
varlock/auto-loadis preloaded via bun'sbunfig.tomland bun also serves asnode(as in bun-only containers): the CLI process spawned by auto-load was preloaded too, and spawned another. The spawned CLI is now tagged with__VARLOCK_CLI_CHILDand a preloaded auto-load inside it skips resolving.#1107 (patch)
varlock auditno longer tries to lex string, template and regex literals while scanning source files. A quote inside a regex (such ass.replace(/'/g, "")), JSX text or a docstring could throw that lexer off and silently hide every env var reference after it in the same file. The scanner now only skips lines that are entirely comments, and references mentioned inside string literals are reported like any other.New
@auditIgnoreKeys(KEY, PREFIX_*)root decorator: keys the audit should never report as missing from the schema, for scanner false positives such as aprocess.env.FOOmentioned inside a string.#1110 (patch)
Fix duplicate encryption daemons, and the repeated Touch ID / Windows Hello prompts they cause, when many varlock processes start at once (an MCP host launching several stdio servers, a parallel task runner). Switching between projects on different varlock versions now only restarts the daemon when its binary actually differs, so versions that ship the same daemon share one biometric session.
#1114 (patch)
Plugins whose build is split into several files no longer fail with "No active plugin context" when a chunk loads after the plugin has initialized
#1109 (patch)
Auto-load and framework integrations now always run the varlock CLI installed alongside the imported package, and only fall back to a
varlockon PATH when there is no local install. Previously a globally installed CLI could win over the local one when an app was started directly withnode, so the runtime library and the CLI could be different versions.#1120 (patch)
Fix duplicate encryption daemons on Windows when many varlock processes start at once, which made each daemon ask for Windows Hello separately.
#1121 (patch)
varlock runnow waits for a child's shutdown handler to finish after forwardingSIGTERMorSIGINT. Previously, in published builds, varlock exited right after forwarding the signal and killed the child mid-shutdown (for example ondocker stopwithvarlock runas the container entrypoint).varlock proxy runnow handles signals the same way: it forwards them to the child and waits, instead of killing it immediately, and propagates the child's real exit status. Theproxy startdaemon's shutdown cleanup is no longer cut short by the same exit hook.v1.20.0Compare Source
2026-09-17
regex("pattern", "flags")is now the one way to write a regex, and takes flags as a second argument:matches=regex("^[0-9a-f]{7,40}$", "i"). Passing a pattern as a string still works but is deprecated and produces a warning showing theregex()call to use: a bare/pattern/string inmatches,remap()match values or@auditExtraPatterns, or a plain string inmatches. A future major version will stop reading strings as regexes, which also means a pattern taken from another variable (matches=$PATTERN) will no longer work: write the pattern directly.regex()also rejects a/.../-wrapped argument instead of silently matching the slashes.Skip the process.env type augmentation when another .d.ts (e.g. wrangler's worker-configuration.d.ts) already declares NodeJS.ProcessEnv, which previously caused a TS2320 conflict. Set processEnv=strict on @generateTsTypes to override.
@type=enumwith no members as a schema error instead of accepting a type that no value can satisfySerialized env blobs (
__VARLOCK_ENV) now record the format version and the varlock version that produced them. Nothing reads these yet: they exist so future version skew between the varlock that resolved the env and the one consuming it can be detected.v1.19.0Compare Source
2026-09-12
Check that a value marked sensitive can actually be protected by redaction, which replaces it wherever it appears. Values under 12 characters warn. Values under 3 characters, booleans, numbers, composites with non-string elements, and the
@currentEnvitem are an error when you wrote@sensitiveon the item, and a warning when@defaultSensitiveswept it in, so nothing inherited from the default can fail a load. For a number, make it a string to keep leading zeros and precision. Composite values are checked per element, since redaction registers each element on its own. A non-sensitive value that contains a sensitive one now warns. Acknowledge a legitimately short secret with@sensitive={allowShortValue=true}; it does not apply under 3 characters. Also fixes sensitive values that are not strings, and the pre-coercion form of a coerced value, being shown unredacted in CLI output.Credential proxy: added request transforms, which let the proxy compute a request's credential itself rather than substituting a placeholder. HMAC signing and Basic auth are built in, and plugins can contribute new transformations.
Plugin cache:
getOrSetnow accepts a TTL callback, so a plugin can set the cache lifetime from the value it just fetched (an STS session, an OAuth token, a lease). Also fixes plugin caching to respect the cache mode set via the@cacheroot decorator.domainFromUrl()function to extract the host from a URL, and a newallowIpV6option on thedomaintypevarlock auditcan now be taught project-specific env access patterns with@auditExtraPatterns(), for code that reads env vars through a wrapper likeconfigService.get('KEY'). AddfileTypes=[tf, yaml]to a call to limit its patterns to those file types, which is also how the scan reaches file types it skips by default, such as Terraform or Helm values.@auditIgnorePaths()andvarlock audit --ignorecan now exclude one specific directory, written as a path (./apps/docs,../,~/, or absolute) instead of only a bare directory name that matches everywhere it appears. A path written without one of those prefixes, or resolving outside the scanned directory, used to silently exclude nothing and is now an error that names the fix. Also fixes the scanner reporting commented-out code inside template literal interpolations (${/* ... */ ...}) as live env references.Data type fixes.
@type=enumnow matches numeric and boolean members against string values fromprocess.envandoverrideValues, soLEVEL=2orFLAG=truefrom CI satisfiesenum(1, 2, 3)/enum(true, false).@type=urlmatchesallowedDomainsin full against the URL host instead of as a substring, which previously letexample.compass an allowlist ofmyexample.com; write two or more hosts as an array (allowedDomains=[a.com, b.com]), since a comma inside a single string now errors and names the array to use. AnallowedDomainsentry without a port now allows any port, soallowedDomains=[localhost]acceptshttp://localhost:3000; add a port to pin it. Each entry must be a hostname with an optional port; an empty list, or a scheme, path, or credentials in an entry, now errors instead of silently matching the wrong host or nothing at all. VS Code diagnostics forallowedDomains,allowedProtocolsandnoTrailingSlashwere reporting different results than an actual load, and now match.@env-spec/parserexportsautoCoerceso tooling can classify unquoted values exactly as the parser does.@type=url(noTrailingSlash=true)now also catches a trailing slash that is followed by a query string or hash, such ashttps://example.com/path/?q=1.@type=ip(version=6)accepts IPv4-mapped addresses like::ffff:192.168.1.1.@type=md5accepts uppercase hex and normalizes it to lowercase.@type=portrejects non-integers such as80.5.A leak detected in
ServerResponse.endno longer leaves the HTTP client hanging. The response is finished before the leak error is rethrown (a plaintext 500 if the headers have not gone out yet, otherwise the connection is closed), so a Next.js Pages Routerres.json()that would have leaked a sensitive value fails the request instead of stalling the client on a body that never arrives.@currentEnv=$FLAGcan now reference a key brought in by@import, including a partial import that lists the flag inpick=[...]. Previously the flag had to be defined in the same file, which broke monorepo schemas that import a sharedDEPLOY_ENV. A missing flag still errors, now naming the import as a way to provide it. An auto-loaded.envvalue on its own does not satisfy the flag or trigger.env.<env>loading. A@currentEnvdeclared in an imported file now also carries through a partial import when the flag is included in the filter. Directory imports declared before the import that provides the flag are rejected with an error asking you to reorder.expected dataType to be setvarlock load/run no longer spawns the native encryption helper unless encrypted values or the disk cache are actually used. Fixes multi-second startup on WSL 2 for projects with no encrypted values.
v1.18.0Compare Source
2026-09-01
#1038 (minor)
Behavior change: schema items that resolve to undefined are no longer injected into process.env as empty strings by auto-load, matching
varlock runand the documentedVAR=semantics (soprocess.env.MY_VAR ?? 'fallback'works).varlock load --format shellnow also skips them. If your code relies on unset vars being"", add# @injectUndefinedAsEmptyto your.env.schemaheader to restore the old behavior; when set, generated types mark process.env keys as always-present strings (optional enums become"a" | "b" | "").#1045 (minor)
New
domaindata type for validating bare domain names (hostnames), with options for wildcards, single-label hostnames, IPv4 values (for HOST-style vars), lowercasing, and regex matching#1043 (minor) Thanks @app/pullfrog! - Added allowed protocol validation for URL values.
#1046 (minor)
Proxy: a placeholder appearing in a request surface its rule doesn't substitute in (e.g. the body under the default header-only targets) is now skipped (forwarded unsubstituted) and logged as a skipped-placeholder audit event, instead of blocking the request. Blocking still applies to occurrences off the named path/param within a body: or query: target.
The
maxOccurrencesoption has been removed. EachsubstituteIntarget is now worth one substitution per request, so listing a target is what grants it an occurrence: an API that carries the secret in two places just names both (substituteIn=["header:authorization", "body:signature"]) instead of raising a count. A repeat at the same target still blocks. SettingmaxOccurrencesis now a schema error that points at the replacement.#1051 (minor)
Fix "exports is not defined in ES module scope" when using varlockNextConfigPlugin in a next.config.ts file. varlock now ships CJS builds of its runtime entry points (varlock/env, varlock/patch-console, varlock/patch-server-response, varlock/encrypt-env, varlock/exec-sync-varlock) via the
requirecondition, so requiring them from CommonJS works through Next's TypeScript config loader and on Node versions without require(esm) support (below 22.12).#981 (patch) - Fix leak detection missing sensitive values split across response chunks
#1035 (patch) Thanks @app/pullfrog! - Fix
encrypt --filecrashing when confirming values to encrypt#1042 (patch)
auto-load and framework integrations no longer pass NODE_OPTIONS to the varlock CLI subprocess, so preloaded modules (e.g. NODE_OPTIONS="-r next-logger") can no longer corrupt its output and crash env loading
#1050 (patch) - Fix
@currentEnvfrom an import losing to the--envfallback when loading a directory's own.env.[env]files#1055 (patch)
Fixes runtime-provided env vars being deleted from
process.envwhen a server boots from the env snapshot baked into the build output (e.g. a Next.js standalone container where the varlock CLI is unavailable). Introduced in 1.17.1, this could take down a service that passes config at boot withdocker run -e ....v1.17.1Compare Source
2026-08-25
Fix package.json entry points - remove references to files that were never built and declare import/require conditions explicitly
Injected env blob reuse now detects .env source file edits: auto-load and varlock run re-resolve instead of serving stale values when a source file changed since the blob was created
v1.17.0Compare Source
2026-08-18
printenv: new --template flag renders a string template with resolved values (with optional --escape json), e.g. auth headers JSON for an MCP headersHelper
Native local-encryption helper binaries now ship as per-platform optional dependencies (@varlock/native-helper-*), so npm installs only download the binaries for your own platform (on Linux this includes the Windows helper, which WSL needs)
Exit cleanly instead of crashing when CLI output is piped into a consumer that closes early (e.g.
varlock flatten | head -3)Ship the Linux local-encryption helper binaries uncompressed. UPX packing caused antivirus false positives (Defender Wacatac.C!ml) during install.
varlock flatten no longer needs to detect a workspace root - any @import path that resolves on disk is flattened, including in non-JS monorepos
Clearer errors for Windows-style @import/@plugin paths, which are not supported (use forward slashes, or a relative/~ path instead of a drive letter)
Redact sensitive values from Error objects passed to console methods, and fix console redaction of plain objects that could not survive a JSON round-trip (nested errors, circular references, bigints, dates)
v1.16.1Compare Source
2026-08-08
Telemetry now honors the
DO_NOT_TRACKenvironment variable, alongside the existingVARLOCK_TELEMETRY_DISABLEDvar and config file settings.fix
@preventLeakbreaking srvx-based servers (TanStack Start, Nitro) by patching the global Response with a proxy instead of a subclassv1.16.0Compare Source
2026-07-31
varlock/auto-load and varlock run now reuse an injected __VARLOCK_ENV blob instead of re-resolving, when it was resolved in the same directory. Set _VARLOCK_USE_INJECTED_ENV=1 to always trust an injected blob (e.g. handing env into a sandbox with no .env files), or 0 to always re-resolve.
proxy run --url now dials its tunnel through an HTTP proxy (HTTP(S)_PROXY/NO_PROXY), so a sandboxed agent whose only egress is a proxy gateway (e.g. Docker Sandboxes) can reach a broker
varlock proxy reloadno longer requires the schema to resolve in the requesting shell: the proxy validates the edit in its own context before applying and reports failures back, so a remote broker can be reloaded with a bare provider execv1.15.0Compare Source
2026-07-31
--persist-cakeeps a broker's CA across restarts so clients that already trust it keep workingReach the credential proxy from another machine or a remote sandbox, with no external tunnel tool.
varlock proxy start/rungain--expose(optionally--expose=<addr>) to bind off-loopback and serve a built-in CONNECT-over-WebSocket tunnel, so a client behind provider HTTP ingress (E2B, Modal, ...) can route through it. Enabling the tunnel mints a per-session data-plane token that clients must present (pin it withVARLOCK_PROXY_TOKEN), while loopback clients stay exempt and the control endpoint stays loopback-only.varlock proxy run --url <wss-url> -- <command>(with the token inVARLOCK_PROXY_TOKEN, or--token) runs the command through a broker running elsewhere: it opens the tunnel, self-wires the env and CA certs from the broker, and only ever holds placeholders.varlock proxy envalso gains--full(emit the whole child-view env, not just the wiring) with--proxy-url/--cert-dirto repoint it, for wiring a client manually. Newvarlock proxy tokenprints a session's data-plane token, so a minted one can be read back rather than scraped from logs; the startup banner now withholds it unless stdout is a terminal.The install script now verifies the sha256 of the downloaded archive against the release's published checksums.txt, and fails without installing on a mismatch.
v1.14.1Compare Source
2026-07-29
v1.14.0Compare Source
2026-07-28
New
varlock flattencommand: collapses the @import graph into a self-contained directory (rewriting import paths, pinning plugin versions) so a single package can be deployed without the rest of the monorepo, e.g. in Docker buildsProxy: secrets are now substituted into request headers only by default (excluding common forward/log headers like cookie and x-forwarded-), and a placeholder may appear at most once per request. Widen with @proxy(substituteIn=[...]) using targets like header:authorization, path, query:api_key, or body:client_secret (body always needs a path; use body: for bodies that can't be parsed into one), and raise the cap with maxOccurrences. This prevents an injected secret from being swapped into a request body, query, or unintended header where it could be exfiltrated.
Add
@dynamicselector to the--filterlanguage (!@dynamicselects static items). Decorator-based filters (@dynamic/@sensitive/@required) now scope resolution and validation to selected items, so e.g. a build-time--filter='!@dynamic'skips runtime-only vars entirely, including their@requiredchecksvarlock auditignoring@auditIgnoreon schema itemsplugins now work in shell-less/distroless images: tarballs extract natively (no
tar/shell dependency), andvarlock flatten --vendor-pluginscopies plugins into the output for a fully self-contained artifactReduce published package size: build the proxy cert authority from low-level asn1 packages instead of @peculiar/x509, and strip bundled third-party source text from release sourcemaps
proxy client compatibility fixes: minted MITM certs now include subject/authority key identifiers so strict TLS verifiers (python 3.13+ urllib/httpx defaults) accept them; the injected env now sets NODE_USE_ENV_PROXY=1 so Node's built-in fetch (node 24+) routes through the proxy instead of silently bypassing it, and DENO_CERT so Deno trusts the proxy CA; Proxy-Authorization from clients is stripped instead of forwarded upstream
Root decorators (@initAws, etc) now resolve the full dependency chain of items referenced in their args, instead of only the directly referenced items
varlock/envinsteadCache locks left behind by an interrupted run are now reclaimed immediately instead of stalling later runs for several minutes and hiding the real error.
varlock cache clearalso clears locks.Fix proxy MITM certs that occasionally failed to load: roughly 1 in 512 minted certs got a non-minimal DER serial number, which strict TLS parsers reject
v1.13.0Compare Source
2026-07-21
Report load failures to error trackers.
varlock/auto-loadcan now throw the load error (instead of exiting silently) so a reporter like Sentry can capture it. Opt in with aglobalThis._varlockOnLoadErrorhook (called with the error and the values that did resolve), or set_VARLOCK_THROW_ON_LOAD_ERROR=1when a reporter is already initialized. Default behavior is unchanged.Add array and object value types:
@type=array(...)and@type=record(...)with per-element validation, native[a, b]/{k=v}literal values, JSON and separator string input, configurable serialization back to process.env, per-element redaction, and typed code generation across languagesFix refs in the
@cacheroot decorator value (e.g.@cache=if($USE_CACHE, "memory", "disabled")) silently resolving as undefinedResolve dynamic arguments in forEnv(); a forEnv() argument that resolves to undefined is now an error instead of silently comparing against "undefined"
install.sh now installs varlock-local-encrypt.exe on WSL so local encryption can use the Windows TPM/Hello backend (pass --skip-win-exe to opt out)
v1.12.0Compare Source
2026-07-20
#892 (minor) - Add
@generateJavaEnvand@generateCsharpEnvloadable env modules (typed Env, loader, sensitive keys)#780 (patch)
@encryptInjectedEnvis now honored whenvarlock run/varlock proxy runinject the env blob.Previously the setting only applied to the library auto-load path and build-time integrations; the CLI spawn paths injected a plaintext
__VARLOCK_ENVblob and merely forwarded a pre-existing key. In blob-only inject mode (--inject blob), the blob is now encrypted with an ephemeral key carried alongside it, so resolved values never sit in plaintext in the child's environment. This is leak resistance (crash reporters, env dumps, logs), not protection from an attacker who can read the full environment.#780 (patch)
Add
varlock proxy: a local credential proxy for AI agents (preview).Run an agent (or any untrusted tool) through a local MITM proxy so it only ever sees placeholder secrets: real values are injected at the wire (bound to a verified upstream TLS identity), responses are scrubbed back to placeholders, and every request is policy-checked and audited. Mark a secret with
@proxy(domain="api.example.com"); sensitive items are shown to the child as placeholders by default, with@proxy=passthrough/@proxy=omitescape hatches. Route with host/path/method rules (block,approval), set egress with@proxyConfig={egress="strict"}, and hot-reload live policy withvarlock proxy reload. Sessions are durable and auditable (varlock proxy status/rules/audit);proxy startruns a daemon with a live request log that otherproxy runinvocations attach to. Addproxy run --sandboxto run the agent in a sandbox whose only egress is the proxy: a built-in macOS credential + egress jail, or--sandbox=docker(=podman) to run it in a container while your secrets stay on the host. Preview: on its own the proxy is same-uid and raises the bar rather than being a boundary;--sandbox(or a container) is what makes it one. See the proxy guide.#907 (patch)
Fix nested
varlock run: a command-local override (FOO=bar varlock ...) inside a parentvarlock runnow wins over the parent's injected value again, instead of being clobbered by the re-injected env blob.v1.11.0Compare Source
2026-07-15
#873 (minor)
Add
--filterflag toload/runfor selecting env vars by key/glob,@sensitive/@required, or tags (new@tag()item decorator). Also add a matchingfilter=arg to@generate*code-generation decorators, so a single schema can emit multiple generated files scoped to different subsets.#871 (minor)
Add detection for Railway, AWS Amplify, Google Cloud Run, Deno Deploy, Zeabur, and Firebase App Hosting; detect dev sandboxes (CodeSandbox, StackBlitz, GitHub Codespaces, Gitpod, Replit) with isCI: false; add detectRuntime/detectOs and expose them as VARLOCK_RUNTIME/VARLOCK_OS builtin variables.
Also fixes several incorrect env var names found during a std-env doc audit: GitHub Actions PR number (was reading a non-existent variable), GitLab MR number (was using the instance-wide ID instead of the IID), Netlify build URL (double
https://), Semaphore PR number (Classic-only variable), Azure Pipelines PR number (prefers the GitHub-facing number), and Bitbucket repo owner (deprecated variable). Adds repo extraction for Bitrise.A second pass against std-env's actual detection logic found three more real gaps: Vercel and Netlify now report
isCI: falsewhen running their local dev servers (vercel dev,netlify dev) instead of always reporting CI; StackBlitz detection now also requires the WebContainer runtime marker (matching std-env) instead of a weak SHELL-only heuristic that could misfire; anddetectRuntime'sisNodeflag now matches std-env's semantics (staystrueunder Bun/Deno's Node-compat mode).#874 (patch)
Fix:
varlock load --format json-fullno longer includes@internalitems by default (pass--include-internalto opt in for local debugging). Framework integrations shell out to this exact command to get their injected config, so this closes a leak where an@internalsecret-zero credential could reach client/SSR runtime code.#882 (patch)
Docs: clarify that _VARLOCK_ENV_KEY encrypts the injected env blob (not an encrypted() resolver), and drop the stale plugin count from the package README
#884 (patch) - Refuse to write back encrypted values to non-regular source files (FIFO/pipe) with a clear error instead of blocking
v1.10.0Compare Source
2026-07-06
#849 (minor)
Generate code for Python, Rust, Go, and PHP with new per-language decorators (
@generatePythonEnv,@generateRustEnv,@generateGoEnv,@generatePhpEnv). Each emits a self-contained, idiomatic module — typed coerced values, a loader that parses the injected env, and aSENSITIVE_KEYSconstant — so it's usable out of the box. The TypeScript generator moves to@generateTsTypesand gains options to controlprocess.env/import.meta.envaugmentation and a monorepo-friendlyexposeEnv=localmode.@generateTypes(lang=ts)still works as a deprecated alias. Thevarlock typegencommand is renamed tovarlock codegen(withtypegenkept as a deprecated alias). Note:@disableProcessEnvInjectionnow requires a statictrue/falsevalue — env-dependent values likeforEnv(prod)are a schema error, since generated code must not differ per environment.#853 (patch) - Reject unknown or misspelled CLI flags with a did-you-mean suggestion instead of silently ignoring them
#861 (patch)
Runtime leak detection now catches secrets in compressed responses: gzipped responses that fit in a single chunk (i.e. most pages) were never scanned, so browsers — which always send
Accept-Encoding: gzip— could receive leaked sensitive values the scanner should have blocked. Brotli and zstd responses are now scanned too, and compressed chunks containing a leak fail closed (the response is killed) instead of passing through.Note: since most browser traffic previously bypassed the scanner, an app with an existing undetected leak will start seeing those responses blocked after upgrading — look for
DETECTED LEAKED SENSITIVE CONFIGin server logs, which names the offending config key.#861 (patch)
Runtime fixes: env state is now shared across bundled copies of
varlock/env(fixes stale values after env reloads when a bundler duplicates the module, including cleanup ofprocess.envkeys removed between reloads), andnode:cryptois loaded lazily — with encrypted env blobs decrypting via WebCrypto on edge runtimes that lack it entirely (e.g. Vercel Edge). Minimum supported Node version is now 22.3.#854 (patch)
Windows local encryption now uses TPM-sealed keys via NCrypt when available; existing DPAPI keys auto-upgrade on the next decrypt.
#865 (patch)
icon fetching during type generation now ignores failed responses, times out after 2s, and doesn't retry failed icons within a run
#866 (patch)
plugin-registered data types can now declare
coercedTypeso generated env modules type their fields correctly (previously they always emitted as strings)v1.9.0Compare Source
2026-06-25
#835 (minor) - Add
varlock keychaincommands to manage macOS Keychain-backed secrets.#830 (patch)
Improved
auditandinitenv var scanning in monorepos:package.jsonor.env.schemais treated as a separate package and skipped. This fixes spurious results and makes scanning much faster.PATH,HOME,SHELL,NODE_OPTIONS,npm_*, etc.) is no longer reported as "missing in schema" byaudit, nor added to inferred schemas byinit. App-meaningful vars likeNODE_ENVand CI variables are still reported.v1.8.0Compare Source
2026-06-23
varlock cache status/clearare now proper subcommands with scoped help and completion, andprintenv/explain/reveal/scan/auditnow declare their positional arguments so they appear in--helpand shell completion.v1.7.2Compare Source
2026-06-19
varlock typegennow also reports any such ignored keys.Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.