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
| Field | Type | Purpose |
|---|---|---|
name | string | Display name shown in the store listing. |
description | string? | Short description shown beneath the extension name in store cards. |
author | string? | Author or publisher name displayed on store cards and the detail page. |
icon | string? | Relative path to an icon image (e.g., "icon.png"). Shown in the store listing. |
version | string | Semantic version string (e.g., "1.2.3"). The store uses this to detect available updates. |
categories | string[] | Categories for store filtering. Known values: "Themes", "Languages", "Formatters", "Tools", "Utilities". |
Bundle control
| Field | Type | Purpose |
|---|---|---|
files | string[] | Whitelist of files and glob patterns to include in the bundle. When empty, all files are included (respecting .gitignore). |
ignore | string[] | 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.filesis non-empty (whitelist mode): only files matching the listed patterns are included. - If
manifest.filesis 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 thedist/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:
| Ecosystem | Excluded directories |
|---|---|
| JavaScript | node_modules, bower_components |
| Dart / Flutter | .dart_tool, .pub-cache, ios/Pods, android/.gradle |
| Python | .venv, venv, .tox, .mypy_cache, .pytest_cache |
| Java / Kotlin | .gradle |
| Rust | target |
| Go | pkg |
| PHP | vendor |
| .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:
- Register -- your extension is registered (or updated) on the store using metadata from your
manifest.json. - Upload -- the bundle is built and uploaded.
- 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, orAll.
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
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:
| Source | Description |
|---|---|
| From Project | From an open project that contains a manifest.json. |
| From Path | From a local filesystem path. |
| From Network | From 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