An overview of the latest Varnish Virtual Registry releases, describing feature additions, changes, fixes and removals per version.
Released: 2026-10-22
Varnish version: 6.0.18r6
Artifact Firewall version: 0.8.0
varnish.vcls loads your own VCL programs next to the generated ones. Each has a name, the path of its main VCL file, optional include_paths, and routes that match a host glob, a path glob, or both. The root VCL checks these routes in the order listed, before it routes to a registry, so a VCL can take a path on a registry’s host, and default: true sends a VCL the requests that match nothing else. The .vcl files under the main file’s directory and under each include path are loaded with it, so it can include them by relative path or by name, and it can also include the VCL shipped with Varnish, such as devicedetect.vcl. Edits to those files take effect on the next reload, by SIGHUP or a change to the config files. A file included by absolute path is read in place, so a reload misses an edit to it. Each VCL is loaded under the label label_<name>, so extra_root_vcl can route to it on anything else in the request. It requires the VCL editing feature, and without it the configuration is refused.routes accept ecosystems, a list of package ecosystems (for example [npm, oci]). On its own, an ecosystems route sends those requests to the registry when the Host header matches no registry’s name or glob, before falling back to the default registry. Together with glob in the same route, both must match, and such a route is checked after registry names but before routes with only a glob. The ecosystem is classified the way the registry itself classifies a request, by Accept, User-Agent and then URL, so a client that identifies itself by neither header is routed only when its URL is distinctive. An ecosystem, or an ecosystem with a given glob, can be routed to only one registry.virtual_registry.extra_root_vcl includes your own VCL files at the top of the root VCL, which receives every request before it is routed to a registry. Their subroutines run before the built-in ones, in the order listed, so they can answer or rewrite a request for every registry at once. Like a registry’s extra_vcl, it requires the VCL editing feature, and without it the files are ignored.firewall.remote_address and firewall.remote_api_address send the registries that set enable_firewall to an Artifact Firewall running outside the Supervisor, instead of starting the embedded one. Set them together, as host:port, to the firewall’s proxy address and its api_address. They cannot be combined with firewall.address. The remote firewall must run with deployment: integrated. To have its ruleset reloads purge cached manifests, point its webhook at the Supervisor’s /purgez with method PURGE and header Cache-Tags: resource_manifest, and add its address to virtual_registry.purge.allow.remote_auth.password_file takes the password from a file instead of an environment variable. Varnish reads the file on each injected request, so a password that is rotated on disk, such as an Amazon ECR token that a Kubernetes Secret refreshes, takes effect without a reload. The Varnish worker process must be able to read the file.remote_auth without a username, password_env or password_file injects an Amazon ECR authorization token on a registry whose remote is an <account>.dkr.ecr.<region>.amazonaws.com host, so a private ECR remote no longer needs a token rotated in by hand. The Supervisor requests the token in that region with its own AWS credentials (environment, web identity, or instance or task role), which need ecr:GetAuthorizationToken, and renews it at half its 12-hour lifetime./api/), file downloads (/resolve/) and the Xet protocol that large model and dataset files transfer over, both against huggingface.co directly and through a JFrog Artifactory HuggingFaceML repository, with Artifactory’s Xet setting on or off. Through Artifactory, a client sets HF_ENDPOINT to Orca with the repository’s /artifactory/api/huggingfaceml/<repo> path./readyz answers 503 once the Supervisor starts shutting down, so a load balancer stops sending new traffic while Varnish drains during shutdown_delay. /healthz keeps answering 200 until Varnish exits. Varnish defaults shutdown_delay to 0 and exits at once, so set varnish.params.shutdown_delay to at least the load balancer’s probe interval times its failure threshold. Keep shutdown_delay plus 15 seconds under the unit’s TimeoutStopSec, which is 90 seconds unless the unit sets it.docker pull failing with 503 Backend fetch failed when the client connects over HTTPS and the remote url is plain http://. A remote that builds links to itself from the client’s X-Forwarded-Proto, such as a self-hosted Artifactory, advertised its token realm as https:// on its plain HTTP port, and Varnish fetched the token from there with TLS. A link to the host and port of a configured remote is now fetched with the scheme of that remote’s url.remote_auth credential, or under its auth_policy: ignore with a client’s own credential, being served from the cache through another virtual registry, which may have no access to it. Content-addressed objects in a virtual registry with remote_auth or auth_policy: ignore are now cached per virtual registry, so each is fetched from the remote once more after the upgrade. They are still keyed without the credential, so rotating password_env keeps them. With the sup-auth addon, content-addressed objects fetched anonymously are fetched once more too, so that a persistent store stops serving the ones that an earlier version cached through such a virtual registry.remote_auth on an OCI registry without a token endpoint, such as Amazon ECR or registry:2 with htpasswd. Such a registry asks for Basic auth on /v2/ itself, but the credential was attached only to the token request, so a pull failed with no basic auth credentials. It now goes on every OCI request that carries no bearer token. A Docker client sends its own login only after a challenge, so under if_anonymous a registry that accepts Basic auth on /v2/ no longer challenges it, and the client pulls as the configured account.unknown blob after a layer was deleted from the remote. The OCI blob HEAD existence check was cached for good, so the client skipped uploading a layer the registry no longer held. It is now cached as a manifest, so it is revalidated against the remote on every request, or cached for manifest_ttl when that is set. Like a manifest, it self-routes in a cluster only when manifest_ttl is at least 1s.GET on an upload session was cached as if it were a blob, so a client resuming an interrupted push read the offset from the first answer rather than the remote’s current one. Upload sessions now always go to the remote.Released: 2026-10-08
Varnish version: 6.0.18r5
Artifact Firewall version: 0.7.0
mvn deploy failing with 405 Method Not Allowed on maven-metadata.xml when the firewall is enabled. Uploads now go straight to the remote without involving the firewall, so a deploy of a coordinate a rule denies is no longer refused either. The rule still blocks its download.Released: 2026-10-06
Varnish version: 6.0.18r5
Artifact Firewall version: 0.7.0
varnishlog-json produced, byte for byte. It was previously rebuilt from the parsed transaction, so anything that reads the log body expecting a fixed JSON shape (a collector transform, a log backend’s parser, a saved query) needs to be checked against the new output before upgrading. Values derived from a transaction are now set as attributes on the record, so read them from there rather than from the body.TraceId, SpanId and TraceFlags as string attributes. Every exporter already sets those natively on the record itself, so a backend that reads them from the attributes has to read the record fields instead.SeverityNumber, so a backend can filter and alert on severity.virtual_registry.purge.allow lists the addresses and CIDR ranges allowed to send PURGE /purgez, in addition to localhost. A purge could only come from the node itself, so a Varnish Broadcaster fanning it out to a cluster, or a webhook from the origin, was refused.max_ttl sets a maximum TTL, including for the packages and version-pinned manifests that were cached indefinitely. A longer TTL is lowered to it and the difference is added to keep, so the object is revalidated with a conditional request once it expires. Content-addressed objects are exempt. Objects cached before it is set keep their TTL until they are purged.book_path to a store, which puts its book, the index MSE4 keeps of what is cached, on a device of its own: MSE4 recommends a fast device for the book’s small random IO and a large one for the store’s sequential IO. size then covers the store alone, so give the book a volume holding book_size plus room for a resize. Set on a cache that already exists, it moves the book on the next start, copying it across and delaying that start.varnish.storage is now refused on reload instead of being accepted and ignored. The file devices are laid out before Varnish starts and mkfs.mse4 will not touch them while it is running, so a reload could never apply the change. Restart the Supervisor to apply one: growing a store or adding a new one keeps the cached objects, and only shrinking drops the objects at the tail.fast_304: false on a registry to go back to the standard path, needed only for a remote whose 304 responses carry an updated Cache-Control or Vary.X-Varnish header to remotes.--validate now fails when it is given no configuration file, through --config or SUPERVISOR_CONFIG. It used to check the built-in defaults alone and report them valid, which read as if the operator’s file had been checked.default: true nor any routes now logs a warning, since it answers only hosts that start with its name and anything else gets a 404.--defaults panicking instead of printing the default configuration.Content-Length. It had none when the remote compressed the package on request.THESE PACKAGES DO NOT MATCH THE HASHES after a PyPI file was uploaded again under the same name. Relative file links in an HTML simple index now carry the file’s sha256 in a vs-sha256-<hex> path segment, and the file is cached under it. Lockfiles that record file URLs, such as uv.lock, will contain the segment.Error rather than left Unset with the failure visible only in the span attributes. Errors reported by varnishlog-json also populate error.type and error.message again instead of being dropped.19T. Such a size is now given in gigabytes.size or book_size that validation accepts being rejected when the storage is set up. 20TB, 1.5T and 1 GB now work, rather than failing with invalid size format as Varnish starts.mkfs.mse4 failing with No space left on device on stores of 45G and above. The space held back from size for filesystem metadata was a fixed 1G, but that metadata grows with the volume. It is now 3% of size, with 1G as the floor. Existing stores are resized on upgrade, which drops the objects at the tail of each store.gh) never being cached. Its GitHub CLI User-Agent matched the Git client rule, so its REST and GraphQL requests were parsed as Git requests and failed. Only a git/ User-Agent now classifies a request as Git./api/graphql, which was not recognized as a GitHub endpoint./artifactory/api/cargo/<repo>/index/, which was not recognized, so config.json and the index were passed through and cargo downloaded each crate straight from Artifactory.failed to verify the checksum after a crate was uploaded again under the same version. The download URL in config.json now carries the crate’s sha256 from the index in a vs-sha256-<hex> path segment, and the crate is cached under it. A config.json or crate cached by an earlier version is fetched from the remote again after the upgrade.demo-1.0-SNAPSHOT.jar, for the whole package TTL after a deploy replaced it. A file in a SNAPSHOT version that is named -SNAPSHOT rather than after a build timestamp now takes the manifest TTL, like the .pom of the same deploy, so it is revalidated against the remote on every request unless manifest_ttl is set.Released: 2026-09-11
Varnish version: 6.0.18r4
Artifact Firewall version: 0.6.0
Fixed upgrading varnish-plus on its own leaving Varnish unable to load its VCL, which 0.18.0 introduced. The Supervisor now generates VCL without its Varnish module when the installed Varnish Enterprise cannot load it, and logs that it did. Caching and package classification are unaffected, and Hex requests fall back to the default cache lifetimes until varnish-supervisor is upgraded to a matching build.
Fixed the RPM packages installing the Supervisor’s Varnish module in a directory Varnish Enterprise does not search, which 0.18.0 introduced and which left Varnish unable to load its VCL. It now goes in /usr/lib64/varnish-plus/vmods, so a symlink added to work around this can be removed. Debian packages were never affected.
Released: 2026-09-10
Varnish version: 6.0.18r4
Artifact Firewall version: 0.6.0
cluster.discovery, which finds the cluster’s peers in the environment the Supervisor runs in instead of listing them under cluster.peers. With enabled: true it polls EC2 every 15 seconds and keeps the cluster director in step with the running instances it finds, so a node scaled in or out joins or leaves the cluster without a config change anywhere. aws.tags narrows what counts as a peer, and an Auto Scaling Group deployment should filter on the aws:autoscaling:groupName tag AWS sets for it. Left unset, every running instance in the region is a peer. The node needs ec2:DescribeInstances, with credentials resolved from its instance profile. Discovery replaces peers and peer_group rather than adding to them, and needs the sup-clustering and sup-auth addons plus the vmod-nodes feature in the license.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