Publishing Guide
How to publish and share your Volt extensions
Publishing Your Extension
Learn how to package and publish your Volt extensions to share with the community.
Distribution Method
Volt extensions are distributed as ZIP files via GitHub Releases. The official registry tracks available extensions and their download URLs.
Prerequisites
Before publishing, ensure your extension:
- Has a unique
idin kebab-case (e.g.,password-generator) - Includes a valid
manifest.json - Follows best practices
- Has been thoroughly tested locally
- Includes a README with usage instructions
Extension Package Structure
manifest.json Configuration
Every extension must have a manifest.json at the root:
{
"id": "my-awesome-extension",
"name": "My Awesome Extension",
"version": "1.0.0",
"description": "A brief description of what your extension does",
"author": {
"name": "Your Name",
"github": "yourusername",
"email": "you@example.com"
},
"main": "index.ts",
"icon": "assets/icon.png",
"category": "utilities",
"keywords": ["keyword1", "keyword2"],
"repository": "https://github.com/yourusername/my-extension",
"homepage": "https://your-extension-site.com",
"license": "MIT",
"minVoltVersion": "0.4.0",
"permissions": ["clipboard"]
}Required Fields
| Field | Description | Example |
|---|---|---|
id | Unique identifier (kebab-case) | "password-generator" |
name | Display name | "Password Generator" |
version | Semantic version | "1.0.4" |
description | Short description | "Generate secure passwords" |
main | Entry point file | "index.ts" |
Optional Fields
| Field | Description | Values |
|---|---|---|
author | Author info | { name, github?, email? } |
icon | Icon path | "assets/icon.png" |
category | Category for registry | productivity, utilities, development, media, social, finance, games, other |
keywords | Search keywords | ["password", "security"] |
prefix | Trigger prefix | "gh" (triggers on gh: or gh ) |
minVoltVersion | Minimum Volt version | "0.4.0" |
permissions | Required permissions | ["clipboard", "filesystem", "network", "shell", "notifications"] |
repository | Source repo URL | "https://github.com/user/my-ext" |
license | License identifier | "MIT" |
files | Files to package | ["index.ts", "utils/"] |
Packaging Your Extension
Use the official CLI tool to validate and package your extension:
# Install the CLI
npm install -g @voltlaunchrr/plugin-cli
# Validate your extension
volt-plugin test
# Package and generate registry entry
volt-plugin publishThis creates a {id}-v{version}.zip file and outputs the registry entry JSON to add to registry.json.
Prepare Your Files
Ensure all necessary files are in your extension directory:
my-extension/
├── manifest.json # Required
├── index.ts # Entry point (from manifest.main)
├── types.ts # Type definitions
├── README.md # Documentation
└── utils/ # Supporting files
└── helpers.tsCreate ZIP Archive
Package your extension as a ZIP file with the naming convention:
{extension-id}-v{version}.zipExample: password-generator-v1.0.4.zip
Compress-Archive -Path .\my-extension\* -DestinationPath .\my-extension-v1.0.0.zipcd my-extension
zip -r ../my-extension-v1.0.0.zip .Important
The ZIP should contain files at the root level, NOT inside a folder.
When extracted, manifest.json should be directly accessible.
Test Your Package
Before publishing, test that your ZIP works:
- Extract the ZIP to a test folder
- Verify
manifest.jsonis at the root - Verify all files referenced in the manifest exist
Publishing to GitHub Releases
Create a GitHub Repository
Create a new repository for your extension on GitHub.
git init
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/yourusername/my-extension.git
git push -u origin mainCreate a Git Tag
Tag your release with the version:
# Tag format: {extension-id}-v{version}
git tag my-extension-v1.0.0
git push origin my-extension-v1.0.0Create GitHub Release
- Go to your repository on GitHub
- Click Releases → Create a new release
- Select your tag (e.g.,
my-extension-v1.0.0) - Set release title:
My Extension v1.0.0 - Add release notes describing changes
- Upload your ZIP file as a release asset
- Publish the release
Your download URL will be:
https://github.com/yourusername/my-extension/releases/download/my-extension-v1.0.0/my-extension-v1.0.0.zipAutomated Releases with GitHub Actions
Create .github/workflows/release.yml to automate releases:
name: Release Extension
on:
push:
tags:
- "*-v*"
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Get extension info
id: info
run: |
echo "id=$(jq -r '.id' manifest.json)" >> $GITHUB_OUTPUT
echo "version=$(jq -r '.version' manifest.json)" >> $GITHUB_OUTPUT
- name: Create ZIP
run: |
zip -r ${{ steps.info.outputs.id }}-v${{ steps.info.outputs.version }}.zip . \
-x ".git/*" -x ".github/*" -x "node_modules/*"
- name: Create Release
uses: softprops/action-gh-release@v1
with:
files: ${{ steps.info.outputs.id }}-v${{ steps.info.outputs.version }}.zip
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}Submitting to the Official Registry
To make your extension discoverable in Volt's extension browser:
Add Your Extension to registry.json
Edit registry.json and add your extension:
{
"version": "1.0.3",
"lastUpdated": "2026-04-14T04:45:00Z",
"extensions": [
// ... existing extensions (github, notion, password-generator) ...
{
"manifest": {
"id": "my-extension",
"name": "My Extension",
"version": "1.0.0",
"description": "A brief description",
"author": {
"name": "Your Name",
"github": "yourusername"
},
"main": "index.ts",
"prefix": "my",
"category": "utilities",
"keywords": ["keyword1", "keyword2"],
"minVoltVersion": "0.4.0",
"permissions": ["clipboard"]
},
"downloadUrl": "https://github.com/yourusername/my-extension/releases/download/my-extension-v1.0.0/my-extension-v1.0.0.zip",
"downloads": 0,
"stars": 0,
"verified": false,
"featured": false,
"createdAt": "2026-04-16T12:00:00Z",
"updatedAt": "2026-04-16T12:00:00Z"
}
]
}Registry entry fields:
| Field | Description |
|---|---|
manifest | Complete manifest.json object |
downloadUrl | GitHub release download URL (.zip or .tar.gz) |
downloads | Download count (starts at 0) |
stars | User star count |
verified | Security-reviewed by maintainers |
featured | Promoted in the Extension Store |
createdAt | Submission date (ISO 8601) |
updatedAt | Last update date (ISO 8601) |
Submit a Pull Request
Create a PR with your changes. Include:
- Link to your extension repository
- Brief description of functionality
- Screenshots if applicable
README Template
Include a comprehensive README with your extension:
# My Extension
> Brief tagline describing your extension
## Features
- Feature 1
- Feature 2
- Feature 3
## Installation
Install from Volt's Extension Browser or manually:
1. Download the latest release
2. Open Volt Settings → Extensions
3. Click "Install from file" and select the ZIP
## Usage
Trigger the extension by typing:
- `keyword` - Basic usage
- `keyword option` - With option
### Examples
```
keyword 16 → Does something with 16
keyword custom → Does something custom
```
## Configuration
| Option | Default | Description |
| --------- | ------- | ----------- |
| `option1` | `true` | Description |
## Requirements
- Volt v0.4.0 or higher
## License
MIT © Your NameVersioning
Follow Semantic Versioning:
| Change Type | Version Bump | Example |
|---|---|---|
| Bug fixes | PATCH | 1.0.0 → 1.0.1 |
| New features (backwards compatible) | MINOR | 1.0.0 → 1.1.0 |
| Breaking changes | MAJOR | 1.0.0 → 2.0.0 |
Updating Your Extension
Create New Release
git add .
git commit -m "Release v1.1.0"
git tag my-extension-v1.1.0
git push origin main --tagsUpdate Registry
Submit a PR to update the downloadUrl and version in registry.json.
Community Guidelines
- Be responsive to issues and feedback
- Keep your README up to date
- Add a CHANGELOG.md for tracking changes
- Follow the Code of Conduct
- Test thoroughly before releasing updates
Troubleshooting
Extension not loading?
Common issues and solutions:
| Issue | Solution |
|---|---|
| Extension not appearing | Check manifest.json is valid JSON |
| "Invalid manifest" error | Verify all required fields are present |
| Extension crashes | Check browser console for errors |
| ZIP won't install | Ensure files are at root level, not in a subfolder |