Repository navigation
Releases: eclipse-openvsx/openvsx
Release list
v1.3.0
This release of Open VSX consists of:
Deploying the server application is documented in the Wiki.
Server
Added
- Add fine-grained admin permissions (#2269)
- Configurable extension size limits with namespace overrides, bounded by
ovsx.publishing.max-override-size(#2287, #2303) - Backfill download events from access logs (#2228)
- Prompt anonymous visitors to log in on the reviews tab (#2148)
- Add a Caches page to the admin dashboard (#2203)
- Time-series download analytics, kept off extension pages until an admin switches them on, so a registry can backfill its download history first (#2134, #2340)
- Give download analytics its own time-series database; the registry starts and keeps serving while it is unreachable, and log files are kept until their events are stored (#2133, #2336)
- Scope personal access tokens to a namespace or an extension, and add publishing-only tokens (#2296)
- Publish a
SettingsChangedEventafter the site settings change (#2316) - Serve runtime settings a deployment registers as its own
WritableSettingbeans on/admin/settings, and on/api/-/settingswhen they are aPublicSetting, as camelCase properties named after their row keys (#2340) - Expose the download size of each target platform as
downloadSizeson the extension API response (#2168) - Add a consistency check that finds and repairs extensions whose stored average rating or review count differs from their active reviews, see #2327 (#2328)
- Add
GET /admin/analytics/status, which reports whether download analytics is enabled and reachable and how many log files wait for it, for the admin dashboard (#2337) - Record the CI run behind a trusted-publishing upload when the token carries it: GitHub's
job_workflow_ref,run_idandworkflow_sha, GitLab'spipeline_id,job_idandsha(#2283)
Changed
- Upgrade: migration
V1_78makesextension_version.published_by_idNOT NULLand stops the server from starting if a row is stillNULL. Versions published before 1.2.0 without a recorded token have no publisher to backfill, so checkSELECT count(*) FROM extension_version WHERE published_by_id IS NULLreturns 0 before upgrading (#2276) /vscode/gallery/extensionqueryloads only the versions it returns instead of every active version of each matched extension, pre-releases included (#2161)- Accept the personal access token via an Authorization: Bearer header (#2209)
Fixed
- Refuse the trusted publishing endpoints that create or delete a trusted publisher or issue a publish token while the registry is read-only (#2339)
- Match secret detection rules case-sensitively unless the rule has an inline
(?i), which stops mixed-case words such asAsiakasdokumentaatiobeing flagged as AWS keys, see #2329 (#2330) - Keep polling async scanners through transient errors, confirm an error status on a second poll before failing a scan, and treat every non-2xx scanner response as an error (#2307)
- Compare trusted-publishing claims case-insensitively, like the rest of its checks (#2282)
- Un-deprecate extensions removed from the extension-control file (#2261)
- Report a namespace rename on the registry changes feed (#2246)
- Resolve extension resources for the target platform VS Code asks for (#2183)
- Scope the legacy token lookup to version-0 rows (#2247)
- Prevent duplicate active reviews from concurrent requests (#2245)
- Make extension control fail-safe and bound its HTTP timeouts (#2242)
- Delete upstream-proxied spool file even if the client aborts (#2241)
- Repair and stop re-corrupting extensions' stale last-updated date (#2231)
- Evict the local caches by key prefix too, instead of guessing (#2222)
- Evict caches once the transaction has committed (#2220)
- Clear extension caches by pattern where Redis can, as intended (#2219)
- Fix infinite recursion in entity
equals/hashCode, namespace logo uploads to local storage, a malformed customer CIDR aborting the IP address cache rebuild, and the missing-files job on versions without a download file (#2189)
Dependencies
- Bump jOOQ from 3.19.37 to 3.19.39 (#2187, #2255)
- Update other dependencies to newer patch versions (#2255)
- Bump tika to 3.3.2 (#2240)
- Remove unused
jaxb-apiandjaxb-impldependencies (#2317)
Web UI
Added
- Show the download size of each target platform's package next to its name on the extension detail page, from the new
downloadSizesfield ofExtension(#367) - Add an "Errors" tab to the scan admin page, where an admin can activate extension versions whose scan ended in an error that retrying cannot resolve. The Allowed Files and Blocked Files tabs move to positions 5 and 6, and their
tabURL parameter values are unchanged (#2315) - Add fine-grained admin permissions: a user can hold individual admin capabilities instead of the all-or-nothing admin role, and reaches the dashboard with only the pages those capabilities cover (#2269)
- Add an "Access Control" admin dashboard page, where a user's role and permissions are assigned together and applied on Save; both move here from Publisher admin (#2269)
- Export
hasPermissionandhasAnyAdminAccess, so a deployment with its own menu content can gate an admin entry the way the built-in menu does (#2269) - Export
useInView(withViewportObserverContextto drive it in tests),useRegistryValueanduseReportedQuery, so custom pages can defer work until visible, read server config and report query errors the way the built-in pages do (#2333) - A contributed
adminPagesentry can declare thepermissionit needs; without one it stays admin-only, as it was while the whole dashboard required that role (#2269) - Add a "Caches" page to the admin dashboard, with per-cache hit/eviction stats and a way to clear one or all without restarting the server (#2203)
- Add a "Download Analytics" page to the admin dashboard's Maintenance section, showing whether the analytics database is reachable, since when and why not, and how many log files wait for it (#2337)
- Add a weekly downloads card to the extension detail page, with a hoverable sparkline of the year's weekly totals (#2135)
- Add a configurable site banner to the admin dashboard's Settings page, with a Markdown message, severity, a live preview of what visitors will see and an opt-out for showing it again to everyone who dismissed it, served from
/api/-/settings(#2256) - Prompt anonymous visitors to log in on an extension's reviews tab, where "Write a Review" was previously blank (#2148)
- Add a default max extension size field to the admin dashboard's Settings page, backed by a new
max-extension-sizeruntime setting; falls back to the server's configuredovsx.publishing.max-content-sizeuntil an admin sets it explicitly, and cannot be raised past the server'sovsx.publishing.max-override-sizeceiling (#2129) - Add a "Size overrides" page to the admin dashboard for managing per-namespace and per-extension upload size limits...
Frontend Library v1.3.0
Added
- Add a
/publishpage and turn the navbar's Publish button into a drop target: a file drag anywhere in the app turns the button into a drop area, and every.vsixpackage dropped on it — or on the publish page's own drop area — is queued and uploaded straight away, with no confirmation dialog. The page shows the queue as a line of extension cards — a skeleton while a package uploads, the real card once the registry accepts it, labelled with whatever the registry did with it — and keeps polling anything left under review or still missing its icon - Export
PublishButton, which carries the publish link, itspshortcut and the app's.vsixdrop target in one component, so a deployment with its own menu content keeps drag-and-drop publishing - Add a "Data Consistency" page to the admin dashboard (#1622): a live overview of every registered consistency check's finding count, with actions to refresh it and to fix findings one at a time or all at once
- Show a "Namespace not verified" state on an extension card when it can't be activated because its namespace already exists in a referenced external gallery and hasn't been verified, in both the "My Extensions" and namespace member extension lists. The card keeps its colour and takes a warning-toned frame and icon, since this is the publisher's to fix rather than an extension that is simply switched off
- Show a warning notice with a claim action wherever an unverified namespace is holding something back — the extension settings page when the extension has a namespace ownership conflict, and the namespace settings page for any unverified namespace — making clear the namespace must be claimed (verified) first. The action is the deployment's configured
elements.claimNamespace, falling back to the namespace access documentation when none is configured. The admin dashboard's extension and namespace views show the same explanation without the claim action, since claiming is the publisher's action to take, not an admin's on someone else's behalf - Add a "Search Index" page to the admin dashboard: which engine answers searches, how many extensions the index holds against how many it is built from, and a button to rebuild it where there is an index to rebuild. The two counts sit side by side because an index that has quietly lost entries answers searches perfectly well, just with nothing in them, which is indistinguishable from an empty registry unless both numbers are visible at once
- Mark a version that was published through a trusted publishing workflow with an icon next to "Published by" on the extension detail page, linking to the deployment's trusted publishing documentation. The default deployment points that link at the Trusted Publishing wiki page
- Add a
Pillcomponent — the clickable glass pill the category pills are built on, now usable on its own — and extract theMonoSlash,glassSurfaceandcompactControlpage primitives out of the search field, the pills and the search header - Add
userLoadingtoMainContext, so custom pages can tell "not logged in" from "still resolving the user" - Add a
userMenuContentslot toPageSettings.elements: extra entries for the logged-in account menu, rendered above the admin entry. The slot receives aMenuEntrycomponent to build entries with, so each entry is styled by the menu it appears in — the desktop and mobile menus style theirs differently, and a consumer cannot match both on its own - Add an
adminPagesslot toPageSettings.elements: extra admin dashboard pages, each declaring a name, icon, optional description and optional category, and each appearing in the side panel, as a card on the dashboard overview and as a route. Contributions are additive — a category name matching a built-in group appends to it, and a page whose path would shadow a built-in one is ignored - Widen the published API for consumers building their own pages: the request layer (
sendRequest,sendNonRetriableRequest,ErrorResponse,controllerFromSignal),MainContext,AppProviders,NotFound,createDefaultThemewith theMONO_FONT/NAVBAR_HEIGHTtokens, thecreateRoute/createAbsoluteURL/addQuery/formatCompactNumber/toRelativeTimeutils, theuseDebouncedCallbackanduseGridCursorhooks, the navbar-chrome, search-focus and page-search-bar hooks, the category icon helpers,ExtensionDetailRoutes, and theitemIcon/MenuItemTextbuilding blocks foruserMenuContententries
Changed
- Redesign the user settings: a sidebar (a pill strip below
md) navigating profile, access tokens, trusted publishers, extensions and rate limiting, with the user's namespaces listed alongside it and each one deep-linkable at/user-settings/namespaces/:namespace. Every view is rebuilt on the cards, grids, placeholders and theme shape tokens the rest of the site uses, and the namespace detail is now a single component shared with the admin dashboard - Revoking a single access token asks for confirmation first, like every other destructive action
- Present the unsigned publisher agreement on the access tokens page as a warning notice with a link to sign it, instead of a plain paragraph
- Mark a removed extension version in red across its row — version number, status pill and timeline dot — and disable its delete action. Every version of a rejected extension is marked too, and "Latest" is reserved for extensions the registry actually serves, so one that is inactive or removed has no version marked latest
- Publish from the navbar's Publish button, the
pshortcut and the settings Extensions tab through the new publish page, replacing the one-file-at-a-time publish dialog - Add an
outlinedWarningstyle toMuiButton, so a warning-toned outlined button follows the theme like the secondary and error ones instead of MUI's default half-opacity border - Breaking:
elements.claimNamespacenow receives{ namespace, extension?, sx? }instead of{ extension, sx? }. The namespace settings page offers the same claim action and has no extension to pass, so implementations must read the namespace fromnamespacerather thanextension.namespace - Publishing goes through TanStack Query:
publishExtensionandcreateNamespaceare mutation hooks (usePublishExtension,useCreateNamespace), and both service methods lose theirAbortControllerparameter — writes are no longer aborted, and retries are the query client's to own. The user's extension list is a query too (useUserExtensions), read by the settings tab and by the publish queue as it follows a package, so a card appears in the list as soon as the registry has the package ExtensionCardaccepts anExtensionas well as aSearchEntry, and takes optionalto,linkState,overlay,footerStart,dimmed,toneandiconPendingprops so other surfaces can reuse it instead of copying it- Show an extension card's rating as one star and the score rather than five stars, and no rating at all on an extension nobody has reviewed. Five icons could not shrink, so beside a long download count the count spilled out of the card
- Rename
ScrollToToptoScrollRestoration, matching what it does on back/forward navigation - Rename the extension tint context to
navbar-chrome-contextand add a second channel to it: a page with sections pinned under the navbar can extend the navbar's blur fan down to back them (useExtendNavbarBlur) - Give Popover and Autocomplete popups the same floating-paper treatment as the other menus, and stop Popovers locking body scroll — the lock jumps the scroll position on mobile and shifts the pinned chrome
Fixed
- Fix a React warning ("Received
truefor a non-boolean attributenotched") from the admin dashboard's publisher role filter, whose customInputBasedoesn't consume thenotchedprop MUI'sSelectinjects for the (unused) outlined variant - Fix the admin dashboard Scan tab getting stuck on the loading spinner after switching tabs, even though the new tab's data had already loaded successfully
- Fix the page jumping to the top whenever a menu, select or dialog opens.
- Fix the extension detail page's download menu so each target-platform option is clickable across its whole row, not just its text: the option was an inline link nested inside a non-interactive menu item, rather than the menu item itself being the link
- Fix
sendRequestre-enabling fetch-retry's own retries for the request that follows a 429 wait, because the recursive call didn't forward the originalretryflag. AsendStrictRequest/sendNonRetriableRequestcall that hit a 429 could end up having its follow-up request retried twice - once by fetch-retry and once by the query client - Fix the create-namespace dialog acting on Enter when its button is disabled: an empty or over-long name was submitted anyway, and a held key sent the request more than once
- Fix
isErrorcounting an emptyerrorstring as an error, and make it andisSuccessanswer anullresponse body instead of throwing on it (typeof null === 'object'). The registry aggregates per-version outcomes when deleting extension versions, so a delete where every version succeeded answered with an empty error next to the success message - which raised an error dialog with nothing in it
Dependencies
- Remove the
react-dropzonedependency; the publish page and the navbar's drop target handle their own drag events, and nothing else imports it - Remove nine dependencies that nothing imports:
clsx,prop-typesandpunycodefrom the runtime dependencies, and@types/d3-scale,@types/d3-shape,@types/prop-types,@types/punycode,@types/react-transition-groupandts-nodefrom the development ones. All but@types/punycodeandts-nodestay in the tree through MUI or the URL parsers that actually use them, so only those two leave the install - Bump express from `4.22...
CLI v1.3.0
Added
- Add
--follow-symlinkstopublish, forwardingvsce's option of the same name so that the file walk recurses into symlinked directories instead of packing each symlink as a file. Needed for anode_modulesassembled out of symlinks, as pnpm's is (#368) - Add
searchcommand to search the registry for extensions, mirroring the web UI's search:--category,--target,--sort-byand--sort-ordernarrow the query,--sizeand--offsetpage through the results, and--jsonprints the registry's raw response (#2154) - Add
listcommand to print the extensions a namespace holds, sorted by name so the output stays stable across registries, with--jsonfor the raw namespace metadata (#2154) - Add
showcommand to print an extension's metadata, mirroringvsce show: identity, publisher, rating, notices and a version history listing each version's target platforms (#2149).namespace.extension@versionreports a single version,--targetscopes the report to one target platform,--all-versionslists every published version instead of the most recent few, and--jsonprints the registry's raw metadata - Add
unpublishcommand to delete an extension or some of its versions, mirroringvsce unpublish(#1958); requires a registry running version 1.2.0 or later, whichunpublishchecks for before deleting publishchecks the packaged extension's size against the limit reported by the registry's/api/versionendpoint before uploading, instead of failing only after the upload completes (#1953)- Add
verifycommand to check a downloaded.vsixpackage's signature against the registry's public key, mirroringvsce verify-signature(#993) - Add
verify-signaturecommand, verifying an already-extracted package/manifest/signature file trio entirely offline (no registry involved), matchingvsce verify-signature's own command shape (#993)
Fixed
-
Error messages naming a URL no longer include its query string, which for
createNamespace,verifyPat,publishanddeletecarried the personal access token straight to stderr and into CI logs (#2186) -
A connection lost after a JSON response has started no longer leaves the command waiting on a body that is not coming: the response's own error is now what settles the request, so it fails with the reset rather than hanging (#2186)
-
Requests now give up after 30 seconds without progress instead of hanging indefinitely when a server accepts a connection and then says nothing.
OVSX_TIMEOUToverrides the duration in milliseconds andOVSX_TIMEOUT=0disables it; it measures inactivity, so a large extension downloading slowly is unaffected, and it covers the trusted-publishing ID token request as well as the registry's own (#2186) -
Fix downloads that could be read before they were written.
downloadresolved when the response ended rather than when the file was closed, and a write stream opens and flushes asynchronously, so a caller reading the path immediately afterwards could find the file empty or absent - whichverifydid, intermittently failing to read the public key it had just fetched. A failed download no longer touches the target path: the body is written beside it and renamed into place only once it has arrived whole, so a 404 or a dropped connection leaves what was there alone. A connection dropped mid-download now rejects rather than leaving the caller waiting forever (#2185)
Changed
createNamespace,verifyPat,publishanddeletenow send the personal access token primarily via anAuthorization: Bearerheader (or, whenOVSX_USERNAME/OVSX_PASSWORDare set, anX-OpenVSX-Tokenheader, sinceAuthorizationis then already in use for Basic auth to a fronting proxy), moving away from atokenquery parameter that gets recorded in server and reverse-proxy access logs. The CLI checks the registry's reported version (/api/version) and only still sends the token as a query parameter, alongside the header, when talking to a registry older than 1.3.0, i.e. one that predates header support - including one whose version can't be determined at all, which is treated as too old rather than assumed to be caught up; on 1.3.0 and later the header is all it sends (#1344)publish --trusted-publishingretries the token exchange when the registry answers that it could not verify the ID token (502, 503, 504), rather than failing the build on a blip reaching the identity provider. A refusal is never retriedpublish --trusted-publishingrequests a new token and retries once when the registry refuses the one it was publishing with. The issued token is short-lived and shared by every target platform of a release, so publishing a wide fan-out of large packages could outlive it and fail partway through. Targets that are refused together share one new token, and a token supplied with--patis never retried- Bump minimum supported Node.js version to 22, matching the webui component
Dependencies
- Bump fast-uri from 3.1.5 to 3.1.7
- Bump qs from 6.15.2 to 6.16.0
- Bump @humanfs/node from 0.16.6 to 0.16.8
- Bump js-yaml from 4.3.1 to 4.3.2
- Bump nanoid from 3.3.16 to 3.3.18
v1.2.0
This release of Open VSX consists of:
Deploying the server application is documented in the Wiki.
What's Changed
🏕 Features
- fix: configure /openvsx context path for OpenShift deployment and fix test extension publish paths by @svor in #2080
- fix: get rid of most build warnings by @cstamas in #2085
- fix: clear scan admin loading spinner once fresh data lands after a tab switch by @netomi in #2084
- feat: Trusted Publishing support (#1980) by @netomi in #2000
- feat: add a Data Consistency admin page (#1622) by @netomi in #2086
- feat: add unpublish command to cli by @netomi in #2032
- feat: check max extension size in publish before uploading by @netomi in #2087
- feat: user settings overhaul by @gnugomez in #2091
- fix: limit decompressed size when serving vscode/unpkg web resources by @netomi in #2060
- feat: verified check scanner by @cstamas in #2074
- feat: store filesizes for each FileResource by @netomi in #2089
- Delete migration_item rows once their job completes by @netomi in #2092
- Tolerate missing storage objects in the file-size backfill by @netomi in #2094
- Backfill file sizes per extension version instead of per file resource by @netomi in #2095
- Throttle migration item scheduling to avoid crowding out real jobs by @netomi in #2096
- feat: some user-settings ajustments by @gnugomez in #2097
- fix: keep scroll position on scroll lock by @gnugomez in #2101
- refactor: clarify namespace vs. per-publisher verification checks by @netomi in #2103
- fix: guard scan recovery on startup with a Postgres advisory lock by @netomi in #2104
- refactor: remove unused methods from RepositoryService and repository layer by @netomi in #2105
- feat(cli): add verify and verify-signature commands by @netomi in #2107
- feat: detach tokens from extension versions by @cstamas in #2065
- chore: upgrade springdoc-openapi to 3.1.0 for Spring Data 4 compatibility by @netomi in #2112
- test: narrow the Spring context for tests that don't need the full application by @netomi in #2113
- Rework prerelease limit SQL by @cstamas in #2106
- feat: publish extensions overhaul by @gnugomez in #2098
- refactor: handle error results in sendStrictRequest by @gnugomez in #2109
- Trusted publishing changes by @netomi in #2114
- chore: remove unused methods from RepositoryService by @netomi in #2117
- fix: add /publish and /search to default frontend routes by @netomi in #2118
- chore: regenerate jooq classes by @netomi in #2119
- fix: read the real namespace and extension ids out of a lateral join by @netomi in #2120
- feat: add a search index page to the admin dashboard by @netomi in #2121
- fix: do not reference a one-time token from the version it published by @netomi in #2122
- fix: stop adding to the inverse versions collection when publishing by @netomi in #2123
- fix: keep a type on the rate limit headers under OpenAPI 3.1 by @netomi in #2124
- feat: let one trusted publishing token publish every target platform by @netomi in #2125
- fix: stop treating an empty error string as an error result by @gnugomez in #2128
- feat: limit TPT tokens to publishing only by @cstamas in #2127
- chore: replace the redis cluster in docker-compose with valkey by @netomi in #2140
- build: update Spring Boot to 4.0.8 by @netomi in #2141
- fix: keep generated token bodies free of - and _ by @netomi in #2142
- chore: add a Makefile for common development tasks by @netomi in #2144
- chore: remove codeql and sonar workflows by @netomi in #2147
- chore: drop the qs resolution and nine unused dependencies by @netomi in #2146
- feat: widen the webui library surface for consumers building their own pages by @netomi in #2130
- chore: add scripts to scrub and import partial db dumps by @netomi in #2110
- fix: align the Kubernetes ConfigMap with the Spring Boot 4 properties by @netomi in #2158
- refactor: call the access token hash secret a pepper, not a salt by @netomi in #2159
- feat(cli): add a show command by @netomi in #2153
- feat(cli): add search and list commands by @netomi in #2154
- refactor: stop using EntityManager.merge to obtain managed entities by @netomi in #2150
- refactor: replace the remaining EntityManager.merge updates with find by @netomi in #2151
- build(deps): bump js-yaml from 4.3.1 to 4.3.2 by @svor in #2160
- fix: default personal_access_token.version and .type by @netomi in #2166
- feat(cli): forward vsce's --follow-symlinks, and document the pnpm story by @netomi in #2169
- fix: stop signing a package from allocating several times its size by @netomi in #2170
- feat: add an admin statistics dashboard by @netomi in #2156
- fix: serve the public API's CORS headers whatever ovsx.webui.url says by @netomi in #2173
- chore: update spotless by @cstamas in #2176
- fix(webui): stop the download count spilling out of the extension card by @netomi in #2178
- feat: show what a search result's score is made of in the admin dashboard by @netomi in #2179
- feat: keep access tokens valid across a pepper change by @netomi in #2162
- tool: generate configuration properties reference by @cstamas in #2145
- fix: make the documented docker compose command work by @netomi in #2182
- fix(cli): resolve a download once the file is written, not when the response ends by @netomi in #2185
- fix(cli): give up on a request that stops making progress by @netomi in #2186
- fix: apply the search boosts the text query is written to apply by @netomi in #2174
- fix: weigh download counts on a log scale by @netomi in #2175
- docs: say that a comment should not recount the bug it fixed by @netomi in #2180
- fix: enforce the targetPlatform values the API documents by @netomi in #2181
- docs: move the deployment documentation into the repository by @netomi in #2191
- docs: split the configuration reference out of the deployment guide by @netomi in #2192
- build: check that doc/configuration.md documents the properties the server binds by @netomi in https://github....
Frontend Library v1.2.0
Added
- Add a
/publishpage and turn the navbar's Publish button into a drop target: a file drag anywhere in the app turns the button into a drop area, and every.vsixpackage dropped on it — or on the publish page's own drop area — is queued and uploaded straight away, with no confirmation dialog. The page shows the queue as a line of extension cards — a skeleton while a package uploads, the real card once the registry accepts it, labelled with whatever the registry did with it — and keeps polling anything left under review or still missing its icon - Export
PublishButton, which carries the publish link, itspshortcut and the app's.vsixdrop target in one component, so a deployment with its own menu content keeps drag-and-drop publishing - Add a "Data Consistency" page to the admin dashboard (#1622): a live overview of every registered consistency check's finding count, with actions to refresh it and to fix findings one at a time or all at once
- Show a "Namespace not verified" state on an extension card when it can't be activated because its namespace already exists in a referenced external gallery and hasn't been verified, in both the "My Extensions" and namespace member extension lists. The card keeps its colour and takes a warning-toned frame and icon, since this is the publisher's to fix rather than an extension that is simply switched off
- Show a warning notice with a claim action wherever an unverified namespace is holding something back — the extension settings page when the extension has a namespace ownership conflict, and the namespace settings page for any unverified namespace — making clear the namespace must be claimed (verified) first. The action is the deployment's configured
elements.claimNamespace, falling back to the namespace access documentation when none is configured. The admin dashboard's extension and namespace views show the same explanation without the claim action, since claiming is the publisher's action to take, not an admin's on someone else's behalf - Add a "Search Index" page to the admin dashboard: which engine answers searches, how many extensions the index holds against how many it is built from, and a button to rebuild it where there is an index to rebuild. The two counts sit side by side because an index that has quietly lost entries answers searches perfectly well, just with nothing in them, which is indistinguishable from an empty registry unless both numbers are visible at once
- Mark a version that was published through a trusted publishing workflow with an icon next to "Published by" on the extension detail page, linking to the deployment's trusted publishing documentation. The default deployment points that link at the Trusted Publishing wiki page
- Add a
Pillcomponent — the clickable glass pill the category pills are built on, now usable on its own — and extract theMonoSlash,glassSurfaceandcompactControlpage primitives out of the search field, the pills and the search header - Add
userLoadingtoMainContext, so custom pages can tell "not logged in" from "still resolving the user" - Add a
userMenuContentslot toPageSettings.elements: extra entries for the logged-in account menu, rendered above the admin entry. The slot receives aMenuEntrycomponent to build entries with, so each entry is styled by the menu it appears in — the desktop and mobile menus style theirs differently, and a consumer cannot match both on its own - Add an
adminPagesslot toPageSettings.elements: extra admin dashboard pages, each declaring a name, icon, optional description and optional category, and each appearing in the side panel, as a card on the dashboard overview and as a route. Contributions are additive — a category name matching a built-in group appends to it, and a page whose path would shadow a built-in one is ignored - Widen the published API for consumers building their own pages: the request layer (
sendRequest,sendNonRetriableRequest,ErrorResponse,controllerFromSignal),MainContext,AppProviders,NotFound,createDefaultThemewith theMONO_FONT/NAVBAR_HEIGHTtokens, thecreateRoute/createAbsoluteURL/addQuery/formatCompactNumber/toRelativeTimeutils, theuseDebouncedCallbackanduseGridCursorhooks, the navbar-chrome, search-focus and page-search-bar hooks, the category icon helpers,ExtensionDetailRoutes, and theitemIcon/MenuItemTextbuilding blocks foruserMenuContententries
Changed
- Redesign the user settings: a sidebar (a pill strip below
md) navigating profile, access tokens, trusted publishers, extensions and rate limiting, with the user's namespaces listed alongside it and each one deep-linkable at/user-settings/namespaces/:namespace. Every view is rebuilt on the cards, grids, placeholders and theme shape tokens the rest of the site uses, and the namespace detail is now a single component shared with the admin dashboard - Revoking a single access token asks for confirmation first, like every other destructive action
- Present the unsigned publisher agreement on the access tokens page as a warning notice with a link to sign it, instead of a plain paragraph
- Mark a removed extension version in red across its row — version number, status pill and timeline dot — and disable its delete action. Every version of a rejected extension is marked too, and "Latest" is reserved for extensions the registry actually serves, so one that is inactive or removed has no version marked latest
- Publish from the navbar's Publish button, the
pshortcut and the settings Extensions tab through the new publish page, replacing the one-file-at-a-time publish dialog - Add an
outlinedWarningstyle toMuiButton, so a warning-toned outlined button follows the theme like the secondary and error ones instead of MUI's default half-opacity border - Breaking:
elements.claimNamespacenow receives{ namespace, extension?, sx? }instead of{ extension, sx? }. The namespace settings page offers the same claim action and has no extension to pass, so implementations must read the namespace fromnamespacerather thanextension.namespace - Publishing goes through TanStack Query:
publishExtensionandcreateNamespaceare mutation hooks (usePublishExtension,useCreateNamespace), and both service methods lose theirAbortControllerparameter — writes are no longer aborted, and retries are the query client's to own. The user's extension list is a query too (useUserExtensions), read by the settings tab and by the publish queue as it follows a package, so a card appears in the list as soon as the registry has the package ExtensionCardaccepts anExtensionas well as aSearchEntry, and takes optionalto,linkState,overlay,footerStart,dimmed,toneandiconPendingprops so other surfaces can reuse it instead of copying it- Show an extension card's rating as one star and the score rather than five stars, and no rating at all on an extension nobody has reviewed. Five icons could not shrink, so beside a long download count the count spilled out of the card
- Rename
ScrollToToptoScrollRestoration, matching what it does on back/forward navigation - Rename the extension tint context to
navbar-chrome-contextand add a second channel to it: a page with sections pinned under the navbar can extend the navbar's blur fan down to back them (useExtendNavbarBlur) - Give Popover and Autocomplete popups the same floating-paper treatment as the other menus, and stop Popovers locking body scroll — the lock jumps the scroll position on mobile and shifts the pinned chrome
Fixed
- Fix a React warning ("Received
truefor a non-boolean attributenotched") from the admin dashboard's publisher role filter, whose customInputBasedoesn't consume thenotchedprop MUI'sSelectinjects for the (unused) outlined variant - Fix the admin dashboard Scan tab getting stuck on the loading spinner after switching tabs, even though the new tab's data had already loaded successfully
- Fix the page jumping to the top whenever a menu, select or dialog opens.
- Fix the extension detail page's download menu so each target-platform option is clickable across its whole row, not just its text: the option was an inline link nested inside a non-interactive menu item, rather than the menu item itself being the link
- Fix
sendRequestre-enabling fetch-retry's own retries for the request that follows a 429 wait, because the recursive call didn't forward the originalretryflag. AsendStrictRequest/sendNonRetriableRequestcall that hit a 429 could end up having its follow-up request retried twice - once by fetch-retry and once by the query client - Fix the create-namespace dialog acting on Enter when its button is disabled: an empty or over-long name was submitted anyway, and a held key sent the request more than once
- Fix
isErrorcounting an emptyerrorstring as an error, and make it andisSuccessanswer anullresponse body instead of throwing on it (typeof null === 'object'). The registry aggregates per-version outcomes when deleting extension versions, so a delete where every version succeeded answered with an empty error next to the success message - which raised an error dialog with nothing in it
Dependencies
- Remove the
react-dropzonedependency; the publish page and the navbar's drop target handle their own drag events, and nothing else imports it - Remove nine dependencies that nothing imports:
clsx,prop-typesandpunycodefrom the runtime dependencies, and@types/d3-scale,@types/d3-shape,@types/prop-types,@types/punycode,@types/react-transition-groupandts-nodefrom the development ones. All but@types/punycodeandts-nodestay in the tree through MUI or the URL parsers that actually use them, so only those two...
CLI v1.2.0
Added
- Add
--follow-symlinkstopublish, forwardingvsce's option of the same name so that the file walk recurses into symlinked directories instead of packing each symlink as a file. Needed for anode_modulesassembled out of symlinks, as pnpm's is (#368) - Add
searchcommand to search the registry for extensions, mirroring the web UI's search:--category,--target,--sort-byand--sort-ordernarrow the query,--sizeand--offsetpage through the results, and--jsonprints the registry's raw response (#2154) - Add
listcommand to print the extensions a namespace holds, sorted by name so the output stays stable across registries, with--jsonfor the raw namespace metadata (#2154) - Add
showcommand to print an extension's metadata, mirroringvsce show: identity, publisher, rating, notices and a version history listing each version's target platforms (#2149).namespace.extension@versionreports a single version,--targetscopes the report to one target platform,--all-versionslists every published version instead of the most recent few, and--jsonprints the registry's raw metadata - Add
unpublishcommand to delete an extension or some of its versions, mirroringvsce unpublish(#1958); requires a registry running version 1.2.0 or later, whichunpublishchecks for before deleting publishchecks the packaged extension's size against the limit reported by the registry's/api/versionendpoint before uploading, instead of failing only after the upload completes (#1953)- Add
verifycommand to check a downloaded.vsixpackage's signature against the registry's public key, mirroringvsce verify-signature(#993) - Add
verify-signaturecommand, verifying an already-extracted package/manifest/signature file trio entirely offline (no registry involved), matchingvsce verify-signature's own command shape (#993)
Fixed
-
Error messages naming a URL no longer include its query string, which for
createNamespace,verifyPat,publishanddeletecarried the personal access token straight to stderr and into CI logs (#2186) -
A connection lost after a JSON response has started no longer leaves the command waiting on a body that is not coming: the response's own error is now what settles the request, so it fails with the reset rather than hanging (#2186)
-
Requests now give up after 30 seconds without progress instead of hanging indefinitely when a server accepts a connection and then says nothing.
OVSX_TIMEOUToverrides the duration in milliseconds andOVSX_TIMEOUT=0disables it; it measures inactivity, so a large extension downloading slowly is unaffected, and it covers the trusted-publishing ID token request as well as the registry's own (#2186) -
Fix downloads that could be read before they were written.
downloadresolved when the response ended rather than when the file was closed, and a write stream opens and flushes asynchronously, so a caller reading the path immediately afterwards could find the file empty or absent - whichverifydid, intermittently failing to read the public key it had just fetched. A failed download no longer touches the target path: the body is written beside it and renamed into place only once it has arrived whole, so a 404 or a dropped connection leaves what was there alone. A connection dropped mid-download now rejects rather than leaving the caller waiting forever (#2185)
Changed
publish --trusted-publishingretries the token exchange when the registry answers that it could not verify the ID token (502, 503, 504), rather than failing the build on a blip reaching the identity provider. A refusal is never retriedpublish --trusted-publishingrequests a new token and retries once when the registry refuses the one it was publishing with. The issued token is short-lived and shared by every target platform of a release, so publishing a wide fan-out of large packages could outlive it and fail partway through. Targets that are refused together share one new token, and a token supplied with--patis never retried- Bump minimum supported Node.js version to 22, matching the webui component
Dependencies
- Bump fast-uri from 3.1.5 to 3.1.7
- Bump qs from 6.15.2 to 6.16.0
- Bump @humanfs/node from 0.16.6 to 0.16.8
- Bump js-yaml from 4.3.1 to 4.3.2
- Bump nanoid from 3.3.16 to 3.3.18
v1.1.2
This release of Open VSX consists of:
Deploying the server application is documented in the Wiki.
What's Changed
🏕 Features
- fix(test): smoke tests broken by search UI redesign by @gnugomez in #2069
- feat: removing extension overview sidebar intermediate state by @gnugomez in #2072
- fix: restore response compression for VS Code Gallery API JSON responses by @netomi in #2073
- bug: consume request body before sending response by @cstamas in #2066
- feat: Add GDPR endpoint to openvsx admin API by @autumnfound in #1982
- build: Update check script by @cstamas in #2046
- Add SBOM generation workflows for docker, gradle and yarn by @lukpueh in #1999
- fix: handle non-absolute URLs in ExtensionValidator by @netomi in #2077
👒 Dependencies
- build(deps): bump the github-actions group with 6 updates by @dependabot[bot] in #2063
New Contributors
Full Changelog: v1.1.1...v1.1.2
Frontend Library v1.1.2
Added
- Add a "Forget user" action to the admin dashboard's publisher details, calling the GDPR erasure endpoint
Fixed
- Fix the extension overview sidebar overlapping the readme content at narrower ("tablet") window widths: there are now only mobile and desktop layouts, with tablet widths using the desktop layout (#2068)
v1.1.1
This release of Open VSX consists of:
Deploying the server application is documented in the Wiki.
What's Changed
🏕 Features
- fix: add validation for file resource name collisions by @netomi in #2036
- fix: use non-generic jackson serializers for various caches by @netomi in #2037
- fix: dependency detection on actual id rather by name alone by @netomi in #2038
- deps: Bump jOOQ to 3.19.37 by @cstamas in #2040
- Deps: Bump Jetty to 12.1.12 by @cstamas in #2043
- fix: review of the jooqRepository classes by @cstamas in #2044
- fix: make revoking of publisher contributions more resilient by @netomi in #2050
- fix: revert to jackson 2.x default behavior for primitives types by @netomi in #2052
- fix: restore custom error handling by @netomi in #2053
- fix: webui build on s390x and ppc64le by @netomi in #2054
- chore(deps): remove unused @mui/base dependency by @netomi in #2058
- fix: use jackson 2 compatible mapper for extensionquery by @netomi in #2061
- fix: cap pre-release versions returned by extensionQuery by @netomi in #2062
👒 Dependencies
- build(deps): bump the github-actions group with 4 updates by @dependabot[bot] in #2033
- build(deps): bump postcss from 8.5.22 to 8.5.25 in /webui by @dependabot[bot] in #2042
- build(deps): bump fast-uri from 3.1.4 to 3.1.5 in /cli by @dependabot[bot] in #2041
- build(deps): bump dompurify from 3.4.12 to 3.4.13 in /webui by @dependabot[bot] in #2055
- build(deps): bump js-yaml from 4.3.0 to 4.3.1 in /cli by @dependabot[bot] in #2056
Full Changelog: v1.1.0...v1.1.1
Frontend Library v1.1.1
Fixed
- Fix the WebUI build failing on s390x and ppc64le: use postcss instead of lightningcss (no ppc64le binary) for CSS, and bump vite for the Rolldown big-endian sourcemap fix (#2051)
- Fix the admin publisher revoke dialog prompting for an Eclipse login even when the target publisher's agreement status is
noneor could not be determined (nothing confirmed to revoke)
Dependencies
- Remove the unused
@mui/basedependency; it is deprecated upstream (replaced by@base-ui/react) and nothing in the codebase imports from it - Bump socks from
2.8.3to2.8.9 - Bump ip-address from
9.0.5to10.4.0 - Bump postcss from
8.5.22to8.5.25 - Bump vite from
8.1.5to8.2.1 - Bump dompurify from
3.4.12to3.4.13 - Bump js-yaml from
4.3.0to4.3.1 - Bump react-router from
7.18.1to7.18.2
