Add your extension
You can add your extension to this gallery as part of your build automation using one of these methods:
- GitHub Actions (recommended)
- PowerShell
- AppVeyor
Use GitHub Actions
GitHub Actions is the recommended way to build and publish your Visual Studio 2026 extension. It provides free CI/CD directly in your GitHub repository.
Create a file at .github/workflows/build.yaml in your repository with the following content:
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
name: "Build"
permissions:
actions: write
contents: write
on:
push:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:
jobs:
build:
outputs:
version: ${{ steps.vsix_version.outputs.version-number }}
name: Build
runs-on: windows-latest
env:
Configuration: Release
DeployExtension: False
VsixManifestPath: src\source.extension.vsixmanifest
VsixManifestSourcePath: src\source.extension.cs
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Setup .NET build dependencies
uses: timheuer/bootstrap-dotnet@v1
with:
nuget: 'false'
sdk: 'false'
msbuild: 'true'
- name: Increment VSIX version
id: vsix_version
uses: timheuer/vsix-version-stamp@v2
with:
manifest-file: ${{ env.VsixManifestPath }}
vsix-token-source-file: ${{ env.VsixManifestSourcePath }}
- name: Build
run: msbuild /v:m -restore /m /p:OutDir=\_built
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ github.event.repository.name }}.vsix
path: /_built/**/*.vsix
publish:
if: ${{ github.event_name == 'push' || github.event_name == 'workflow_dispatch' }}
needs: build
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Download Package artifact
uses: actions/download-artifact@v4
with:
name: ${{ github.event.repository.name }}.vsix
- name: Upload to Open VSIX
uses: timheuer/openvsixpublish@v1
with:
vsix-file: ${{ github.event.repository.name }}.vsix
- name: Publish extension to Marketplace
if: ${{ github.event_name == 'workflow_dispatch' || contains(github.event.head_commit.message, '[release]') }}
uses: cezarypiatek/VsixPublisherAction@1.0
with:
extension-file: '${{ github.event.repository.name }}.vsix'
publish-manifest-file: 'vs-publish.json'
personal-access-code: ${{ secrets.VS_PUBLISHER_ACCESS_TOKEN }}
Key GitHub Actions
- timheuer/bootstrap-dotnet - Sets up MSBuild and .NET dependencies
- timheuer/vsix-version-stamp - Auto-increments VSIX version number
- timheuer/openvsixpublish - Publishes to Open VSIX Gallery
- cezarypiatek/VsixPublisherAction - Publishes to VS Marketplace
Real-world examples using GitHub Actions:
Use PowerShell
First you must execute the VSIX script
(new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iexThat allows you to call methods upload the .vsix extension file to the gallery.
Vsix-PublishToGallery
That will find all .vsix files in the working directory recursively and upload them. To specify the path, simply pass it in as the first parameter:
Vsix-PublishToGallery .\src\WebCompilerVsix\**\*.vsix
Use AppVeyor
AppVeyor is a build server hosted in the cloud and it's free.
After you've created an account, you can start doing automated builds. A really nice thing is that AppVeyor can automatically kick off a new build when you commit code to either GitHub, VSO or other code repositories.
To automatically upload your extension to vsixgallery.com when the build has succeeded, all you have to do is to add an appveyor.yml file to the root of your repository. The content of the file should look like this:
version: 1.0.{build}
install:
- ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex
before_build:
- ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion
build_script:
- msbuild /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m
after_test:
- ps: Vsix-PushArtifacts | Vsix-PublishToGallery
You might want to check out these real-world uses:
Unlisted extensions
An unlisted extension is one that you need to know the direct link to, otherwise it won't show up anywhere. The only places it will show up are:
- Direct link (example: vsixgallery.com/extension/[ID])
- Author page
- Author gallery feed
- Extension gallery feed
That means it won't show up in the usual places on this website such as:
- Front page
- Search results
- Main gallery feed
To unlist an extension, simply add the tag "unlisted" in the .vsixmanifest file. The tags specified in the .vsixmanifest are not shown on either the Open VSIX Gallery nor inside Visual Studio, so it won't be visible to anyone.
Here's what it could look like:
<Tags>foo, bar, unlisted</Tags>