Engineering Journal
Ginexys
Ginexys

VS Code Marketplace Publishing Is Stuck in 2016

2026-06-03

TLDR

While ecosystems like npm, cargo, and pypi have streamlined package publishing into single-command, single-auth workflows (npm publish, cargo publish), publishing to the VS Code Marketplace requires navigating four distinct naming scopes (GitHub user, Azure DevOps org, Publisher ID, Extension Name) and generating Personal Access Tokens (PATs) from a separate Azure DevOps portal.
EcosystemPublishing CommandAuth MechanismNamespace Scoping
npmnpm publishSingle OAuth account loginScoped packages (@scope/pkg)
Cargocargo publishSimple API tokenGlobal crates registry
VS Code Marketplacevsce publishAzure DevOps PAT (Separate Org)Global name collisions across all publishers

Devs must manage four disconnected scopes to publish extensions

Publishing a modern web service or Node package takes seconds. But publishing a VS Code extension suite forces developers to manage four disconnected namespace abstractions:

  1. GitHub user account: Where your source code monorepo lives.
  2. Azure DevOps organization: Required solely to generate a Personal Access Token (PAT) with Marketplace scopes.
  3. Marketplace publisher ID: The public brand identity registered on Visual Studio Marketplace.
  4. Extension package name: A global, unscoped registry identifier.
[1. GitHub User Account] ---> [2. Azure DevOps Org] ---> [3. Publisher ID] ---> [4. Extension name]
   (Monorepo Source)           (Generate PAT Token)        (e.g., ginexys)      (Global Scope / vsce)

Registry-wide name constraints trigger late publishing errors

The most frustrating DX trap in vsce is global package name collisions.

In package.json, setting "name": "core" inside your publisher scope (ginexys) seems natural. However, VS Code Marketplace treats package name fields as globally unique across the entire ecosystem, regardless of your publisher ID.

vsce publish will not tell you the name is taken when you run vsce package. It builds the artifact, begins the upload process, and then fails at the registry endpoint with an uninformative rejection error, forcing you to rename the package, update inter-package manifest references, recompile, and repackage.


Monorepo awareness and OAuth SSO would modernize publishing

To bridge the gap between modern monorepo development and legacy marketplace publishing, extension tooling should natively support:

  1. Monorepo awareness: vsce should auto-detect pnpm-workspace.yaml files and warn developers if .vscodeignore lacks parent traversal exclusions (../).
  2. Automated namespacing verification: vsce verify should test package name availability against Marketplace APIs before compiling artifacts.
  3. Integrated auth protocols: Auth should use standard GitHub or Microsoft OAuth single sign-on without forcing manual Azure DevOps PAT creation.
Rule of thumb: Always prefix your extension name fields with your publisher brand (for example, ginexys-core instead of core) to prevent global registry name collisions on the Marketplace.
Read this post in the full Engineering Journal →