An overview of the latest Varnish Virtual Registry releases, describing feature additions, changes, fixes and removals per version.
Released: 2026-09-10
Varnish version: 6.0.18r4
Artifact Firewall version: 0.6.0
cluster.storage_replicas, which shards persistent storage across the cluster instead of replicating it. A clustered node caches every object it serves in memory and persists it to disk as well, so a cluster of N nodes holds N copies on disk and its usable persistent cache is that of a single node. Setting storage_replicas: 1 keeps each object on disk only on the node that owns it, pooling the whole cluster’s disk into one cache; a higher count keeps that many copies, trading capacity back for redundancy. Unset it stays full replication. Requires the persistence addon and configured varnish.storage.stores..rpm packages and the checksum-named repodata files are cached for the immutable lifetime, repomd.xml revalidates, and where the firewall is enabled repomd.xml and primary.xml are filtered while a .rpm download is authorized per version. Filtering repomd.xml invalidates its signature, so the client needs repo_gpgcheck=0 (per-package gpgcheck=1 keeps working), or firewall.preserve_manifest: true to keep the upstream signature and give up metadata filtering.@v/list is filtered to the versions the ruleset allows, @latest, .info and .mod are gated on the version they resolve to, and a module zip is authorized per version. The checksum database is not a module resource and is untouched.repodata.json is filtered to the packages the ruleset allows, and a .conda or .tar.bz2 download is authorized per version. The two variants the firewall cannot filter, repodata.json.bz2 and CEP-16 sharded repodata, are refused so the client falls back to one it can.--version now carry the revision the binary was built from, as stamped by the Go toolchain, suffixed -dirty for a build off a modified tree. It is omitted when the build carries no stamp./package-reroute endpoint (virtual_registry.package_reroute.enabled, off by default): a network-redirect target for a forward proxy that intercepts outbound traffic to public package registries, such as a Zscaler ZIA rule mirroring JFrog’s Package Traffic Controller. It resolves the upstream host embedded in ?url= against every configured registry’s remotes and re-enters that registry’s normal pipeline..deb is the same build already published for the other Debian-family distributions; it is now uploaded to, and installed and upgraded under, ubuntu/resolute as well.name to a remote (virtual_registry.registries[].remotes[]) and a cluster peer (cluster.peers[]), used in the generated backend/director name instead of a positional index. Both share the same underlying config type, so the fix covers artifactory_dir_N and cluster_dir_N alike. Names are alphanumeric and hyphens only, and must be unique within their list; an unnamed remote or peer keeps the existing positional naming.remote_auth now applies to every package type, not just OCI (Docker/container) registries. For OCI it still targets the /token auth-token exchange; for everything else it is attached to the content request itself, in vcl_recv, and an injected request is classified as its own cache entry rather than preflighted, since the caller’s own credential is not what reaches the remote. That entry is shared by every injected caller and keyed without the credential, so rotating the secret in password_env leaves the cached objects in place instead of invalidating them. policy: always combined with auth_policy: preflight therefore skips the preflight check, which a startup warning now calls out. if_anonymous is unaffected: it still only fills in when the caller sent no credential of its own.INFO is reserved for state changes rather than a line before and another after each one. The license text and its signature are no longer written to the log when they change, and the container image no longer echoes the versions before startup, since the Supervisor reports them itself.virtual_registry.redirects.deny_unknown_hosts not being set. It fired on every configuration that left the option at its default, and writing the default out verbatim was the only way to silence it.varnish-supervisor package now installs a Varnish module, /usr/lib/varnish-plus/vmods/libvmod_vizier.so, which the generated VCL imports. Hex requests are now parsed inside that module. Every other ecosystem is unchanged, and caching behaviour behaves the same regardless of it is parsed by the VMOD. Remaining ecosystems will move across one at a time. A Varnish module is ABI-bound to the exact Varnish Enterprise build it was compiled against, so varnish-plus and varnish-supervisor must now be upgraded together. Upgrading varnish-plus alone leaves Varnish unable to load its VCL.map-stream-0.0.7.tgz came out as version stream-0.0.7. A rule scoped to a version range could deny a version it allows, or allow one it denies.supervisor.log_level and supervisor.log_output only taking effect for the config manager itself on reload. Every other component kept the settings it started with, and a change to log_output silenced them for the rest of the run, since the file they were still writing to had been closed. A reload and a SIGHUP now also wait for the records already on their way into the old file before closing it.acme.domains that swaps one domain for another, rather than adding or removing one, not reaching ACME. The reload applied, but no certificate was requested for the new domain until the Supervisor was restarted.ghcr.io layer pull fail with 400 Missing query parameters..pom files at a released version revalidating against the remote on every request, which cost a round trip per descriptor in a resolve. They are now cached for the immutable lifetime, while .pom files under a -SNAPSHOT version keep revalidating.varnish-supervisor RPM, which never ran. An install only logged a warning, but an upgrade failed the transaction and left both versions recorded as installed. Upgrading from 0.17.0 or earlier still trips on the old package’s own scriptlets: run the upgrade again, then drop the stale record with rpm -e --noscripts varnish-supervisor-<old version> and restart the service.prerm, which runs before anything in the new package does, so there is no state left to preserve.systemctl stop varnish-supervisor leaving the service in a failed state. Varnish was killed outright instead of being asked to stop, which also meant the shutdown_delay and shutdown_close parameters never took effect.varnishadm command was still in flight, which is most likely when the service is stopped shortly after it starts.Released: 2026-08-25
Varnish version: 6.0.18r4
Artifact Firewall version: 0.5.1
.conda / .tar.bz2 packages. The conda, mamba and micromamba clients are recognised.remote_auth to virtual registries, letting operators configure a shared credential (username/password_env) that Orca attaches to outbound requests to the remote on the client’s behalf. Currently only implemented for OCI (Docker/container) registries, targeting the /token auth-token exchange. Inactive until remote_auth.policy is set: always replaces any credential the client sent (so pulls through that registry count against the configured account’s rate limit instead of the upstream’s shared anonymous quota), or if_anonymous, which only fills in when the client sent no credential of its own, leaving an existing one untouched. Not scope-aware, so give the configured credential read-only permissions upstream. Independent of auth_policy, except that it is not valid combined with auth_policy: drop.retry_statuses to virtual registries, the response statuses from a remote that send the fetch to a remote it has not used yet. Valid values are 400-499 except 401 and 407, whose challenges have to reach the client. Set retry_statuses: [] to keep the first remote’s response instead. The retries spend the same max_retries budget as the 5xx and connection retries, so raise that varnishd parameter for a registry with more remotes than it allows./sumdb/<name>/..., so GOPROXY is the only setting a client needs and checksum verification keeps working where the go command has no route to sum.golang.org of its own. Only the two databases the go command ships with are proxied.404 or a 429 against a remote the request has not been sent to yet, so an artifact only one of them holds is still served, and a remote that throttles is spent on one that does not. The client gets the response of the last remote asked. This is the new default for every such registry, configurable per registry with retry_statuses above.vcl.load timing out at a fixed 30 seconds regardless of cli_timeout. Supervisor’s command timeout is now derived from it.Accept. Manifests referenced by digest are unaffected.@latest requests not being recognised as Go, so they were cached as an unknown resource type instead of as a mutable manifest./v2/ segment.Released: 2026-08-04
Varnish version: 6.0.18r3
Artifact Firewall version: 0.4.0
auth_policy option to virtual registries, letting operators skip or actively strip preflight authorization checks on backends that already permit anonymous access. preflight (default) keeps today’s behavior of verifying every request via a HEAD check; ignore skips the check and shares cache with anonymous requests while still forwarding Authorization unchanged to the backend; drop strips Authorization before it ever reaches the backend.auth_token_ttl to virtual registries (default 60s). Orca now caches OCI auth tokens per credential and scope for this window and hands the same bearer token back, keeping the downstream authorization cache key stable so already-cached images keep serving while the upstream registry or its token endpoint is unreachable (the cached token and preflight are revived for up to 1 week). Set auth_token_ttl: 0 to disable and pass token requests straight through. Only active when the Authentication feature is licensed.config.json, the package index, and .crate downloads.repo.hex.pm directly and through a JFrog Artifactory Hex repository. Firewall rules are enforced on the tarball download rather than by filtering the package metadata, which Hex signs and clients verify.supervisor.config_watch, enabled by default with a 15 second interval) or on demand with SIGHUP, and when the change affects the generated VCL, Varnish switches to it atomically without restarting, so the cache survives. Settings that require a restart are refused and leave the running config in place, and under Kubernetes the ConfigMap has to be mounted as a directory rather than with subPath, which is never updated in place.cluster.extra_tokens, a list of additional tokens accepted from peers alongside cluster.token. This lets a cluster token be rotated with a rolling redeploy (stage the new token in extra_tokens, promote it to token, then retire the old value) instead of a coordinated restart of every node at once..jar, .war, .aar, .zip) instead of on the .pom, which now streams through whatever the verdict. A build blocked on a pinned version fails when it fetches the artifact rather than when it reads the descriptor, and a denied version no longer breaks the resolution of builds that never fetch it./redirectz, so with redirects.deny_unknown_hosts enabled the origin’s object host must be listed in redirects.extra_known_hosts.HEAD existence check being cached by digest alone, so a push could skip uploading a layer another repository already cached (unknown blob). HEAD is now keyed by repository; GET stays digest-only and shared.HEAD fix above not surviving a cluster hop, where a self-routed request normalizes to GET on the wire and could collapse back to a digest-only key. A manifest HEAD could also return Content-Length: 0 on the forwarded leg. The original request method now survives the hop and any retry to origin.dns_ttl option, which produced VCL that failed to compile.redirects.deny_unknown_hosts blocks a transparent redirect target. Clients now receive the intended 502 redirect target host not allowed instead of a generic 503.<file>.metadata), which previously bypassed the cache.vulnerability.base.json and vulnerability.update.json), which previously bypassed the cache.401 challenge could carry a relative WWW-Authenticate realm instead of the absolute URL the token specification requires.Released: 2026-07-14
Varnish version: 6.0.18r3
Artifact Firewall version: 0.3.6
manifest_ttl, package_ttl, and other_ttl to virtual registries. manifest_ttl caches mutable manifests for a fixed window instead of revalidating on every request (digest-pinned manifests stay immutable); package_ttl caps the lifetime of immutable packages (mutable packages still revalidate); other_ttl sets the TTL for artifacts not classified as a manifest or package.prometheus exporter is selected via otel.metrics.exporter, Supervisor and Varnish metrics are exposed together on a /metrics scrape endpoint rather than pushed to an OTLP collector. The endpoint address is configurable via otel.metrics.prometheus_host and otel.metrics.prometheus_port (default localhost:9464).otel.metrics.scrape_interval (default 10s) to control how often varnishstat is polled for Varnish counter metrics, independent of the OTLP otel.metrics.export_interval (default 60s) push cadence./v2/ ping endpoint now has 1w keep to enable stale-if-error.Host header dropping a non-standard port when following a redirect to an ad-hoc backend. goto omits the port by default, which broke signed redirects whose signature includes the port (e.g. Artifactory direct-download endpoints). The port is now preserved.info/refs auth preflight using HEAD, which upstreams reject. This did not cause a client-visible error, but did cause a redundant fetch. It now uses GET, matching the git-upload-pack and LFS-batch preflights.Released: 2026-07-01
Varnish version: 6.0.18r2
Artifact Firewall version: 0.3.4
Released: 2026-06-29
Varnish version: 6.0.18r2
Artifact Firewall version: 0.3.2
%2f) in npm scoped package requests so scoped installs like npm install @scope/pkg are correctly identified by the parser.Released: 2026-06-17
Varnish version: 6.0.18r2
Artifact Firewall version: 0.3.2
npm login --auth-type web are no longer misclassified as package requests and blocked.Released: 2026-06-16
Varnish version: 6.0.18r2
Artifact Firewall version: 0.3.2
Released: 2026-06-13
Varnish version: 6.0.18r2
Artifact Firewall version: 0.3.2
redirects.deny_unknown_hosts and redirects.extra_known_hosts to restrict /redirectz upstream hosts and transparent redirect targets to configured remotes and extras./redirectz cache entries being keyed only on the path, so responses fetched from one upstream host could be served on requests targeting a different host at the same path.Released: 2026-06-11
Varnish version: 6.0.18r2
Artifact Firewall version: 0.3.1
POST /graphql) query responses, keyed by request body. Schema introspection queries get a longer TTL, while mutations, subscriptions, and rateLimit queries bypass the cache.preserve_host option to remotes. When enabled, the original request Host header is forwarded to the remote while the connection still targets the remote url. Useful when a single backend routes internally on the Host. Takes precedence over preserve_subdomain.virtual_registry.base_url, a default base URL applied to all registries that do not configure their own base_url.X-Forwarded-Proto: https from an upstream TLS terminator is now honored when auto-detecting the request scheme for base_url. Varnish also sets X-Forwarded-Proto toward the remote when the inbound request was TLS or when the registry’s base_url uses https://.Host header (a bare IPv4/IPv6 literal or localhost, e.g. clients reaching a node by IP or over a local tunnel) now have their Host rewritten to the host of the applicable base_url (registry-specific or global), so they are handled as if they had arrived at the registry’s canonical hostname.base_url.Set-Cookie on JFrog UI and OAuth callback responses, breaking SSO login flows.Released: 2026-06-03
Varnish version: 6.0.18r1
Artifact Firewall version: 0.3.1
disable_cache option to disable artifact caching on a per-registry basis./redirectz URL matrix parameters, emitted as an additional ;sig=... matrix parameter. Enable via virtual_registry.redirects.signing.enabled; the signing key is read from the environment variable named in virtual_registry.redirects.signing.key_env./redirectz endpoint entirely through virtual_registry.redirects.enabled.integrated deployment mode behind Virtual Registry, and now registers manifest transformers for the NuGet and Maven ecosystems in addition to npm and PyPI.otel.endpoint configuration that sets OTEL_EXPORTER_OTLP_ENDPOINT, used by all signals when no signal-specific endpoint is configured. The OTLP SDK auto-appends /v1/<signal> for HTTP protocols.firewall.address was omitted from config.fsnotify on user-provided certificates so that they are reloaded when files change on disk.Released: 2026-05-11
Varnish version: 6.0.17r3
Artifact Firewall version: 0.2.2
cache_req_body_limit to set the maximum request body size to buffer for cacheable POSTs (e.g. git-upload-pack).agent and session-id telemetry attributes are excluded from the cache key.Released: 2026-04-21
Varnish version: 6.0.16r13
arm64.base_url, enabling caching of both dist archive downloads and source repository clones./redirectz endpoint./v2/ ping endpoint to 60s.arm64 Varnish packages available for these distributions, and no customers currently relying on them.Released: 2026-04-13
Varnish version: 6.0.16r13
varnish-supervisor packages for Debian Trixievarnish-supervisor packages for RHEL 10Released: 2026-03-23
Varnish version: 6.0.16r13
--validate flag which validates the config and exits.Released: 2026-03-12
Varnish version: 6.0.16r13
base_url to either http:// or https:// without a domain now determines the scheme of client redirects. This is useful for deployments where the Virtual Registry is deployed behind a TLS terminating proxy, especially when preserve_subdomain is used for the Virtual Registry remotes.Released: 2026-03-05
Varnish version: 6.0.16r12
dns_ttl option to remotes. This can be used to override the DNS resolution interval indicated by DNS records.routes option to virtual registries. A route is a glob pattern (fnmatch) that enables more flexible registry routing, where only subdomain-based routing was available before. The subdomain routing still has the highest order of precedence, with routes being matched against the Host header in order of appearance.preserve_subdomain option to remotes. When used, the incoming subdomain (final component) is appended to the remote Host header when fetching from the remote. The final hostname is also used for DNS and TLS SNI.readonly option to virtual registries. When enabled, all uploads to the virtual registry are blocked.download_url in manifests with the Virtual Registry base_url.base_url.preserve_manifest option to virtual registries. When enabled, base_url insertion into manifests is disabled.Released: 2026-02-27
Varnish version: 6.0.16r12
Released: 2026-02-23
Varnish version: 6.0.16r10
Added OTEL logs support via the otel.logs configuration block. Logs are exported to a configurable OTLP endpoint and do not require a license.
Added configurable trace sampling via the otel.tracing.sampler configuration option. Supported samplers: always_on, always_off, traceidratio, parentbased_always_on, parentbased_always_off, parentbased_traceidratio. Ratio-based samplers accept an otel.tracing.sampler_arg value between 0.0 and 1.0.
Added a cache invalidation yKeys for resource types. All objects now get a resource_manifest, resource_package or resource_other key.
Added base_url option to the virtual registry configuration. This is used whenever the proxy needs to rewrite a response header or body to direct the client back to the virtual registry.
Added policy for proxying JFrog UI.
Added dns_ttl option to remotes. When set, this option overrides the DNS resolution interval for the remote, ignoring DNS record TTLs.
Upgraded varnish-otel to v2.2.0, which adds trace sampling and OTEL logs support.
Remote endpoints are now resolved preemptively in vcl_backend_fetch using utils.resolve_backend(). The Host header is explicitly set based on the remote URL Host. This should not produce a noticeable change.
Improved cache policy for NPM traffic. All /-/ endpoints are now marked uncacheable. Manifests are now always marked as must-revalidate, meaning they are not cached, but coalesced and candidates for 304 revalidation and stale-if-error.
Added stricter checking for undefined configuration options. This should make it easier to catch typos in the YAML config.
The WWW-Authenticate response header is now transparently rewritten when it directs the client to a different domain than the effective base_url. The original URL is preserved and used when the client comes back to authenticate. This enables auth when the upstream registry is not directly accessible by the client.
For 202 Created responses, the Location header is also rewritten in the same fashion as WWW-Authenticate. This enables OCI uploads when the upstream registry is not directly accessible by the client.
Fixed varnish-otel failing to find Varnish shared memory when workdir is not explicitly configured.
Fixed retrying requests when the load balancer has no remaining healthy and unused backends available.
Fixed a beresp.ttl + req.ttl interaction that resulted in objects marked as must-revalidate not being considered for 304 revalidation and stale-if-error.
Fixed an issue where OCI uploads would fail with a 404 because the registry returns different responses for HEAD and GET. HEAD requests from OCI clients are now proxied through without a lookup in cache.
Fixed IPv6 client IPs not being considered local for cache invalidation access.
Released: 2025-12-17
Varnish version: 6.0.16r8
varnish-plus is released. Each varnish-supervisor release targets a specific minimum version of Varnish, but it should be possible to use a newer version of varnish-plus than the minimum version.Released: 2025-12-01
Varnish version: 6.0.16r7
Released: 2025-12-01
Varnish version: 6.0.16r7
Released: 2025-11-27
Varnish version: 6.0.16r7
book_size to tune the size of persisted storage books.default_ttl, default_grace, and default_keep options for Virtual Registries to override the global varnish.params with the same name. Like the global params, these only apply to responses that don’t have an explicit cache policy or Cache-Control header from the remote registry.varnish.storage has changed. While this technically a breaking change, it’s a licensed feature that has not been put in production anywhere yet. We saw this as an opportunity to do some final polish on the config format without introducing a real breaking change.varnish.storage subsystem. The MSE configuration should now be changed to reflect changes in the storage configuration in all cases.Released: 2025-11-14
Varnish version: 6.0.16r6
*.whl, *.tar.gz, and *.zip objects are now cached indefinitely while */simple/* is explicitly treated as uncacheable./etc/varnish now has the correct varnish owner in Docker.maven-metadata.xml is explicitly treated as uncacheable.Released: 2025-11-04
Varnish version: 6.0.16r4