Skip to main content

Publishing & Extension Store

Extensions can be bundled, published to the extension store, and installed by other users. This page covers how to prepare your extension for distribution and publish it to the store.


Manifest Fields for Publishing

Several fields in manifest.json are relevant to publishing and store presentation. See the Manifest reference for the full schema.

Store metadata

FieldTypePurpose
namestringDisplay name shown in the store listing.
descriptionstring?Short description shown beneath the extension name in store cards.
authorstring?Author or publisher name displayed on store cards and the detail page.
iconstring?Relative path to an icon image (e.g., "icon.png"). Shown in the store listing.
versionstringSemantic version string (e.g., "1.2.3"). The store uses this to detect available updates.
categoriesstring[]Categories for store filtering. Known values: "Themes", "Languages", "Formatters", "Tools", "Utilities".

Bundle control

FieldTypePurpose
filesstring[]Whitelist of files and glob patterns to include in the bundle. When empty, all files are included (respecting .gitignore).
ignorestring[]Glob patterns for additional files to exclude from the bundle. Applied on top of both .gitignore and the files whitelist.

Bundling

When you publish, your extension project is packaged into a ZIP archive. Understanding how files are selected helps you control what gets shipped.

File selection

File selection follows two stages:

Stage 1 -- Choose candidate files:

  • If manifest.files is non-empty (whitelist mode): only files matching the listed patterns are included.
  • If manifest.files is empty (default mode): all files are included, except those excluded by .gitignore.

Supported patterns in manifest.files:

  • Exact file name -- "manifest.json" matches only that file at the project root.
  • Directory prefix -- "dist/" or "dist" matches all files under the dist/ directory.
  • Glob patterns -- "src/**/*.js" uses gitignore-style glob matching (supports *, **, and ? wildcards).

Stage 2 -- Apply manifest.ignore:

Patterns in manifest.ignore are applied afterwards to exclude additional files, using gitignore-style glob syntax.

Always-excluded directories

The following directories are always excluded from the bundle, regardless of configuration:

EcosystemExcluded directories
JavaScriptnode_modules, bower_components
Dart / Flutter.dart_tool, .pub-cache, ios/Pods, android/.gradle
Python.venv, venv, .tox, .mypy_cache, .pytest_cache
Java / Kotlin.gradle
Rusttarget
Gopkg
PHPvendor
.NET / C#packages

What gets uploaded

In addition to the ZIP archive, the following files are extracted and uploaded separately so the store can display them without downloading the full bundle:

  • manifest.json
  • README.md (if present at root) -- displayed on the store detail page
  • CHANGELOG.md (if present at root) -- displayed on the store detail page

Example configurations

Ship only built output:

{
"files": ["dist/", "manifest.json", "README.md", "icon.png"]
}

Ship everything except tests and source maps:

{
"files": [],
"ignore": ["test/", "**/*.map", "**/*.test.js"]
}

Ship specific file types from src:

{
"files": ["src/**/*.js", "manifest.json"],
"ignore": ["src/**/*.test.js"]
}

Publishing

Publishing is done from within the app. The process has three steps:

  1. Register -- your extension is registered (or updated) on the store using metadata from your manifest.json.
  2. Upload -- the bundle is built and uploaded.
  3. Finalize -- the new version is marked as available in the store.

Progress is shown in the app during each step. If your extension was previously published, publishing a new version automatically updates the existing listing.


Extension Store

The extension store is the in-app marketplace where users discover, install, and manage extensions.

Browsing and discovery

Users can find extensions through:

  • Text search -- filters by name, description, and extension ID.
  • Category filters -- Themes, Languages, Formatters, Tools, Utilities, or All.

Store listing

Your store listing displays:

  • Extension name, description, and author
  • Icon
  • Install count and average rating
  • Categories and version

Detail page

The detail page shows:

  • Full metadata (name, author, version, categories, install count, rating)
  • Your README.md rendered as markdown
  • Your CHANGELOG.md, if available
  • Install / update / uninstall actions
  • A rating widget for authenticated users
tip

Write a good README.md -- it's the main content users see on your extension's detail page.

Installing

Users can install extensions directly from the store with a single tap. If your extension declares permissions, users are shown a notice before installation.

Extensions can also be installed from other sources:

SourceDescription
From ProjectFrom an open project that contains a manifest.json.
From PathFrom a local filesystem path.
From NetworkFrom a URL pointing to a ZIP file.

Updates

When you publish a new version, users with the extension installed will see an "Update" button on the extension card.

Ratings

Authenticated users can rate extensions. Ratings are shown on both the store listing and the detail page.

Size limits

Keep your bundle within these limits:

  • Compressed ZIP: 30 MB
  • Total extracted size: 100 MB
  • Single file: 50 MB