Verdaccio 7 Release Notes
[!IMPORTANT] This release note is maintained from merged PRs. It focuses on changes users, plugin authors, and downstream distributions need to know about for Verdaccio 7.
New Compared With 6.x
Verdaccio 7 is mainly a platform and distribution major. Compared with 6.x, the important differences are:
- Express 5 is now the runtime baseline, so middleware plugins may need route wildcard and
sendFileadjustments. - Node.js 24 is the minimum supported runtime for this line.
- Verdaccio 7 uses an explicit release rollout: install with
verdaccio@7, npmlatestmoves a few days later, and Docker publishes explicit version tags without Dockerlatestduring the initial rollout. - The release branch moved to pnpm and the published package layout is built around reusable
@verdaccio/*packages. The dual ESM/CJS package output was also backported to 6.x via #6050. - Downstream distributions can reuse the server and CLI composition instead of forking, including custom
Storageintegration. - Storage plugins can move to the promise-based async API, while existing callback/stream-based storage plugins remain supported through a compatibility wrapper.
- Config loading is stricter: YAML-only config files and
configPathinstead of the deprecatedself_path. - Deprecated registry/runtime APIs were removed, including old AES helpers and star/unstar support.
- Logger packages were consolidated into
@verdaccio/logger.
Some user-facing work listed below has already been backported to 6.x, including dual ESM/CJS package output, package filtering, publish/unpublish notification hooks, WebUI login 401 handling, the external e2e CLI workflow, and Web UI improvements delivered through the shared @verdaccio/ui-theme package.
What's Included
Runtime And Platform
- BREAKING feat: upgrade to Express 5 (#5524) - by @juanpicado
- BREAKING chore(deps): update Node.js to v24 (#5615, #5637) - by @renovate
- feat: migrate to
@verdaccio/proxybased ongot(#5646) - by @juanpicado - feat: replace
got-cjsandnode-fetchwithgotv14 (#5746) - by @juanpicado - chore: map uplink tarball HTTP errors to Verdaccio errors instead of leaking raw
goterrors;401becomes unauthorized,403preserves upstream forbidden details,404becomes not found, and other upstream statuses become bad uplink status errors (#6022) - by @mbtools
Build And Tooling
- BREAKING feat: replace Babel/esbuild with Vite dual-format builds (#5643) - by @juanpicado. Dual ESM/CJS package output was backported to 6.x via #6050.
- feat: migrate package management and CI from Yarn to pnpm (#5748) - by @juanpicado
- chore: replace the old e2e CLI workspace with
@verdaccio/e2e-cli(#5678, #5679) - by @juanpicado. Backported to 6.x via #5675. - chore: replace deprecated Vite
rollupOptionsusage withrolldownOptions(#5676) - by @mbtools - chore: generate corrupted package fixtures at runtime so tooling no longer scans invalid
package.jsonfiles (#5864) - by @juanpicado
Configuration
- feat(config): extend
ConfigBuilderwith methods for web, listen, https, publish, flags, notify, middlewares, filters, maxBodySize, userRateLimit, urlPrefix, and i18n (#5805) - by @juanpicado - BREAKING feat: remove deprecated
self_pathconfig property in favor ofconfigPath(#5850) - by @juanpicado - BREAKING feat: only accept YAML config files (
.yaml/.yml) (#5851) - by @juanpicado - fix: handle missing Host header in URL basename resolution (#5641) - by @juanpicado
Web And UI
- feat(ui): replace Rematch with React context and SWR, add dark mode support, refresh auth pages, and add contributors/support content to the info dialog (#5563) - by @juanpicado
- feat(web): add
web.assetFolderfor files served under/-/assets/(#5653) - by @mbtools - feat(web): sort packages by update time (#5659) - by @mbtools
- fix(web): search component improvements for path-based queries, scoped package decoding, local-only search clicks, empty states, and responsive tabs (#5647) - by @juanpicado
- feat(web): auto-detect the search response shape in the Web UI and remove the old
searchRemoteflag (#5801) - by @juanpicado - feat(web):
@verdaccio/ui-themeis now shared by the 6.x and 7.x lines, so compatible Web UI fixes and improvements can continue landing in both release lines. - BREAKING fix(api): remove the deprecated npm search
/-/allendpoint from Verdaccio 7; clients should use/-/v1/search. - fix(api): rate limit and bound the npm
/-/v1/searchendpoint, including clamped pagination, batched package access checks, and npm-compatible search result metadata. Backported to 6.x via #6005 - by @juanpicado. - fix(ui-components): JSON viewer fixes (#5651) - by @mbtools
- chore(middleware): move UI options from inline script to
/-/static/ui-options.js(#5684) - by @mbtools
API, Storage, And Distribution
- refactor: use ESM-style
lodash-esimports across packages (#5751) - by @juanpicado - feat: support pure ESM plugins through the async plugin loading path and CJS/ESM interop in storage/plugin loading - by @juanpicado
- refactor:
@verdaccio/node-apino longer depends on@verdaccio/serverdirectly and expects the server factory from the caller (#5758) - by @juanpicado - BREAKING fix: the programmatic API is now async; consumers must
await runServer(...)before calling.listen()(#5808) - by @juanpicado - chore: export server composition and CLI helpers for downstream distributions (#5932) - by @juanpicado
- feat: support the async promise-based storage API while keeping legacy callback/stream-based storage plugins backward compatible through a thin wrapper (#5933) - by @juanpicado
Logging
- BREAKING feat: combine
@verdaccio/logger-commonsand@verdaccio/logger-prettifyinto@verdaccio/logger(#5657) - by @juanpicado
Documentation
- docs: add Docker examples for Verdaccio 7, including reverse proxy, plugin, and Kubernetes Helm examples (#5936) - by @juanpicado
- docs: prepare the Verdaccio 7 release documentation PR (#6065) and the Helm chart release PR (verdaccio/charts#198).
Backported To 6.x
These are included in the 7.x line, but they are not unique Verdaccio 7 features because they were also backported to 6.x.
- feat: publish dual ESM/CJS package output (#5643 - by @juanpicado). Backported to the 6.x branch via #6050 - by @juanpicado; not included in a published 6.x npm release yet as of
6.8.0. - feat: add package filter plugin (#5548 - by @vsugrob). Backported to 6.x via #5786 - by @juanpicado; included since
[email protected]. - feat: add publish/unpublish notification hooks (#5920 - by @mbtools). Backported to 6.x via #6020 - by @juanpicado; included since
[email protected]. - fix: remove Basic auth challenge from WebUI login 401 responses (#5819 - by @juanpicado). Backported to 6.x via #5821 - by @juanpicado; included since
[email protected]. - fix: rate limit and bound the npm
/-/v1/searchendpoint. Backported to 6.x via #6005 - by @juanpicado; included since[email protected]. - chore: enable the external e2e CLI workflow (#5678, #5679 - by @juanpicado). Backported to the 6.x branch via #5675 - by @juanpicado; first 6.x npm release after the branch change was
[email protected]. - Web UI updates through the shared
@verdaccio/ui-themepackage are available to both 6.x and 7.x when compatible, including the UI state-management refresh (#5563), search UI fixes (#5647), JSON viewer fixes (#5651), and search response auto-detection (#5801). Verdaccio 6.x picked these up through@verdaccio/ui-themeupdates such as #5794 ([email protected],@verdaccio/[email protected]), #5822 ([email protected],@verdaccio/[email protected]), #5961 ([email protected],@verdaccio/[email protected]), and #6003 ([email protected],@verdaccio/[email protected]), and the package will continue receiving regular UI improvements.
Breaking Changes
Express 5
Verdaccio now runs on Express 5. If you use custom middleware plugins, be aware of these changes:
- Route wildcards use
{*all}syntax instead of*;req.paramsmay return arrays instead of strings. - The
sendpackage handles dotfile detection differently on absolute paths; plugins usingres.sendFile()with absolute paths should switch tores.sendFile(filename, { root }). http-errorsno longer accepts non-error status codes, such as304, without a warning.
Build System
The build pipeline moved from Babel/esbuild to Vite 8. Packages now publish dual ESM and CJS outputs with TypeScript declarations.
- Package
exportsfields changed; update deep imports to supported entry points. - ESM is the primary format; CJS remains available for compatibility.
Logger Consolidation
@verdaccio/logger-commons and @verdaccio/logger-prettify were merged into @verdaccio/logger.
- import { ... } from '@verdaccio/logger-commons';
- import { ... } from '@verdaccio/logger-prettify';
+ import { ... } from '@verdaccio/logger';Relocated Plugins
The following plugins were relocated from the monorepo to their own repositories:
verdaccio-active-directoryverdaccio-aws-s3-storage- moved to verdaccio/verdaccio-aws-s3-storageverdaccio-google-cloud- moved to verdaccio/verdaccio-google-cloud
Node.js Requirement
- Minimum Node.js version is now Node.js 24.
crypto.pseudoRandomBytes, removed in Node.js 24, was replaced withcrypto.randomBytes.
Release Rollout
- BREAKING / RELEASE PROCESS Verdaccio 7 is published under the explicit
7tag first. It will not become the npmlatestdist-tag immediately; thelatesttag will move a few days later after the release has had time to settle. - Docker images are published with explicit version tags such as
7or an exact version. Dockerlatestis not published for this release line during the initial rollout. - Helm users should pin the Verdaccio 7 image tag explicitly. The chart release is tracked in verdaccio/charts#198.
Configuration Loading
- Config files must be YAML (
.yaml/.yml). JSON and JS config loading was removed. - New server options:
server.dotfilescontrols requests to dotfile paths (deny|ignore|allow; defaultdeny).server.hideStaticLogssuppresses/-/static/request logging; defaulttrue.
Removed Registry APIs
- BREAKING feat: remove deprecated AES encryption helpers (#5744) - by @juanpicado
- BREAKING feat: remove star/unstar support because npm 12 removed it on the client side (#5930) - by @juanpicado
- BREAKING the deprecated npm search
/-/allendpoint was removed in Verdaccio 7. Use/-/v1/search; Verdaccio 6.x still keeps/-/allas deprecated.
Programmatic API
- BREAKING
runServer(...)is now async and returns aPromise. Consumers using Verdaccio as a Node.js module mustawait runServer(...)before using the returned server/app. - BREAKING
config.self_pathwas removed from the programmatic config surface; useconfig.configPath.
- const app = runServer(config);
+ const app = await runServer(config);
app.listen(4873);Plugin Loading
- Verdaccio 7 supports pure ESM plugins through async plugin loading and CJS/ESM interop. Plugin authors can publish ESM-only plugins, but should still verify package
exports, default exports, and async initialization behavior against Verdaccio 7. - Storage plugins can use the async promise-based storage API. Existing callback/stream-based storage plugins are detected and wrapped for backward compatibility, so existing storage integrations should continue working while plugin authors migrate. Dedicated migration documentation is still pending.
Dependency Upgrades
- fix(deps): update dependency express to v5 (#5622) - by @renovate
- chore(deps): update Vite to v8.0.16 for security fixes (#5970) - by @renovate
- chore(deps): update Vite to v8.1.0 (#6000) - by @renovate
- fix(deps): update core Verdaccio dependencies (#5742 - by @renovate; #5954, #5955, #6001 - by @github-actions)
- fix(deps): update dependency
lodash-esto v4.18.1 for security fixes (#5860) - by @renovate
Try It Out
Install Verdaccio 7 from npm:
npm install -g verdaccio@7Or run it with Docker:
docker run -it --rm --name verdaccio -p 4873:4873 verdaccio/verdaccio:7Please report any issues at https://github.com/verdaccio/verdaccio/issues.
Contributors
Additional Contributions
[!NOTE] PRs without the
7.x branch (next)label.
- feat: migrate to Vite 8 (#5633) - by @juanpicado [ui, maintenance]
- feat: static files returning 404 after Express 5 upgrade (#5639) - by @juanpicado [config]
- chore: update Vitest to 4.1.0 and coverage tooling (#5656, #5662) - by @juanpicado, @mbtools [maintenance]
- chore: remove old plugins (#5665) - by @juanpicado [maintenance]
- fix(middleware): stream is not readable (HTTP 500) (#5655) - by @mbtools [express, middleware]
- chore: update deps for tools/helpers (#5664) - by @mbtools [maintenance]
- chore: update Open Collective avatars (#5658) - by @mbtools [readme, maintenance]
- chore: fix Vite config for search-indexer (#5663) - by @mbtools [maintenance]
- chore(types): replace self-reference and remove unused type (#5661) - by @mbtools [maintenance]
Source: verdaccio/verdaccio